ソースコード静的解析とは
ソースコード静的解析とは、アプリケーションプログラムの「元」となる「ソースコード」を解析し、さまざまな情報を得ることを指します。アプリケーションを実行することなく解析を行うので「静的」解析と呼びます。
ソースコード静的解析では、次のようなことを知ることができます。
- ソースコードがコーディングルールに従っているか。例えば関数名・変数名・クラス名などのつけ方やインデントのルールなど
- ソースコードの数値的指標(メトリックス)。例えば関数やクラスの長さや、分岐(if文など)やループ(for/while文など)がどれだけ多重になっているかを示す「複雑度」といった指標があげられる
- ソースコードに含まれる不適切な実装。つまり「バグ」や「脆弱性」を引き起こしうるもの。例えば、悪意のある入力に対して問題のある処理を行ったり、データの安全でない扱い
セキュリティの観点では、主に三つ目の「不適切な実装」を発見することがソースコード静的解析の目的となります。
セキュリティの観点においてソースコード静的診断を実施することのメリットは次のようなものがあります。
- 脆弱性が現時点で存在するかどうかではなく、将来の改修によって顕現するかもしれない「脆弱性が存在する可能性がある不適切な実装」を見つけることができる。
- 脆弱性の「種」がどこに含まれるのかをピンポイントで知ることができる。
- アプリケーションを実際に動かす必要がないため、アプリケーションが完成する前でも診断が可能。また、アプリケーションを動かすための環境を用意する必要もない。
ソースコード静的解析の仕組み
このように便利な面もあるソースコード診断ですが、では具体的にはどんな仕組みで診断を行うのでしょうか。
多くの場合、ソースコード静的解析にはそれ専用のツールを用います。特にセキュリティに着目した場合、こういったツールのことをSASTツール(Static Application Security
Testing;静的アプリケーションセキュリティテスト)と呼びます。SASTツールには特定のプログラミング言語専用のものもあれば、汎用のものもあります。汎用のものについても対応しているプログラミング言語は限定されているのが普通です。
SASTツールは主に以下のような手法でソースコードを解析します。
- 文字列による判定:例えば変数名が「password」という変数に即値が代入されている場合、これはパスワードのハードコードの可能性が高いと考えられます。単純な文字列の一致ではなく正規表現を用いることもあります。
- 構文解析:ソースコードをトークンや文法ルールといったものを用いて解析して、抽象構文木というものを作ります。
- フロー解析:上記の抽象構文木をもとに処理の流れ(フロー)をたどり、未初期化の変数の利用や確保したリソースの未開放、実装されているけれども実際には到達しないコード(dead
code)などを探します。
- 外部入力値の解析:例えばHTTPのリクエストパラメータで渡された値が、最終的にはどこで使われているかをフロー解析で確認することで、クロスサイトスクリプティング(XSS)などの脆弱性を探します。
SASTツールは非常に強力で便利な道具ですが、一方で過検知、つまり「脆弱性でないものを脆弱性として指摘する」ことが多いという問題もあります。例えば上で挙げた文字列による判定では、「password」という文字列を含む変数を軒並み指摘してしまう……といったものです。
そこでSASTツールをうまく使うには、このような過検知を適切に解析して脆弱性ではないという判断を人間が下すことが必要です。多くのSASTツールは一度過検知と判断されたものは2回目から脆弱性として報告しないという機能がありますので、このような機能を使いこなすことも大切でしょう。
2015年より株式会社SHIFTにてソフトウェアテスト自動化の顧客導入支援・プラットフォーム開発に従事。加えてSHIFT
SECURITY設立に兼務で参画し、初期の標準化や教育などを担当。2019年に同社専任になってからは、開発者向けのソフトウェアセキュリティサービス、スマートフォンアプリ診断手法および社内ツール開発などを主な業務とする。
個人としては主にデスクトップ領域のオープンソースソフトウェアの愛好家であり、翻訳やバグ報告、雑誌やWeb媒体への執筆、イベントへの登壇なども行う。隠れた趣味はリバーカヤック。