JINSテックブログ
🔍

SASTをはじめてみよう

2025/02/12に公開

ごあいさつ

はじめまして、2025年1月にJINSにJOINした石田です。
前職までは、SIerでのWebアプリケーション開発や脆弱性診断を経て、事業会社の情報システム担当 兼 セキュリティ担当として立ち回っていました。
JINSではお客様向けのサービスおよび組織内のセキュリティ運用・向上施策に幅広く関わっていくべく、日々勉強中です。

導入:脆弱性診断の悩み

アプリケーションをリリースする前に脆弱性診断を受ける組織は多いと思います。一般にリリース前の脆弱性診断は開発・テスト工程の終盤に行われます。なぜなら、アプリケーションが動作しない状態では診断ができないからですね。

アプリケーションが(ほぼ)完成した段階での脆弱性診断。その結果、重大な問題が見つかってしまうと改修の手戻りがとても大きくなります。最悪の場合には改修が間に合わずリリースを延期しないとならない…なんて事態にも陥りかねません。

SAST

そこで求められるのが、より早い段階で問題を検出し改修すること。その検出手法のひとつとして挙げられるのが 静的アプリケーションセキュリティテスト(SAST) です。新しい話題ではないので「もうやれている」組織も多い一方で、「まだこれから」の組織もあるのではないでしょうか。

SASTはソースコードそのものを解析して脆弱性を見つけるテスト手法です。そのため、アプリケーションを動作させる環境ができあがっていなくても、また、テスト用のログインIDやデータの準備もなく実施することができます。このテスト手法は、例えば「脆弱性診断士スキルマッププロジェクト」による「アジャイル開発におけるセキュリティ|パターン・ランゲージ」では「 セキュリティテストを効率よく実施する 」解決策の1つとして取り上げられています。

SASTの機能を謳う製品は多数存在し、また、その実行方法も複数用意されています。本記事では、その 実行方法のバリエーション を中心にSASTを取り上げてみます。製品はいくつかある候補の中から「Snyk」を利用させていただきました。本記事での実行結果を得るにはSnykのアカウント作成が必要です。

テスト用コードの用意

SASTを実行するため、まずはコードを用意します。今回はChatGPTに簡単なサンプルとして、ユーザーから指定されたURLへアクセスし、RSSを取得・変換するAPIのコードを書いてもらいました。

プロンプトと提案されたコードは以下の通り。本題ではないので折りたたみます。

プロンプトと提案されたコード

ChatGPTに書いてもらった様子です。

少しだけ中身を見ておきましょう。
指定されたURLへGETリクエストでアクセスして、結果をパースして…、

取得結果からコンテンツのタイトル、URL、概要、公開日の4項目を抽出しています。

スクリーンショットに載っていない箇所でエラーが発生したため部分的に修正したものの、ビジネスロジックは提案されたコードのまま変更せずに、Lambdaにデプロイして動かしてみました。
RSS風のXMLをホストしたURLを渡してあげたところ、以下の通りJSONに変換された結果が返ってきます。実利用に耐えられるものではありませんが、動くコードであることは確認できました。

それではこのコードを対象にSASTを実行してみましょう。

実行方法① IDEに組み込む

まずはJetBrainsやEclipseなど、開発で利用しているIDEへの組み込みです。Snykの場合はIDEにプラグインを導入することで実行可能です。

ここではIDEとしてVisual Studio Codeを利用し、先ほど生成されたコードを含むプロジェクトを開きました。Snykのプラグインを導入すると、以降はソースコードを保存するたびに自動でSASTが実行されます。

結果の見え方

Visual Studio Code上での見え方です。アクティビティバーにSnykのボタンが増え、テスト結果がツリー状で表示されます。検出事項は全部で1件、Mediumレベルの問題として「XML External Entity (XXE) Injection」が検出されたことが分かります。

検出結果の一覧表示だけでなく、コード中の該当箇所に波線が引かれ、マウスオーバーすることでも結果が表示されます。

ポイント

この方法の良い点は、まさにコードを書いているIDEの中でと、 とにかく早い段階で問題が検出される ことでしょう。検出結果を確認してコードを直し、検出されなくなったことの確認も即座に行えます。

実行方法② ソースコード管理ツールに組み込む

GitHubやGitLabなどのソースコード管理ツールとSASTを連携することもできます。SnykではSCM Integrationという呼び方をしています。

今回はAtlassianが提供しているBitbucket Cloudを利用してみました。SnykとBitbucket Cloudとの連携方法はSnyk User Docsに記載されており、管理画面上でボタンを押していくだけで完了します。

結果の見え方

テスト結果はSnykの画面上に表示されます。取り込まれたプロジェクトが一覧表示され、「Code analysis」の項目に先ほどと同様にMediumレベルの問題が1件検出されています。ソフトウェアコンポジション分析(SCA)も同時に実行されるためpom.xmlが表示されていますが、ここでは割愛します。

もちろん具体的な該当箇所も表示されます。「Full details」ボタンからより詳細な情報にもアクセスできました。

ポイント

この方法ではソースコード管理ツールに保管されたコードに対する実行結果が表示されるため、コードを書いた本人だけでなく、 プロジェクトの関係者が検出状況を把握しやすい ですね。複数のプロジェクトを横断して確認できる点も良いです。

また、実行方法①と比べたメリットとして、管理ツール1カ所に組み込めば良い点も挙げられるでしょう。複数人のプロジェクトの場合、実行方法①では開発者全員のIDEに設定が必要です。

実行方法③ CLIで実行する

ここまで自社での開発プロセス中に検査をする想定で例を挙げましたが、SASTを実行したい人が開発者でなかったり、組織によっては自社で開発をしていない場合も考えられます。例えば、開発を外部委託しており、納品されたコードをチェックしたい、などです。

このような場合でも、コードが手元にあればローカルで検査することができます。Snykの場合はWindows、macOS、Linux向けにSnyk CLIが提供されています。Windowsであればsnyk-win.exeファイルを入手し、パスを通すことで利用開始できます。

結果の見え方

Windowsのコマンドプロンプトでコードが保存されたフォルダへ移動し、コマンドを実行した結果です。実行方法①②と同じ脆弱性が見つかりました。Snyk CLIの場合、表示される結果は脆弱性の存在するコードの行番号と簡易な説明のみで、具体的なコードの記述などは表示されませんでした。

ポイント

CLIはローカルでの実行にとどまりません。 CI/CDパイプラインにCLIを組み込む ことで、実行条件を指定する、検出結果に応じて何らかの処理を行うなど、柔軟で強力な使い方ができます。

SASTのメリットとデメリット

3つの実行方法いずれでも同じ結果が得られたことを確認してきました。冒頭でも触れたように アプリケーションが動作する環境が無くても実行でき、テスト用のデータ準備も不要 な点はSASTの大きなメリットでしょう。また、各実行結果でも見てきたように コード上の問題がある箇所を具体的に示してくれる 点も優れています。

一方のデメリットは 「本当に脆弱性があるのか」判断しづらい 点だと思います。誤検知がまったく無いわけではありませんので、確証を得るにはSASTの検出結果の説明文とコードの処理を見比べて調べたり、実際に動作させての確認が必要となってきます。

なお、今回はSnykで検出された「XML External Entity (XXE) Injection」の脆弱性が実際にあることを確認しています。この脆弱性はXMLの構文を悪用するもので、ファイルの参照やSSRF、DoSなどの様々な問題に発展しうるものです。例えば「/etc/passwdを参照するように細工したXML」をホストしたURLを読み込ませた場合に、以下の通りの結果が返ってくることを確認できました。

おわりに

本記事では実行方法のバリエーションを中心にSASTを紹介しました。どれか1つではなく、組み合わせて利用することもできるでしょう。また、SASTはアプリケーションのコードだけでなく、IaCに対しても有効です。

もちろん、SASTですべての種類の脆弱性が検出されるわけではありません。ほかのテスト手法や脆弱性診断とも組み合わせて活用していくことが大切です。自組織に合った方法で、アプリケーションが安全かチェックできる仕組みを作っていきましょう。

また、今回は生成AIに書いてもらったコードを利用しました。生成AIの利用は世の中全体で広がっており、開発においても高速化・効率化が図れるようになってきています。その一方で、提案されたコードが必ずしも安全ではないことの認識はもって、便利に使っていければと思います。

JINSテックブログ
JINSテックブログ

Discussion