
Leitfaden zum Bau eines virtuellen iPhones unter Verwendung von VPHONE600AP-Komponenten aus Apples PCC-Firmware, mit Firmware-Patching, Bootchain-Modifikation und Kernel-Debugging für die iOS-Sicherheitsforschung.
Etwa Ende 2024 begann Apple, Private Cloud Compute einzuführen, und behauptete, einen neuen Horizont für cloudbasierte KI-Privatsphäre zu eröffnen. Dann, etwa Ende 2025, tauchten einige interessante Nachrichten auf: Apple hatte neu vphone600ap-bezogene Komponenten zur PCC-Firmware hinzugefügt, beginnend mit cloudOS 26.

Quelle: https://x.com/matteyeux/status/2006339694783848660/photo/1
"iPhone Research Environment Virtual Machine"?
Ist dies ein geplanter Schritt von Apple, eine virtuelle iPhone-Umgebung für andere Sicherheitsforscher zu erstellen und zu verteilen, oder war es einfach ein Fehler? Angesichts der Tatsache, dass der DEVELOPMENT/KASAN-Build-Kernel einmal in den iOS 15.0 Beta bis 15.1 Beta3 OTAs im Jahr 2021 entdeckt wurde, kann die Möglichkeit eines Ausrutschers nicht ausgeschlossen werden. Damals blieb der Kernel etwa 4 Monate lang enthalten, ungefähr von Juni bis Oktober 2021.
Dann wurde etwa im Januar dieses Jahres ein Tweet gepostet, der ein virtuelles iPhone zeigte, das unter Verwendung dieser vphone600ap-bezogenen Komponenten hochfährt.

Quelle: https://x.com/_inside/status/2008951845725548783

Nach dem, was ich sah, funktionierte fast alles wirklich elegant. Im Vergleich zu dem QEMUAppleSilicon(Inferno) project, das ich zuvor gesehen hatte, läuft es viel flotter und geschmeidiger. Darüber hinaus schien es sogar Metal-Beschleunigung zu unterstützen. Letztendlich, völlig davon gefesselt, tauchte ich ein und begann am 31. Januar mein eigenes virtuelles iPhone zu bauen.

Das referenzierte Projekt ist security-pcc. Es entspricht dem Quellcode des Binärprogramms /System/Library/SecurityResearch/usr/bin/vrevm. Ein interessanter Punkt ist, dass es private Methoden verwendet, die von Virtualization.framework bereitgestellt werden. In der für die PCC-Forschung verwendeten virtuellen Maschine kann man sehen, dass die ISA und PlatformVersion während des Initialisierungsprozesses des Hardwaremodells explizit angegeben werden.

Für das Bootrom wird AVPBooter.vresearch1.bin verwendet (/System/Library/Frameworks/Virtualization.framework/Resources/AVPBooter.vresearch1.bin)

und für das SEPROM (avpsepbooter) wird AVPSEPBooter.vresearch1.bin verwendet, das separat eine SEPStorage-Datei lädt, die ähnlich wie AuxiliaryStorage funktioniert. (/System/Library/Frameworks/Virtualization.framework/Versions/A/Resources/AVPSEPBooter.vresearch1.bin)
Ein weiterer interessanter Punkt ist, dass, wenn man sich den Code zum Einstellen der Auflösung ansieht, diese auf 1290x2796 gesetzt ist, was den Geräten iPhone 14 Pro Max, 15 Plus, 15 Pro Max und 16 Plus entspricht.

Mit diesen Informationen sollte es mehr als genug sein, um super-tart zu modifizieren, um das virtuelle iPhone zu booten. Ich habe die Änderungen wie unten gezeigt vorgenommen.
/Sources/tart/VM.swift```swift ... class VM: NSObject, VZVirtualMachineDelegate, ObservableObject { ... // vzHardwareModel derives the VZMacHardwareModel config specific to the "platform type" // of the VM (currently only vresearch101 supported) static private func vzHardwareModel_VRESEARCH101() throws -> VZMacHardwareModel { var hw_model: VZMacHardwareModel
guard let hw_descriptor = _VZMacHardwareModelDescriptor() else { fatalError("Failed to create hardware descriptor") } hw_descriptor.setPlatformVersion(3) // .appleInternal4 = 3 hw_descriptor.setBoardID(0x90) hw_descriptor.setISA(2) hw_model = VZMacHardwareModel._hardwareModel(withDescriptor: hw_descriptor)
guard hw_model.isSupported else { fatalError("VM hardware config not supported (model.isSupported = false)") }
return hw_model }
static func craftConfiguration( diskURL: URL, nvramURL: URL, romURL: URL, sepromURL: URL? = nil, vmConfig: VMConfig, network: Network = NetworkShared(), additionalStorageDevices: [VZStorageDeviceConfiguration], directorySharingDevices: [VZDirectorySharingDeviceConfiguration], serialPorts: [VZSerialPortConfiguration], suspendable: Bool = false, nested: Bool = false, audio: Bool = true, clipboard: Bool = true, sync: VZDiskImageSynchronizationMode = .full, caching: VZDiskImageCachingMode? = nil ) throws -> VZVirtualMachineConfiguration { let configuration: VZVirtualMachineConfiguration = .init()
// Boot loader let bootloader = try vmConfig.platform.bootLoader(nvramURL: nvramURL) Dynamic(bootloader)._setROMURL(romURL) configuration.bootLoader = bootloader
// SEP ROM let homeURL = FileManager.default.homeDirectoryForCurrentUser var sepstoragePath = homeURL.appendingPathComponent(".tart/vms/vphone/SEPStorage").path let sepstorageURL = URL(fileURLWithPath: sepstoragePath) let sep_config = Dynamic._VZSEPCoprocessorConfiguration(storageURL: sepstorageURL) if let sepromURL { // default AVPSEPBooter.vresearch1.bin from VZ framework sep_config.romBinaryURL = sepromURL } sep_config.debugStub = Dynamic._VZGDBDebugStubConfiguration(port: 8001) configuration._setCoprocessors([sep_config.asObject])
// Some vresearch101 config let pconf = VZMacPlatformConfiguration() pconf.hardwareModel = try vzHardwareModel_VRESEARCH101()
let serial = Dynamic._VZMacSerialNumber.initWithString("AAAAAA1337") let identifier = Dynamic.VZMacMachineIdentifier._machineIdentifierWithECID(0x1111111111111111, serialNumber: serial.asObject) pconf.machineIdentifier = identifier.asObject as! VZMacMachineIdentifier