Veracode からフラグが立てられた CWE-201 の解決策を考案中です。
バックグラウンド:
CWE-201: 送信データによる情報漏えい
送信データによる情報 漏えい 弱点 ID: 201 (弱点バリアント) ステータス: ドラフト + 説明 説明 概要 送信データによる機密情報の偶発的な漏えいは、それ自体が機密であるか、またはさらなる悪用に役立つデータの送信を指します。標準データチャネルを介してシステム。
フェーズ: アーキテクチャと設計 戦略: 特権の分離 システムを区画化して、信頼境界を明確に描画できる「安全な」領域を確保します。機密データが信頼境界の外に出ることを許可しないでください。また、安全な領域の外にあるコンパートメントとやり取りするときは常に注意してください。適切な区画化がシステム設計に組み込まれていること、および区画化が特権分離機能を可能にし、さらに強化するのに役立つことを確認してください。アーキテクトと設計者は、最小特権の原則に基づいて、いつシステム特権を使用して削除するのが適切かを判断する必要があります。
その上...コードを書く人にとって一体何を意味するのか、私はJavaを使ってこの問題を解決する実用的な解決策を見つけようとしています。
私が言えることは、次のコードによりベラコードがcwe-201にフラグを立てるということです:
public void init(URL filePath) {
try {
load(new BufferedInputStream(filePath.openStream()));
} catch (java.io.IOException e) {
Log.error("Could not load server properties file!", e);
}
}
詳しくは:
フェーズ: 実装 要件で指定されている可能性のある機密データが設計者によって検証され、それが計算されたリスクであるか、他の場所で軽減されていることを確認します。機能に必要のない情報はすべて削除して、オーバーヘッドとセキュリティ機密データが送信される可能性の両方を下げる必要があります。
フェーズ: システム構成 予期しないエラーによって機密情報が開示されないように、デフォルトのエラー メッセージをセットアップします。
ここでIOExceptionを飲み込むカスタムランタイム例外を作成することにより、システム構成に記載されている推奨事項を実行しました...しかし、Veracodeはまだフラグを立てています。
そのコードは次のようになります。
public class CWE201Exception extends RuntimeException {
private static Logger log = ESAPI.getLogger(CWE201Exception .class.getName());
public CWE201Exception(String identifer, Throwable t){
log.error(Logger.SECURITY_AUDIT, identifer);
}
}
そして、メソッドを次のように更新しました。
public void init(URL filePath) {
try {
load(new BufferedInputStream(filePath.openStream()));
} catch (java.io.IOException e) {
throw new CWE201Exception("omgStillDoingThis", e);
}
}
veracodeレポートを調べたところ、次のことがわかりました。
攻撃ベクトル: java.net.URL.openStream
説明: アプリケーションが java.net.URL.openStream() 関数を呼び出すと、データがアプリケーションから (ネットワークまたは別のメディアを介して) 転送されます。このデータには機密情報が含まれています。openStream() が filePath オブジェクトで呼び出されました。このオブジェクトには機密データが含まれている可能性があります。潜在的に機密性の高いデータは、 java.lang.system.getpropertyへの以前の呼び出しに由来します。
修復:機密データの転送が意図されたものであり、アプリケーションのセキュリティ ポリシーに違反していないことを確認します。この欠陥は、機密性のみに影響し、整合性や可用性には影響しないため、重大度は低に分類されます。ただし、モバイル アプリケーションのコンテキストでは、特にユーザーの期待やデータ プライバシー ポリシーと一致していない場合、情報漏えいの重大性ははるかに大きくなる可能性があります。
質問 この方法でサーバーに常駐するプロパティ ファイルを読み取る場合、System.getProperties() を間接的に使用していることがわかります。
これをストリームとして公開することは、セキュリティ上の脅威と見なされます
そうは言っても、ベラコードが「安全」と見なす方法でアプリケーションが環境構成情報をロードできるように、プロパティファイルをロードする正しい方法は何ですか?