
NSKeyedUnarchiverによるデシリアライゼーションに対して脆弱なシミュレートされたmacOS/iOS XPCサービスと、安全でないデシリアライゼーションを利用したRCEのエクスプロイトデモおよび細工済みplistペイロード。
#!/usr/bin/env python3
# vulnerable_xpc_service.py - Simulated XPC service using unsafe plist deserialization
import plistlib, subprocess, socketserver, struct
# Mach message simulation: we just accept a binary plist over TCP.
class XPCHandler(socketserver.BaseRequestHandler):
def handle(self):
raw = self.request.recv(4096)
# Insecure: using plistlib.loads on untrusted data without sanitization
plist_data = plistlib.loads(raw) # In real macOS, NSKeyedUnarchiver can execute code
# Simulate a command being embedded in the plist
command = plist_data.get("runCommand")
if command:
subprocess.Popen(command, shell=True)
self.request.sendall(b"Success")
server = socketserver.TCPServer(('localhost', 8888), XPCHandler)
print("Vulnerable XPC service on :8888")
server.serve_forever()
macOS/iOSのXPCサービスは、セキュアコーディングの許可リストなしにNSKeyedUnarchiverを使用して、受信したMachメッセージを逆シリアル化します。攻撃者は、逆シリアル化時に任意のコードを実行するシリアル化されたオブジェクトグラフを細工できます。
NSKeyedUnarchiver が信頼できないデータとクラスホワイトリストなしで使用され、コード実行をトリガーするオブジェクト(例: NSInvocation)のインスタンス化が可能になる。python vulnerable_xpc_service.py
python exploit_xpc.py