静的コード解析について
静的コード解析とは何ですか?また、使用すべきタイミングを教えてください。
ソフトウェアの基本的な構成要素の一つは、コード品質です。ソフトウェアの品質向上は、高品質のコードによって可能になります。コードの品質は、アプリの安全性、安定性、信頼性と相関します。品質を維持するために、多くの開発チームは、コードレビュー、自動テスト、手動テストなどの手法を取り入れています。
コードレビューや自動化テストは、高品質なコードを作成する目的で重要とはいえ、ソフトウェアのすべての問題を発見できるわけではありません。コードレビューの実施や自動化テストの作成は人間が行うため、バグやセキュリティの脆弱性が本番環境に入り込んでしまうことはよくあります。
クラウドネイティブアプリケーションセキュリティの現状レポートによると、クラウドネイティブ環境におけるセキュリティインシデントは、設定ミスとパッチが適用されていない既知の脆弱性が最も多いとのことです。
ソースコード解析を行えば、本番環境でよく発生する問題の半数を防ぐことができます。不適切なコードで問題が発生してから問題を解決するより、ソフトウェア開発ライフサイクルの早い段階で静的コード解析による品質保証を組み込み、コーディング基準を適用する方が優れたアプローチとなるはずです。
静的コード解析とは
ソースコード解析または静的コードレビューとも呼ばれる静的コード解析は、ソフトウェアのソースコードを実際に実行せずに、不適切なコーディングスタイル、潜在的な脆弱性、およびセキュリティ上の欠陥を検出するプロセスで、ホワイトボックステストの一形態です。
静的コード分析により、手動のコードレビューやコンパイラなどの他のテスト方法やツールでは見逃されがちなコードのバグや脆弱性を検出できます。
すばやいフィードバックループは、DevOps 開発の重要な理念です。静的コード解析は、すばやい自動フィードバックループを導入し、放置すると深刻な問題につながりかねない不具合を検出するのに役立ちます。
静的コード解析は、コードスタイルのチェックに役立つだけでなく、静的アプリケーションセキュリティテスト (SAST) にも利用できます。
静的コードアナライザーはソースコードを解析して、以下の点をチェックします。
コードの問題とセキュリティの脆弱性
ドキュメントの品質
ソフトウェア全体の設計とフォーマットの一貫性
プロジェクト要件、コーディング基準、プログラミングのベストプラクティスの準拠
プログラムの実行や、複雑性や保守性などのソフトウェアシステムの機能以外の品質面に影響を与える規則や慣行の違反
次に、ソフトウェア開発プロセスの一部に静的コード解析を組み込むべき理由について説明します。
静的コード解析 (SCA) と静的アプリケーションセキュリティテスト (SAST) の比較
静的アプリケーションセキュリティテスト (SAST) では、静的コード解析を適用してセキュリティ上の問題を発見します。一般に、静的コード解析は、スタイル、フォーマット、品質、パフォーマンス、またはセキュリティの問題など、さまざまな種類の問題の発見に使用できます。SAST ツールは、セキュリティ上の問題を高い精度で発見できるよう特別に設計されており、偽陽性・偽陰性率が低く、発見された脆弱性の根本原因や改善策に関する詳細な情報を提供できます。
ソースコード解析を行うべき 6 つの理由
DevOps プロセスの一部として静的コード解析を実施する場合、自動化レビュープロセスのメリットがいくつかあります。
1\.コストを削減し、時間を短縮できる
ソースコードの解析は、実際にコードを実行しなくてもコードエラーを特定できるという点で、他のテスト手法とは異なります。 開発段階が進むにつれて、問題の修正コストは指数関数的に膨らみます。静的コードレビューにより、開発からコードレビューおよびテストまでのチームの時間と労力を節約できます。また、コードの問題やバグを早期に検出できるため、予想外の出費を何百万ドルも節約できます。
2\.コードセキュリティを改善できる
ソフトウェア開発者にとって、コードセキュリティは大きな関心事です。最近では、ほとんどすべてのものがソフトウェアで行われているため、最新のアプリケーションに共通する潜在的な脆弱性 (不十分な暗号化、リソースリーク、安全でないインタフェース、バッファオーバーフローなど) について、常にコードを解析する必要があります。静的コード解析は、コードを記述した時点で、セキュリティ上の欠陥がないかどうかを自動的にチェックし、データの漏洩の防止に貢献します。開発の初期段階からセキュリティを組み込むことで、下流のセキュリティ脅威に対するコストもリスクも大幅に削減できます。
3\.不具合発生率を低減できる
静的コード解析ツールを使用すると、コードの問題やバグがソフトウェアシステムのリリースバージョンに入り込む前に検出でき、ソフトウェアの不具合を減らすことができます。また、ソースコード解析は、構造的な不具合の再発防止にも有効です。これを活用して不具合を防止し、最終的にはソフトウェア開発ライフサイクル全体でコードの不具合を減らすことができます。非常に複雑でセーフティクリティカル、またミッションクリティカルなソフトウェアシステムを開発する場合、不具合を早期に検出する機能は極めて重要になります。1 つの欠陥が重大な結果をもたらし、死亡、負傷、またはシステム障害につながる可能性があるからです。
4\.プロセスを簡素化できる
静的コード解析を DevOps や自動化 CI/CD ワークフローに組み込むことで、コードレビューの作業負荷を軽減し、開発者の時間を他の重要なタスクに振り向けることができます。また、開発者が優れたプログラミングの習慣を身につけ、優れたコードを作成し、失敗から学び、将来的に同様のコード問題を回避するために必要なフィードバックを正確かつタイムリーに提供することができます。
5\.複雑で大規模なコードベースに伴うリスクを軽減できる
ソフトウェアシステムが真のビジネス価値の実現にとって欠かせない存在になるにつれ、コードベースは複雑化し、急激に拡大しています。通常、大規模なコードベースは、新規のコードと修正したレガシーコードの両方で構成されます。コードを変更して再利用すると、ソフトウェア開発コストを削減できますが、バグが発生するリスクも高まり、コードの受け渡しも煩雑になります。
たとえば、多くの若手エンジニアは、コピーしているコードの効果を評価することなく、StackOverflow などの様々な Web サイトからコードをコピーしています。静的コード解析は、このような複雑さとそれに伴うリスクに対処するのに役立ちます。新規コードとレガシーコードをプロジェクトに追加する前に分析できます。静的コード解析は、社内外の両方の開発チームに開発基準を適用する手段となります。
6\.継続的改善
静的コード解析は、コードエラーを早期に発見し、一般的な開発ワークフローでコードの改善の可能性を調べるのに役立ちます。これにより、欠陥率が低下し、コードをソースコードリポジトリにプッシュする前に開発者が行うコード変更の品質を高めることができます。さらに、静的コードレビューは、手動で検出するのが困難なコードの欠陥を発見するのに役立ちます。つまり、品質、スピード、正確性を犠牲にすることなくソフトウェアを開発できるようになります。
静的コード解析は、コードの品質とアプリケーションのセキュリティを向上させ、コードの不具合を最小限に抑えつつ、下流のコストと時間を削減する効果的な方法になります。
以下のセクションでは、静的コード解析ツールを選ぶ前に調べておく必要がある確認事項について説明しています。
静的コード解析ツールを選択する
静的アプリケーションのセキュリティテストは、長足の進歩を遂げています。最新の SCA ツールの多くは、DevOps やアジャイルワークフローに統合され、複雑で大規模なコードベースを分析できます。これは、カバレッジが向上し、混乱や中断が少なく、アプリケーションの安全性が高まっていることを意味しています。
ただし、すべての静的コード解析ツールで堅牢な機能が提供されているわけではありません。たとえば、環境やプラットフォームに依存しないものもあります。また、対応するフレームワークや言語が限定されるものなどがあります。このセクションでは、アプリケーションのセキュリティに役立つ静的コード解析ツール、主に SAST ツールの選び方を解説しています。
静的アプリケーションセキュリティテストにおいて、ツールの選択は、開発環境、セキュリティ予算、既存のツール、フレームワーク、コードベースのサイズ、言語、開発ワークフローなど、様々な要因に依存します。開発者の不満や追加コストを最小限に抑えながら生産性を高めるには、適切な静的コード解析ツールを選択することが重要です。
ここでは、オープンソースツールやエンタープライズツールを選択する際に考慮すべき点をいくつか紹介します。
開発者ファーストのツールか
業界のコーディング基準に対応しているか
有料か、無料か
セットアップや使い方が難しいか
結果はどの程度正確か
レポートやアラート機能はあるか
使用するプログラミング言語に対応しているか
分析結果の実用性や信頼性はどうか
コードやセキュリティの脆弱性のサマリーを提供しているか
既存のソフトウェア開発プロセスとの連携はどうか
2023 年のオープンソース静的コード解析ツール:
ここで、主なオープンソースの静的コード解析ツールをいくつかご紹介します。ここに掲載するツールは完全にオープンソースか、無料バージョンが用意されています。
Snyk Code: 無料プランで利用できる Snyk Code は、Python、Java、JavaScript、C++ など各種言語に対応する、開発者ファーストの SAST ツールです。Snyk は、開発者がコーディングする時点で動作し、コードベースへの脆弱性の侵入を防ぐために必要な情報を提供しています。
Bandit: Bandit は、Python コードに共通するセキュリティ問題を発見するために設計されたオープンソースツールです。
Brakeman: Ruby アプリケーション用に設計された無料の脆弱性スキャナです。
Spotbugs: Spotbugs (旧「FindBugs」) は、Javaコードのバグや脆弱性を発見できる、よく知られたオープンソースコード解析ツールです。
Graudit: Graudit は、GNU ユーティリティ Grep を使用してソースコードのセキュリティ欠陥を検出できる、スクリプトと署名セットです。
それでは、SAST ツールを DevSecOps パイプラインに統合する方法を見ていきましょう。
静的コード解析を活用する
ほとんどの開発チームは、手作業でローカル環境のコードを静的に分析することから始めます。ただし、時間の経過とともに、コンプライアンスの確保などのボトルネックが明らかになり、特にコントリビューターが分散しているオープンソースプロジェクトではそうなりがちです。
そこで、静的アプリケーションセキュリティテストを DevSecOps パイプライン全体に統合することは、コンプライアンスを確保するための一つの方法となります。Snyk Code のような SAST ツールは、DevSecOps ライフサイクル全体で強固に統合され、オープンソースのセキュリティの脆弱性が含まれる可能性のある OSS コンテナ、ライブラリ、ソフトウェア、その他のアーティファクトのセキュリティリスクを識別するために必要な最高レベルのカバレッジを提供できます。
MongoDB チームが活用したツールについて、以下のコメントが寄せられています。
「Snyk を導入する前は、オープンソースに対するアプローチは時間と手間がかかっていました。いくつかの製品をリリースする前には何度も手作業でチェックを行い、他の製品に対しては小規模なツールセットを使用していました。
当社のセキュリティチームは、市販されているいくつかの SAST ソリューションを評価し、最終的に Snyk Code を採用しました。自動対策、開発者ファーストのアプローチ、使いやすさ、すばやい導入、GitHub 等の開発者ツールやワークフローに直接統合できることがその理由です」。
ローカルで静的にコードをチェックするだけでは不十分です。SAST も CI/CD パイプラインに組み込む必要があります。これにより、パイプライン全体ですべてのアプリのポートフォリオに対してコードレビューを自動化でき、持続可能で安全なアプリケーションを開発できるからです。
次に、適切なツールを選択する必要があります。ほとんどの SAST ツールは精度が低く、スキャンに時間がかかり、誤検出が非常に多く、開発者の信頼を損なっています。効果性に欠け、スピードや敏捷性が阻害されます。誤検出が多すぎると、チームはアラートに注意を払わなくなります。
開発者にとって使いやすく、誤検知が少なく、高速な信頼性の高い最新の SAST ツールを導入することが大切です。
開発者のためのスペルチェッカーともいわれる Snyk Code は、静的コード解析ツールで、他の SAST ツールより 10 ~ 50 倍も速くセキュリティ脆弱性をスキャンし、セマンティック解析を活用してコードのパフォーマンスとセキュリティバグを調べ、ほぼゼロの誤検知で開発者が作業しやすく、効率的に修正できるようにしています。
適切な SAST ツールを採用してパイプラインに統合することで、パイプラインにセキュリティを組み込み、本番環境に入り込むことの多い脆弱性や問題から保護することができます。