サイバー攻撃手法・脆弱性分析 重要度:★★出題: AM2・PM1
安全でないデシリアライゼーション と XXE (XML外部実体参照)
あんぜんでないでしりあらいぜーしょん / えっくすえっくすいー / Insecure Deserialization / XML External Entity (XXE)
信頼できない外部データをオブジェクトに復元(デシリアライズ)する際にマジックメソッド等が悪用されて任意コードが実行される脆弱性と、XML解析時に外部ファイル読込等を発生させるXXE脆弱性。
3行速習ポイント
- デシリアライゼーション攻撃:JavaやPHP、Python(pickle等)の独自シリアライズ形式を外部から改ざんして渡すことで、復元時にガジェットチェーンが発火しRCE(遠隔コード実行)に至る
- XXE(XML External Entity):XMLデータのDOCTYPE宣言内でSYSTEM識別子(file:///etc/passwd や http://内部IP/)を定義し、XMLパーサにサーバ内ファイルや内部通信を読み取らせる攻撃
- 対策はデータ交換にJSON等のデータ専用フォーマットを用いること(または署名検証)、XMLパーサ設定で外部実体参照(External Entity)とDTD処理を明示的に無効化すること
図解
図安全でないデシリアライゼーション と XXE(XML外部実体参照)の対策
安全でないデシリアライゼーション対策直列化オブジェクト保護
信頼できないバイト列のオブジェクト復元によるRCEを阻止
Java SerializationやPython pickle等の独自オブジェクト直列化形式を外部通信・Cookieに使わずJSONを採用。不可欠な場合は復元前にHMAC署名検証を実施
XXE (XML External Entity) 対策XMLパーサ安全設定
DOCTYPE内のSYSTEM識別子による内部ファイル読取・SSRFを阻止
XMLパーサの初期化設定において、DTD(文書型定義)および外部実体参照(External Entity)の解決機能を明示的に無効化(falseに設定)する
💡 外部から入力されるデータに対しては、コード実行やファイル参照の副作用を持たない純粋なデータ構造(JSON等)と安全なパーサ設定を適用する
概要と本質
プログラム内部のオブジェクト状態をそのままバイト列やXMLに変換してCookieや通信ボディでやり取りする設計で発生します。特にレガシーなJavaアプリやSOAP/XML連携、ファイルインポート機能(docx/xlsxやSVG等の実体はXML)で狙われやすい脆弱性です。
重要ポイント・コア概念
- デシリアライズ対策:外部から受け取るデータにはオブジェクト直列化形式(Java SerializationやPython pickle)を使わず、JSON等の純粋なデータ構造を使用する。やむを得ない場合はHMAC署名で改ざん防止とクラスホワイトリスト制限を行う
- XXE対策:XMLパーサの初期化時に DTD(Document Type Definition)および外部エンティティの解決機能を false(無効)に設定する
- SSRFへの発展:XXEで http://169.254.169.254/ 等のURLを外部実体として指定されると、SSRFと同様に内部ネットワーク探索やメタデータ窃取に悪用される
午後記述・情報セキュリティ対策での攻略ポイント
午後試験のセキュア開発・ソースコード診断で「XMLパーサの設定不備によるファイル漏洩(XXE)」「Cookieに保存したシリアライズオブジェクトの改ざん」として出題されます。
午後記述で使える加点キーワード(クリックでコピー)
関連する重要用語
この用語が出題された過去問を解く(1分演習)
即時アウトプットで定着情報処理安全確保支援士 過去問演習で実践力を鍛える