
Servicio XPC simulado de macOS/iOS vulnerable a la deserialización de NSKeyedUnarchiver, además de una demostración del exploit y un payload plist manipulado para lograr RCE mediante deserialización insegura.
#!/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 servicio XPC en macOS/iOS deserializa los mensajes Mach entrantes utilizando NSKeyedUnarchiver sin una lista blanca de codificación segura. Un atacante puede elaborar un gráfico de objetos serializados que ejecuta código arbitrario durante la deserialización.
NSKeyedUnarchiver con datos no confiables y sin una lista blanca de clases, lo que permite la instanciación de objetos que desencadenan la ejecución de código (p. ej., NSInvocation).python vulnerable_xpc_service.py
python exploit_xpc.py