
Guida per costruire un iPhone virtuale utilizzando componenti VPHONE600AP dal firmware PCC di Apple, con patch del firmware, modifica della bootchain e debug del kernel per la ricerca sulla sicurezza di iOS.
Verso la fine del 2024, Apple ha iniziato a introdurre Private Cloud Compute, sostenendo di aprire un nuovo orizzonte per la privacy dell'IA basata sul cloud. Poi, verso la fine del 2025, sono apparse alcune notizie interessanti: Apple aveva aggiunto di recente componenti relativi a vphone600ap al firmware PCC, a partire da cloudOS 26.

Fonte: https://x.com/matteyeux/status/2006339694783848660/photo/1
"Macchina virtuale per l'ambiente di ricerca iPhone"?
Si tratta di una mossa pianificata da Apple per costruire e distribuire un ambiente iPhone virtuale per altri ricercatori di sicurezza in futuro, o è stato semplicemente un errore? Considerando che il kernel di build DEVELOPMENT/KASAN è stato scoperto una volta negli OTA di iOS 15.0 beta a 15.1 beta3 nel 2021, la possibilità di un lapsus non può essere esclusa. All'epoca, il kernel è rimasto incluso per circa 4 mesi, approssimativamente da giugno a ottobre 2021.
Poi, intorno a gennaio di quest'anno, è stato pubblicato un tweet che mostrava un iPhone virtuale in fase di avvio utilizzando questi componenti relativi a vphone600ap.

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

Da quello che ho visto, quasi tutto funzionava davvero in modo elegante. Rispetto al progetto QEMUAppleSilicon(Inferno) che avevo visto in precedenza, funziona molto più rapidamente e fluentemente. Inoltre, sembrava addirittura supportare l'accelerazione Metal. Alla fine, completamente affascinato, mi sono tuffato e ho iniziato a costruire il mio iPhone virtuale il 31 gennaio.

Il progetto di riferimento è security-pcc. Corrisponde al codice sorgente del binario /System/Library/SecurityResearch/usr/bin/vrevm. Un punto interessante è che utilizza metodi privati forniti da Virtualization.framework. Nella macchina virtuale utilizzata per la ricerca PCC, si può vedere che ISA e PlatformVersion sono specificati esplicitamente durante il processo di inizializzazione del modello hardware.

Per il bootrom, viene utilizzato AVPBooter.vresearch1.bin (/System/Library/Frameworks/Virtualization.framework/Resources/AVPBooter.vresearch1.bin)

e per il SEPROM (avpsepbooter), viene utilizzato AVPSEPBooter.vresearch1.bin, che carica separatamente un file SEPStorage che funziona in modo simile a AuxiliaryStorage. (/System/Library/Frameworks/Virtualization.framework/Versions/A/Resources/AVPSEPBooter.vresearch1.bin)
Un altro punto interessante è che se si guarda il codice per impostare la risoluzione, è impostata su 1290x2796, che corrisponde ai dispositivi iPhone 14 Pro Max, 15 Plus, 15 Pro Max e 16 Plus.

Con solo queste informazioni, dovrebbe essere più che sufficiente per modificare super-tart per avviare l'iPhone virtuale. Ho apportato le modifiche come mostrato di seguito.
/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