はじめに

セキュリティ脆弱性による企業、ひいては社会全体への影響はますます増大し、システム開発におけるセキュリティ要求は日々高度化しています。

このような状況の中でセキュリティリスクを抑えるためには、継続的なセキュリティ診断と問題への対応が必要です。

本レポートでは、開発工程でのセキュリティ対策、そしてそこで有用なツールとなるFind Security BugsとIPAのセキュリティ実装 チェックリストに対するカバー範囲について説明します。

シフトレフトについて

脆弱性を埋め込まないためには、要件定義・設計段階から十分なリスク分析・対策を検討することが必要ですが、脆弱性がないかどうかは最終的にはテスト工程で検証する必要があります。

アプリケーションのセキュリティテストとしては、以下のような対策を取ることが多いでしょう。

  • セキュリティ有識者によるソースコードレビュー
  • ツールによるペネトレーションテスト

ただし、これらの対策には以下のような課題があります。

  • レビューができるセキュリティ有識者を、プロジェクトの都合に合わせて継続的に確保することが困難
  • 特にペネトレーションテストは開発工程終盤に実施されることが多く、脆弱性が発見された場合に対応期間を確保することが困難
  • 検出結果の対応要否の切り分けにセキュリティに関する知識が求められるが、その知識を持つ技術者が少ない

これらのレビューやテストは、プロジェクト外の有識者やリソースに頼ることも多いでしょう。この場合、プロジェクト単独でセキュリティ診断をすることが困難になります。 DevOpsによる継続的なサービス改善のサイクルを回している場合、これらの課題がサービス改善の速度を損なうことも考えられます。

継続的にセキュリティを担保するためには、開発工程の早い段階からセキュリティテストを実施し(シフトレフト)、脆弱性を早期に検出することが望ましいでしょう。

もちろん、脆弱性にはアプリケーションの実行環境に起因するものもあるため、すべての脆弱性が開発工程の初期で検出できるとは限りません。 とはいえ、アプリケーションのソースコードに起因する脆弱性については、早い段階で検出・修正しておくことが可能です。そうすることで、手戻りの防止や品質向上に役立ちます。

このような要求の助けになるものとして、ソースコードを解析、診断するツールがあります。 ツールを活用することで、セキュリティ有識者によるソースコードレビューに伴う課題を軽減できます。

アプリケーションのソースコードを解析するツールには様々なものがありますが、ここではFind Security BugsというOSSツールをご紹介します。

Find Security Bugsは、EclipseやIntelliJといったIDEに容易に組み込め、コーディング段階で脆弱性に関する高速なフィードバックを 返せます。
また、CIに組み込むことで、Find Security Bugsが検出した脆弱性を修正しない限り、マージさせないという運用も可能になります。
このようにシフトレフトを実現することで、より安全なアプリケーションを開発しやすくなります。

Find Security Bugsの概要

Find Security Bugsは、Javaプログラムを静的解析する SpotBugs のプラグインです。OWASPのプロジェクトの1つで、オープンソース(LGPLライセンス)にて提供されています。

Java WebアプリケーションおよびAndroidアプリケーションを主な対象として、SQLインジェクションやクロスサイトスクリプティング などの脆弱性を検出できます。

Bugs Patternsと呼ばれる検出ルールで脆弱性を検出しており、2021年3月現在、Find Security Bugs 1.11.0では 138のBugs Patternsが定義されています。

Find Security Bugsの検出ルールに関する調査

IPAセキュリティ実装 チェックリストとの対応表作成について

Find Security Bugsで定義されている検出ルールは Bugs Patterns に記載されています。
ただ、この一覧だけでは一般的に問題とされる脆弱性のどの程度をカバーしているのかがわかりにくかったため、以下のチェックリストに対する対応表を作成しました。

セキュリティ実装 チェックリスト」は、 IPA にて公開されている 安全なウェブサイトの作り方 改訂第7版 の巻末資料です。

セキュリティ実装 チェックリストに対するFind Security Bugsのカバー範囲は、 IPAにより公開されている セキュリティ実装 チェックリスト に独自に項目を追加、編集したものです。

Find Security Bugsのバージョンは1.11.0をベースとしています。


本レポートでは、IPAの安全なウェブサイトの作り方 改訂第7版の巻末資料とのカバー範囲をまとめています。

一方で、Find Security Bugsの Bugs Patterns のページでは、各Bug Patternに関するReferenceも付属しています。
Referenceに記載されているリソース等の一部を以下に記載します。

個別のBug Patternに対するもののため一覧性はありませんが、Bug Pattern自体の説明と合わせて参照すると、どのような脆弱性と関連しているか確認できるでしょう。

対応表を作成してみてわかった、セキュリティツール導入における注意点

上記対応表を作成する中でわかった、セキュリティツール導入にあたって注意すべき点について以下に記載します。

パターンマッチングによる制約に注意が必要

Find Security Bugsはソースコードの静的解析ツールであり、あらかじめ組み込まれた一定のコードパターン(APIシグネチャ)に該当するかどうかをチェックするものです。

たとえば、Find Security BugsにはSQL_INJECTIONというBug Patternが用意されています。 しかし、このBug Patternが検知するのは、java.sql.Statement.executeQueryなどのFind Security Bugs内でリストアップされているAPIのみです。

そのため、独自フレームワークを使用している場合など、リストアップされていないAPIでSQLを発行していた場合、Find Security Bugsでは検知できません。

これはFind Security Bugsに限らず、コードパターンとのマッチングを行う形式(パターンマッチング方式)の セキュリティツール全般に共通することです。
静的解析によるセキュリティツールを導入する際には、「解析対象のアプリケーションのフレームワークにツールが対応しているか」「カスタマイズにより拡張可能か」などを検討する必要があるでしょう。

静的解析ツール以外のセキュリティツールの併用も検討

対応表でグレーアウトしている箇所は、Find Security Bugsでは検知できない事象です。

たとえば、セキュリティ対策として効果のあるHTTPヘッダをWebサーバーで設定したり、SSL/TLSの終端をアプリケーションの前段に配置するロードバランサで設定することもあるでしょう。
このように、実際に動作させないと対策ができているかわからないようなものは、静的解析では検知・対応が困難です。

そのため、必要に応じて、動作しているアプリケーションに対してアプリケーション脆弱性を診断・解析する「動的解析ツール」を併用することが望ましいでしょう。

なお、OSSの動的解析ツールとしてはOWASP ZAPがよく知られています。

Find Security Bugsの導入方法

一度、自分が開発しているアプリケーションのセキュリティをチェックしてみたいという方のために、Mavenに組み込む場合の手順を紹介します。

pom.xmlの変更

pom.xmlに以下の設定を追記してください。

[...]
<build>
    <plugins>
        [...]
        <plugin>
            <groupId>com.github.spotbugs</groupId>
            <artifactId>spotbugs-maven-plugin</artifactId>
            <version>4.2.0</version>
            <configuration>
                <effort>Max</effort>
                <threshold>Low</threshold>
                <failOnError>true</failOnError>
                <plugins>
                    <plugin>
                        <groupId>com.h3xstream.findsecbugs</groupId>
                        <artifactId>findsecbugs-plugin</artifactId>
                        <version>1.11.0</version>
                    </plugin>
                </plugins>
            </configuration>
        </plugin>
    </plugins>
</build>

解析

以下のコマンドにより解析します。

mvn compile
mvn spotbugs:spotbugs

ℹ コード解析前にコンパイルしておく必要があるため、mvn compileを実行しています。

解析結果の確認

実行結果はtarget配下にspotbugsXml.xmlというXMLファイルで出力されます。検出内容はGUIで確認できます。

mvn spotbugs:gui

Maven以外のツールやCIへの導入方法

ドキュメントのTutorial、またはGitHubのWikiに導入手順が記載されていますのでご参照ください。

まとめ

本レポートでは、開発工程でのセキュリティ対策として役立つFind Security BugsというOSSツールと、IPAのセキュリティ実装 チェックリストに対するカバー範囲について紹介しました。

静的解析ツールは万能ではありませんが、ツールによりソースコードに内在する脆弱性を早く検知できれば、後工程での手戻りのリスクは軽減できるでしょう。

また現在はソースコードレビューで十分というプロジェクトでも、ツールによってレビューにかける体力を減らせれば、エンドユーザーにとってより価値のある活動に注力できるようにもなるでしょう。

多層防御を基本とするセキュリティの分野において、「これを導入すれば良い」という決定打はありません。 しかし、ソースコードに潜む脆弱性を検知する点についてFind Security Bugsはプロジェクトの大きな助けになるはずです。本レポートがプロジェクトのセキュリティ対策高度化の一助になれば幸いです。


本コンテンツはクリエイティブコモンズ(Creative Commons) 4.0 の「表示—継承」に準拠しています。

本コンテンツ内に記載されている会社名、製品名は、各社の登録商標または商標です。