セキュリティはほとんどの組織にとって大きな懸念事項ですが、Jtest/dotTEST では、近年ソフトウェアコードセキュリティを向上させる静的解析ルールの新規追加に力を入れており、最新版では CWE 4.2/4.4 や CWE Top 25 2020 、OWASP Top 10 2017 をサポートしています。
本記事では、Jtest/dotTEST に最近追加されたセキュリティルールをご紹介します。
静的解析でセキュリティ脆弱性検出をされたい方はぜひご一読ください。
静的解析とは
まず、静的解析とはソースコードを実行せずに実装の内容や構造から様々なデータを分析する技術です。特に、ソースコードを解析して特定のコーディングパターン (コーディングルール) に違反している箇所を指摘する、コーディングスタンダード解析、データフローや制御フローを解析するフロー解析があります。
静的解析のメリットとして「テスト対象を動作させないで実行できる」という点が挙げられます。テスト対象を動作させずにできるということは、ソフトウェア開発の早い段階から実行できることにつながるため、結果的に開発生産性の向上や、開発期間の短縮といった効果が期待できます。
新規に追加されたセキュリティルールの紹介
Jtest/dotTEST に最近追加されたセキュリティルールの一部をご紹介します。
Jtest
- ログ ファイルに書き込む関数に機密データを渡さない [BD.SECURITY.SENSLOG]
- メモリ割り当サイズの決定に使用する前に、汚染されている可能性があるデータを検証する [BD.SECURITY.TDALLOC]
- コードを生成するメソッドで使用する前に、汚染されている可能性があるデータを検証する [BD.SECURITY.TDCODE]
- 信頼されていないデータを HTTP セッションに格納しない [BD.SECURITY.TDSESSION]
- Seam Logging API を使用してメッセージをログに記録する場合、信頼されていない入力を使用しない [SECURITY.UEHL.DCEMSL]
- 外部プロセスが出力またはエラー ストリームをブロックするのを防ぐ [SECURITY.WSC.BUSSB]
- HTTP リクエスト ヘッダーから取得した IP アドレスに基づいて認証を行わない [SECURITY.WSC.HTTPRHA]
- オリジン間リソース共有をセキュアなオリジンだけに制限する [SECURITY.WSC.JXCORS]
- 必ず実行コマンドへの絶対パスを指定する [SECURITY.WSC.PBRTE]
- 使用する前にショートカットのターゲット パスを検証する [SECURITY.WSC.LNK]
- シンボリック リンクの解決によって取得されるファイルのターゲット パスが安全であることを確認する [SECURITY.WSC.FOLLOW]
dotTEST
- 偽装されたユーザーのコンテキストを必ず元のユーザーの情報に戻す [BD.SECURITY.IDENTITY]
- ログ ファイルに書き込む関数に機密データを渡さない [BD.SECURITY.SENSLOG]
- メモリ割り当サイズの決定に使用する前に、汚染されている可能性があるデータを検証する [BD.SECURITY.TDALLOC]
- コードを生成するメソッドで使用する前に、汚染されている可能性があるデータを検証する [BD.SECURITY.TDCODE]
- 保護されていない認証情報の使用から保護する [BD.SECURITY.TDPASSWD]
- 機密情報をログに記録しない [SEC.ALSI]
- 運用コードで Trace.Assert() メソッドを使用しない [SEC.ATA]
- 必ず実行コマンドへの絶対パスを指定する [SEC.PBRTE]
- 2048 ビット以上の RSA キーを使用する [SEC.RSAKS]
- 例外に機密データを含めない [SEC.SDE]
- 使用する前にショートカットのターゲット パスを検証する [SEC.VLT]
- Web.config ファイルで anti-XSS 防御を有効化する [SEC.WEB.AXSSE]
- Web.config ファイルで Content Security Policy を有効化する [SEC.WEB.CSP]
- HttpClient オブジェクトを作成することで HttpClient クラスをインスタンス化しない [SEC.WEB.UHCF]
本記事では、これらのルールの中からコードを生成するメソッドで使用する前に、汚染されている可能性があるデータを検証する [BD.SECURITY.TDCODE]の具体例をご紹介します。
ルールの概要
このルールは、汚染されている可能性があるデータを動的評価の呼び出しまたは コード セグメントを構築するメソッドで使用している場合に違反をレポートします。
ソフトウェアがユーザーの入力にコード構文を許可している場合、攻撃者が コードを細工し、ソフトウェアの意図された制御フローを変えることができる 場合があります。このような変更は、恣意的なコードの実行につながる可能性が あります。[CWE-94]
コード インジェクション攻撃は、ほとんどすべてのケースでデータの完全性の毀損に つながります。なぜなら、制御面で挿入されたデータは、常にデータの読み取りまたは 書き込みに付随するからです。さらに、コード インジェクションは多くの場合、恣意的な コードの実行につながります。[CWE-95]
関連資料
- OWASP API Security Top 10-2019 API8-Injection
- 2020 CWE Top 25 Most Dangerous Software Errors / CWE-94: Improper Control of Generation of Code (‘Code Injection’)
- CWE-95: Improper Neutralization of Directives in Dynamically Evaluated Code (‘Eval Injection’)
コード例 (Java)
脆弱性あり
WEB アプリケーションにおいて外部から入力されたデータを検証 (バリデーション) せずに org.springframework.expression.ExpressionParser に渡します。入力されたデータが悪意のあるデータであった場合、アプリケーションが意図しない評価式を作成、アプリケーション内でその評価式が利用されます。
Jtest 検出結果
修正例
入力されたコードのバリデーションを行い、インジェクションの対策を行います。
まとめ
アプリケーション開発においてセキュリティの脆弱性は切り離すことができない課題です。
今回ご紹介したセキュリティルールを静的解析で利用すると効率的にセキュアコーディングの推進、ソースコードのセキュリティを確保することができます。
静的解析におけるセキュリティ検出のメリットついてはこちらの記事でもご紹介しています。ぜひ合わせてご確認ください。
Parasoft Jtest について
Parasoft dotTEST について
dotTEST は、C#言語VB.NET言語対応した静的解析・動的解析テストツールです。製造業・医療・金融など幅広い業界において、Windows アプリケーション・Web アプリケーションなどのさまざまな.NET アプリケーションの開発に用いられています。