JavaScriptセキュリティを強化する、ジェダイに学ぶ3つの教訓
2022年5月4日
0 分で読めます『スター・ウォーズ』はマニア向けの映画だと思っているかもしれません。しかし、開発者のセキュリティ対策に活かせる深い人生の教訓があるとしたらどうでしょう?ライトセーバーを手に、JavaScriptセキュリティの世界へ飛び込みましょう!
『スター・ウォーズ』は、ジョージ・ルーカスが脚本・監督を務めた壮大な宇宙を舞台とする映画シリーズで、改めて紹介するまでもないでしょう。私自身もファンで、映画シリーズに登場するジェダイの騎士たちの名言には、共感できるものがたくさんあります。
お察しのとおり、私は伝説のジェダイ・マスター、ヨーダの大ファンです。彼の教えの多くは人生、そしてアプリケーションセキュリティに通じる深い教訓だと信じています。
「やってみるのではない。やるか、やらぬかだ。試しなどいらん」—ヨーダ、『スター・ウォーズ エピソード5/帝国の逆襲』
新しいことを始めるのは、時に大変に思えるものです。特に、慣れた領域や自分の専門外に踏み出す場合はなおさらです。アプリケーションセキュリティもそう感じるかもしれませんが、完璧を目指すより、まずは実践することに集中しましょう。
セキュアコーディングのレビューを実施すべきでしょうか?それとも動的なアプリケーションセキュリティテストだけでよいのでしょうか?開発者ワークフローの事前フックでシークレットを検出すべきでしょうか、それともGitHubアプリを使って統合すべきでしょうか?CIパイプラインにセキュリティテストを統合するには、どんなツールが必要でしょうか?
疑問は尽きません。だからこそ、映画のヨーダの言葉が好きなのです。「やるか、やらぬかだ。試しなどいらん」。セキュアコーディングの実践は、どんな小さな一歩でも踏み出すことが大切です。セキュリティを何層にも重ねる、いわゆる多層防御が重要なのです。
手間をかけずに今日から導入できる、実用的なJavaScriptセキュリティツールをご紹介します。
ESLintを使ってJavaScriptのコードベースにおけるトロイの木馬型ソースコード攻撃を効果的に検出・軽減したいですか?eslint-anti-trojan-sourceのGitHubリポジトリで、簡単なインストール方法と使い方を確認し、なぜ重要なのかをブログ記事でご覧ください。
npmやyarnのロックファイルを日常的に使っている方も多いでしょう。しかし、npmのロックファイルは、悪意あるモジュールを混入させる攻撃の見落としにつながる可能性があることをご存じですか?lockfile-lintプロジェクトを確認して、リンターのツール群に加えてみましょう。
Dependency Confusionと呼ばれるオープンソースのサプライチェーン攻撃により、Fortune 500企業からデータが流出した事例をご存じですか?同様の問題を防ぐため、CIに
snyncを組み込みましょう。オープンソースのセキュリティ脆弱性を、Snykなら簡単に修正できます。
npm install -g snykでSnyk CLIを起動し、npmのrunスクリプトにsnyk testのステップを追加するだけです。GitHubリポジトリをSnyk UIにインポートすれば、新たな脆弱性に関する通知をタイムリーに受け取れるほか、静的コード解析や、Terraform、Kubernetesプロジェクト、DockerコンテナのDockerfileなどのマニフェストファイルのスキャンも利用できます。自分のコードだけでなく、サードパーティ製の依存関係にある脆弱性情報も受け取りませんか?Snyk IDE extensionを使えば、コーディングしながらレビューできるため、セキュリティ対策を効果的かつスムーズに進められます。

「目は欺かれる。目を信じるな」—オビ=ワン・ケノービ、『スター・ウォーズ エピソード4/新たなる希望』
率直に言って、プログラミングは難しいものです。コードを書くのも難しいですが、読むのはさらに難しい。ただ、書く量より読む量のほうが多いため、コードを読むスキルは長い目で見れば大きな力になります。
開発者は、ロジックやコードスタイルに見られる特定のパターンを見つける訓練を重ねています。そうしたパターンは、コードの意味を理解し、そこから外れた誤りに気づく助けになります。しかし、コードセキュリティに関するパターンを探すことは、しばしば忘れがちです。
セキュリティ分析が行われていなかったために、誰かが気づくまで何年も存在し続けた脆弱性もあります。昨年公表された、Linuxのsudoプログラムにおける重大度の高い脆弱性CVE-2021-3156は、その好例です。sudoedit -sコマンドを使ってrootスーパーユーザーへの権限昇格を可能にするこの脆弱性は、広く使われているオープンソースプロジェクトの中に、10年間も人目につかず潜んでいました。
同じような見落としを避けるために、JavaScriptプロジェクトのセキュリティを強化するヒントをいくつかご紹介します。
セキュアコーディングレビューを実践しましょう。コードベースのどこに注目すべきかについては、Trisha GeeとBrian Vermeerによるセキュリティコードレビューのベストプラクティス8選をご覧ください。
Go開発者は、インジェクション攻撃や危険なユーザー入力に注意しましょう。こうした一般的なルールに加えて、Eric SmallingとGerred DillionによるGoのセキュリティに関する実践的なベストプラクティスも参考にしてください。役立つヒントやテクニックが満載です。
npmエコシステムに悪意あるモジュールが多数持ち込まれる原因となっているタイポスクワッティング攻撃を回避する方法を学びましょう。
人気が高そうに見えても、健全性を示す情報が乏しいnpmパッケージは避けましょう。たとえば、人気のNode.js用HTTPクライアント
requestは、週に約2,000万回ダウンロードされています。この数字だけを見ると信頼できる選択肢だと思うかもしれませんが、最終コミットとリリースから2年が経ち、メンテナーによって非推奨とされています。パッケージの健全性を示す情報を詳しく知り、最新の状態を保つにはSnyk Advisorをご利用ください。

「見るのは難しい。常に動いているのが未来だ」—ヨーダ、『スター・ウォーズ エピソード5/帝国の逆襲』
アプリケーションセキュリティは、常に変化する課題です。ソフトウェアは急速に進化し、それに伴ってセキュリティ研究も進み、新たな脆弱性が発見されます。ソフトウェアエコシステムの成熟度と普及が進むほど、セキュリティ研究者の注目を集める可能性も高まります。オープンソースモジュールからなるJavaScriptのnpmエコシステムは、その好例です。
GitリポジトリにSnykを統合する理由は何でしょうか?今あるコードベースのセキュリティ脆弱性をすべて修正できたとしても、今後発見されるすべてのCVEやセキュリティ脆弱性を追い続けるのは不可能です。幸い、Snykがその手助けをします。ソースコードリポジトリをSnykに接続すると、毎日のスキャンで監視され、新たな脆弱性が見つかった際に通知されます。推奨される修正がある場合、Snykがリポジトリにプルリクエストを自動で作成します。リスクを軽減するために必要なのは、コード変更を確認してマージすることだけです。

5年前には、プロトタイプ汚染は一般的ではありませんでした。しかし現在では、ECMAScript標準におけるプロトタイプ継承の特性に起因して、影響を受けるJavaScriptプロジェクトを頻繁に目にします。新たな脆弱性を予測できないことに加え、時間にも余裕がないため、セキュリティの知識を常に最新に保つのは大変です。そんなときに役立つのがSnyk Learn resource hubです。完全無料で、登録も不要。Snyk Learnは、アプリケーションセキュリティの概念を短く学べるコンテンツに特化しています。Java、JavaScript、Pythonなど、お好みの言語エコシステムに合わせてレッスンを選ぶこともできます。

最後に、楽しいMay the 4thを!フォースとともにあらんことを!



