
Guía para construir un iPhone virtual usando componentes VPHONE600AP del firmware PCC de Apple, con parcheo de firmware, modificación de cadena de arranque y depuración del kernel para investigación de seguridad en iOS.
A finales de 2024, Apple comenzó a presentar Private Cloud Compute, afirmando abrir un nuevo horizonte para la privacidad de la IA basada en la nube. Luego, alrededor de finales de 2025, aparecieron noticias interesantes: Apple había añadido recientemente componentes relacionados con vphone600ap al firmware PCC, comenzando con cloudOS 26.

Fuente: https://x.com/matteyeux/status/2006339694783848660/photo/1
"¿Máquina virtual del entorno de investigación del iPhone?"
¿Es este un movimiento planificado por Apple para construir y distribuir un entorno de iPhone virtual para otros investigadores de seguridad en el futuro, o fue simplemente un error? Dado que el kernel de compilación DEVELOPMENT/KASAN fue descubierto una vez en las OTA de iOS 15.0 beta a 15.1 beta3 en 2021, la posibilidad de un descuido no puede descartarse. En ese momento, el kernel permaneció incluido durante aproximadamente 4 meses, de junio a octubre de 2021.
Luego, alrededor de enero de este año, se publicó un tuit mostrando un iPhone virtual arrancando utilizando estos componentes relacionados con vphone600ap.

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

Por lo que vi, casi todo funcionaba de manera realmente elegante. En comparación con el proyecto QEMUAppleSilicon(Inferno) que había visto anteriormente, se ejecuta mucho más rápido y fluido. Además, incluso parecía soportar aceleración Metal. Finalmente, completamente cautivado por ello, me sumergí y comencé a construir mi propio iPhone virtual el 31 de enero.

El proyecto de referencia es security-pcc. Corresponde al código fuente del binario /System/Library/SecurityResearch/usr/bin/vrevm. Un punto interesante es que utiliza métodos privados proporcionados por Virtualization.framework. En la máquina virtual utilizada para la investigación de PCC, se puede ver que el ISA y PlatformVersion se especifican explícitamente durante el proceso de inicialización del modelo de hardware.

Para el bootrom, se utiliza AVPBooter.vresearch1.bin (/System/Library/Frameworks/Virtualization.framework/Resources/AVPBooter.vresearch1.bin)

y para el SEPROM (avpsepbooter), se utiliza AVPSEPBooter.vresearch1.bin, que carga por separado un archivo SEPStorage que funciona de manera similar a AuxiliaryStorage. (/System/Library/Frameworks/Virtualization.framework/Versions/A/Resources/AVPSEPBooter.vresearch1.bin)
Otro punto interesante es que si observas el código para establecer la resolución, se configura a 1290x2796, que corresponde a los dispositivos iPhone 14 Pro Max, 15 Plus, 15 Pro Max y 16 Plus.

Con solo esta información, debería ser más que suficiente para modificar super-tart y arrancar el iPhone virtual. Realicé las modificaciones como se muestra a continuación.
/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