
Service XPC macOS/iOS simulé vulnérable à la désérialisation NSKeyedUnarchiver, avec démonstration d'exploitation et payload plist conçu pour une RCE via une désérialisation non sécurisée.
#!/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()
Un service XPC sur macOS/iOS désérialise les messages Mach entrants à l'aide de NSKeyedUnarchiver sans liste blanche de codage sécurisé. Un attaquant peut élaborer un graphe d'objets sérialisé qui exécute du code arbitraire lors de la désérialisation.
NSKeyedUnarchiver est utilisé avec des données non fiables et sans liste blanche de classes, permettant l'instanciation d'objets qui déclenchent l'exécution de code (par exemple, NSInvocation).python vulnerable_xpc_service.py
python exploit_xpc.py