CXX.SV.XXE

エンティティの解決の試行を無効にする関数呼び出しがありません

XML 攻撃に対して脆弱なアプリケーション

アプリケーションは、XML 攻撃の一種である XML 外部エンティティ (XXE) 処理に対して脆弱であってはなりません。

脆弱性とリスク

XML 外部エンティティ処理は、アプリケーションが XML 入力を解析するときに発生する可能性があります。XML パーサーの構成が脆弱である場合、アプリケーションで外部エンティティへの参照が処理されることがあります。そうした外部エンティティ処理により、機密データの漏えいやサーバーサイドリクエストフォージェリなどの重大な問題、およびサービス拒否などの重大度が低い問題が発生する場合があります。

軽減と防止

一般的な軽減策は、XML 入力を読み取る XML パーサーが外部エンティティに従う (エンティティ解決) ことがないように構成することです。XML パーサー API を見直し、この動作がどのように無効にされているか確認してください。

脆弱コード例

コピー
void funSAXParser(const char *file_name)
{
SAXParser parser;
parser.parse(file_name);   //CXX.DISA.XXE
}

この例では、Klocwork が 4 行目で CXX.DISA.XXE 欠陥を報告し、XML ファイルの解析にフラグが付けられています。SAXParser API の setDisableDefaultEntityResolution() エンティティが呼び出されないため、外部エンティティの解決をコードで防ぐことができません。

修正コード例

コピー
void funSAXParser(const char *file_name)
{
SAXParser parser;
parser.setDisableDefaultEntityResolution(true);
parser.parse(file_name);   //no DISA.XXE since entity resolution has been disabled
}

SAXParser オブジェクトのデフォルトの (脆弱な) 動作では、外部エンティティの解決が許可されます。修正コード例では、setDisableDefaultEntityResolution() API が引数 true で呼び出されているため、Klocwork は欠陥を報告しません。resolveEntity() メソッドが呼び出されるときに、パーサーが外部エンティティの解決を試行しません。

関連チェッカー