安全でないデシリアライズ
アプリケーションが外部から受け取ったデータをデシリアライズしてオブジェクトを復元する処理に関して,安全でないデシリアライズの脆弱性への対策として,最も適切なものはどれか。
- アシリアライズしたデータを送受信する通信を TLS で暗号化し,通信経路上でのデータの改ざんを防止する。
- イ信頼できない入力には言語固有のオブジェクト直列化形式を用いず JSON などのデータだけを表す形式を用い,やむを得ず用いる場合は,HMAC による改ざん検証や復元できるクラスの許可リスト化を行う。
- ウデシリアライズによって復元したオブジェクトの各フィールドの値を検証し,不正な値を含むオブジェクトを破棄する。
- エシリアライズしたデータを Base64 で符号化してから送受信し,データの内容を攻撃者に読み取られないようにする。
正解と解説を見る
正解 イ
この問題の基礎知識
- シリアライズはオブジェクトを保存や送信のためにバイト列などの形式に変換すること,デシリアライズはそれを元のオブジェクトに復元することである。
- 言語固有の直列化形式では,復元の過程でデータが指定するクラスのオブジェクトが生成され,そのメソッドが自動的に呼び出されるので,既存のクラスを組み合わせたガジェットチェーンによって任意のコードを実行され得る。
- TLS が防ぐのは第三者による通信途中での盗聴や改ざんであり,攻撃者自身が送るデータは防げない。Base64 は誰でも元に戻せる符号化であり,暗号化ではない。
アシリアライズしたデータを送受信する通信を TLS で暗号化し,通信経路上でのデータの改ざんを防止する。
この脆弱性では攻撃者自身が細工したシリアライズデータを送信するので,通信路を暗号化しても防げない。TLS が防ぐのは第三者による通信途中での盗聴や改ざんである。
イ信頼できない入力には言語固有のオブジェクト直列化形式を用いず JSON などのデータだけを表す形式を用い,やむを得ず用いる場合は,HMAC による改ざん検証や復元できるクラスの許可リスト化を行う。正解
言語固有の直列化形式では,復元の過程で任意のクラスが生成され,そのメソッドが自動的に呼び出されるので,ガジェットチェーンによって任意のコードが実行され得る。データだけを表す形式の採用や,改ざん検証,復元できるクラスの限定によって攻撃の前提をなくす。
ウデシリアライズによって復元したオブジェクトの各フィールドの値を検証し,不正な値を含むオブジェクトを破棄する。
攻撃コードはデシリアライズの処理中に,復元されるオブジェクトのメソッドが自動的に呼び出されることで実行される。復元後に値を検証しても,その時点では既に任意のコードが実行されている可能性があるので,対策として不十分である。
エシリアライズしたデータを Base64 で符号化してから送受信し,データの内容を攻撃者に読み取られないようにする。
Base64 は誰でも復元できる符号化方式であり,秘匿性も改ざん検知の機能もない。攻撃者は細工したシリアライズデータを Base64 で符号化して送り込めるので,対策にならない。
検証用の出典出典照合済み
OWASP Deserialization Cheat Sheet / CWE-502 Deserialization of Untrusted Data照合の根拠(5 件)
- イ(正解): 言語固有の直列化形式を避け JSON などのデータだけを表す形式を用いる
A great reduction of risk is achieved by avoiding native (de)serialization formats. By switching to a pure data format like JSON or XML, you lessen the chance of custom deserialization logic being repurposed towards malicious ends.
OWASP Deserialization Cheat Sheet · Using Alternative Data Formats(新しいタブで開きます) - イ(正解): HMAC による改ざん検証
For example, a hash-based message authentication code (HMAC) could be used to ensure that data has not been modified.
CWE-502 · Potential Mitigations(新しいタブで開きます) - イ(正解): 復元できるクラスの許可リスト化
Configure serialization filters with an application-specific class allowlist and resource limits before reading objects.
OWASP Deserialization Cheat Sheet · Java(新しいタブで開きます) - ウ(誤り): コードはデシリアライズ処理中に実行され得るので,復元後の検査では遅い
Execution can occur within certain .Net types during deserialization. Creating a control such as the one shown below is ineffective.
OWASP Deserialization Cheat Sheet · .Net CSharp(新しいタブで開きます) - ウ(誤り): ガジェットはデシリアライズの過程で自動的に実行される。ア・エ(誤り): 攻撃者自身が細工したデータを送るので,通信路の暗号化や Base64 符号化では防げない(正解の根拠から論理的に排除)
Avoid having unnecessary types or gadgets (a sequence of instances and method invocations that can self-execute during the deserialization process, often found in libraries) available that can be leveraged for malicious ends.
CWE-502 · Potential Mitigations(新しいタブで開きます)