In this article
コードセキュリティ監査の基礎
現代のソフトウェア開発において、コードセキュリティ分析は「治療より予防」という考え方に基づく重要な取り組みです。コードセキュリティ監査はコード品質を向上させるため、あらゆる組織にとって有効なDevSecOpsの実践方法です。
コードセキュリティ監査とは?
コードセキュリティ監査(ソフトウェアセキュリティ監査、ソフトウェアコード監査とも呼ばれます)とは、ソースコードを分析したり、プログラムの実行時に検査したりして、セキュリティ上の脆弱性、ライセンスのコンプライアンス違反、その他のプログラミング上の問題を発見するプロセスです。コードセキュリティ監査の主な利点は、ソフトウェアのリリース前に問題を特定し、ユーザーへの影響を防げることです。DevSecOpsとセキュアコーディングの実践に欠かせない要素であり、一般にサイバーセキュリティ、法務、コンプライアンス上のリスクを確認するために実施されます。
コードセキュリティ監査ツールの導入は、一般にDevOpsチームが担当します。組織にDevSecOpsチームがある場合は、そのチームも担当します。また、静的コード分析ではソースコードを直接スキャンするため、脆弱性の可能性について知見を提供できる開発者が少なくとも1人参加すると効果的です。
コードセキュリティ監査の種類
監査で最も一般的なのは、静的コード監査と動的コード監査の2種類です。
静的コード監査は、静的コード分析とも呼ばれ、単にスキャンと呼ばれることもあります。脆弱性を見つけるためにソースファイルを調べる手法です。言い換えれば、自動化されたコードレビューであり、コーディング規約、コードの書式、コードの脆弱性など、さまざまな観点に焦点を当てることができます。
業界で最も広く利用されているコードセキュリティ監査は、コードの脆弱性に重点を置いた静的解析です。この記事では、これを主なテーマとして取り上げます。さまざまなセキュリティ監査の種類についてはこちらをご覧ください。
コード監査が重要な理由
コードセキュリティ分析を怠ると、リスクにさらされることになります。脆弱性の検出を目的としたコードスキャンは、静的解析の最も重要な機能とされています。長期的に、デプロイ済みソフトウェアへのサイバー攻撃を防ぐのに役立つためです。ソースコードをスキャンする信頼性の高いパイプラインを構築すれば、脆弱性を発見してすぐに対処でき、攻撃者に狙われる可能性のある時間を短縮できます。
以下で説明するように、法的問題やコンプライアンス上の問題もリスクとして対処する必要があります。
オープンソースの分野では、オープンソースの静的コード分析やオープンソース監査を含む静的コード分析も、ベストプラクティスとされています。
コードセキュリティ監査で確認すべきこと
コードセキュリティ監査は、利用するコードベースに合わせて調整する必要があります。まず確認すべき一般的な脆弱性には、次のようなものがあります。
入力値の検証/SQLインジェクション
サードパーティ製ライブラリ
ハードコードされた認証情報
脆弱な暗号化方式
SSL/TLSのバージョン
メモリオーバーフロー
コンプライアンス
ライセンス
プロジェクト固有のチェック
それぞれについて、詳しく見ていきましょう。
1. 入力値の検証/SQLインジェクション
SQLインジェクションは、最もよく使われるサイバー攻撃手法の1つです。SQLクエリを使ってアプリケーションを欺き、悪意のあるSQLトランザクションを実行させます。よくある手口は、Webページの入力欄にSQLコードを注入する方法です。これにより、攻撃者が権限のないデータにアクセスしたり、データを削除したりできる場合があります。静的コード分析では、SQLを注入される可能性のある箇所を特定して、こうした攻撃を防ぐのに役立ちます。
2. サードパーティ製ライブラリ
サードパーティ製ライブラリは、現代のソフトウェア開発に欠かせない要素です。開発者は、他者が作成してテストしたコードを再利用することで、チームの効率を高め、主要なビジネス目標により集中できます。
一方で、サードパーティ製ライブラリには脆弱性が存在する可能性があります。ただし、ソースコード分析を使って、すべてのライブラリを毎日チェックすることで、こうしたリスクを軽減できます。
3. ハードコードされた認証情報
一般に、APIキーやパスワードをソースコードにハードコードすることは固く禁じられています。しかし、新しい機能やインテグレーションをローカルでテストしているときに、ハードコードした認証情報を削除し忘れることがあります。
コードレビューでハードコードされた値が見落とされた場合でも(非常に大きなマージ/プルリクエストの場合など)、静的コード分析ツールなら検出して警告できます。
4. 脆弱な暗号化方式
安全なアプリケーションでは、広く普及している古いアプリケーションで使われてきたものであっても、安全でない暗号アルゴリズムの使用を禁止すべきです。たとえば、MD5ハッシュアルゴリズムの使用は避け、アプリケーションに応じて、より安全なSHA-256を使用できます。
5. SSL/TLSのバージョン
SSL/TLS暗号化(最新バージョンはTLS 1.3)は、インターネットセキュリティに不可欠な手段です。たとえば、コードベースで非推奨のTLS/SSLバージョンを使うHTTPサーバーを実行している場合や、さらに深刻なケースとして、レガシーコードがTLS/SSLを使わずにプライベートではないネットワーク上でWebサーバーを実行している場合、静的コード分析でそれを検出して警告できます。
6. メモリオーバーフロー
メモリオーバーフローは、メモリバッファが設定された境界を越えたときに発生します。その結果、次のメモリ領域が上書きされる可能性があります。メモリを容易に操作できるCやC++などの言語で、より発生しやすい問題です。
適切なセキュアコード分析を行えば、ソースコード内のメモリオーバーフローを検出できることが多く、危険な実行時の動作を防げます。組み込み、産業用、高速処理向けの開発では、必須の対策です。
7. コンプライアンス
業界によっては、ISOなどの規格への準拠が求められます。たとえば、ISO 270001やISO 26262では、ソフトウェアの認証に必要な具体的要件が定められています。静的コード分析は、顧客データ管理に関するSOCや、決済業界のアプリケーションに関するPCIなど、その他の規制への準拠確認にも役立ちます。静的コード分析を使うことで、現在のコードが準拠しているかを確認し、新たに追加するコードも準拠していることを確かめられます。
8. ライセンス
現在のソフトウェアプロジェクトの多くは、外部のソフトウェアライブラリに依存しています。コードの再利用は、ソフトウェア開発者にとって大きなメリットです。外部ライブラリ(モジュールやフレームワークなど)のほとんどには、ライセンス情報(MIT、GPL、BSDなど)が付属しています。
商用利用も含めて完全に無料で使えるライセンスもあれば、料金が必要なものもあります。依存関係を解析することで、静的コード分析を使って外部ライブラリのライセンスに準拠しているかを確認できます。これにより、組織が法的措置を受ける可能性を抑えられます。
9. その他
コードセキュリティ監査では、コーディング規約への準拠やコードの書式など、さらに多くの項目を確認できます。セキュリティ監査ツールを使ってコードレビューの一部を自動化することは、セキュアコードレビューの実践にも役立ちます。最も重要なのは、組織に大きな影響を及ぼす可能性があり、実際に存在する可能性も高い種類の脆弱性を、コードセキュリティ監査でスキャンすることです。
たとえば、データベースに接続しないC言語の組み込みシステムのコードベースに取り組んでいる場合、SQLインジェクションの優先度は低いでしょう。一方、メモリオーバーフローのチェックは重要です。
コードセキュリティ監査にはどのようなツールを使えますか?
コードセキュリティ監査に利用できるテストツールには、次のようなものがあります。
静的アプリケーションセキュリティテスト(SAST):ソースコードを解析して問題を見つけます。
動的アプリケーションセキュリティテスト(DAST):アプリケーションを実行し、アプリケーションの侵入テストなどの手法を使ってアプリケーションセキュリティを評価します。
ソフトウェア構成分析(SCA):オープンソースの直接依存関係と間接依存関係に含まれる脆弱性を調べます。
自動スキャンとレポート
CI/CDパイプライン(GitHub Actions、GitLab、Jenkinsなど)にコードスキャンを組み込むことは、推奨されるベストプラクティスです。ほとんどの最新のCI/CDツールでスキャンを自動実行でき、手動スキャンよりもはるかに効率的です。自動スキャンは、必要なときにのみ実行されるため、時間と労力を節約し、人的ミスによる問題を防ぎます。
状況に応じて、プル/マージリクエストのたびにスキャンを実行すると、コードベースの脆弱性を防ぐ効果的な方法になります。リモートデータベースには新たな脆弱性が絶えず追加されるため、24時間ごとに分析を実行するcronジョブを設定することも推奨されます。
コードベースの問題をチームが早く把握できるほど、迅速に修正して他の脅威を回避できます。ソースコードで見つかった脆弱性にすばやく対応するには、問題の検出時にアラートが送られるように設定することが重要です。CI/CDにアラート機能を組み込むのは簡単です。たとえば、静的解析パイプラインが失敗したことを知らせるメールを送る方法があります。
コードセキュリティ監査ツールの選び方
静的解析ツールやセキュリティ監査ソフトウェアを選ぶ際は、次の基準を検討しましょう。
プログラミング言語:コードベースで使用しているプログラミング言語に対応したツールを選びましょう。静的解析ツールの中には複数の言語に対応するものもあり、すべてのコードベースを1つのツールでカバーできます。
主要機能:適切なツールを選ぶうえで重要なのは、組織やコードベースに関係するリスクに対応できることです。業界や要件によっては、ISO準拠をチェックするツールが不要な場合もあります。また、環境やプログラミング言語によっては、メモリオーバーフローが問題にならないこともあります。
CI/CDとのインテグレーション:ほとんどのツールはCI/CDに簡単に統合できます。スキャンプロセスの自動化において重要なポイントです。
IDEとのインテグレーション:IDEに統合されたツールなら、ボタンをクリックするだけで開発者のIDEからスキャンを実行できます。コミット前にスキャンが実行されるよう設定することも可能です。
コードセキュリティ監査を始める
ソースコード分析はセキュアコーディングの実践における重要な要素です。サイバーセキュリティ監査と組み合わせて、あらゆるサイバーリスク管理プログラムに欠かせない取り組みとして実施しましょう。
JavaScriptやGoなど、複数の最新プログラミング言語に対応するSnyk Codeは、コード内の脆弱性を直接検出します。Snyk Open Sourceは、プロジェクトの依存関係を分析し、脆弱性を自動的に検出します。
次のLog4jに備えましょう。Snykの開発者ファーストなツールでコードベースを保護し、セキュリティの脅威を防ぎましょう。無料で登録するか、デモを予約してください。無料のオンラインコードチェッカーツールを試して、Snyk Codeエンジンがコードのセキュリティと品質の問題をどのように分析するかをご確認ください。