
خدمة XPC محاكاة لنظامَي macOS/iOS معرّضة لثغرة إلغاء تسلسل NSKeyedUnarchiver، بالإضافة إلى عرض توضيحي للاستغلال وحمولة plist مصمّمة بعناية لتنفيذ التعليمات البرمجية عن بُعد (RCE) عبر إلغاء تسلسل غير آمن.
#!/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()
تقوم خدمة XPC على macOS/iOS بإلغاء تسلسل رسائل Mach الواردة باستخدام NSKeyedUnarchiver بدون قائمة سماح بالترميز الآمن. يمكن للمهاجم إنشاء رسم بياني للكائنات مسلسل ينفّذ تعليمات برمجية عشوائية عند إلغاء التسلسل.
NSKeyedUnarchiver مع بيانات غير موثوقة وبدون قائمة بيضاء للفئات، مما يسمح بإنشاء كائنات تؤدي إلى تنفيذ التعليمات البرمجية (مثل NSInvocation).python vulnerable_xpc_service.py
python exploit_xpc.py