Руководство по созданию виртуального iPhone с использованием компонентов VPHONE600AP из прошивки PCC от Apple, включающее патчинг прошивки, модификацию цепочки загрузки и отладку ядра для исследований безопасности iOS.
Примерно в конце 2024 года Apple начала представлять Private Cloud Compute, заявляя об открытии нового горизонта для облачной конфиденциальности ИИ. Затем, примерно в конце 2025 года, появились интересные новости: Apple добавила новые компоненты, связанные с vphone600ap, в прошивку PCC, начиная с cloudOS 26.

Источник: https://x.com/matteyeux/status/2006339694783848660/photo/1
«Виртуальная машина среды исследования iPhone»?
Это запланированный шаг Apple по созданию и распространению виртуальной среды iPhone для других исследователей безопасности в будущем, или же это просто ошибка? Учитывая, что ядро сборки DEVELOPMENT/KASAN было однажды обнаружено в OTA-обновлениях iOS 15.0 beta — 15.1 beta3 ещё в 2021 году, возможность оплошности исключать нельзя. В то время ядро оставалось включённым около 4 месяцев, примерно с июня по октябрь 2021 года.
Затем, примерно в январе этого года, был опубликован твит, показывающий загрузку виртуального iPhone с использованием этих компонентов, связанных с vphone600ap.

Источник: https://x.com/_inside/status/2008951845725548783

Насколько я видел, почти всё работало действительно элегантно. По сравнению с проектом QEMUAppleSilicon(Inferno), который я видел ранее, он работает гораздо быстрее и плавнее. Более того, он даже, похоже, поддерживал ускорение Metal. В конечном итоге, полностью очарованный этим, я сразу же приступил к созданию собственного виртуального iPhone 31 января.

Упомянутый проект — security-pcc. Он соответствует исходному коду бинарного файла /System/Library/SecurityResearch/usr/bin/vrevm. Интересный момент заключается в том, что он использует приватные методы, предоставляемые Virtualization.framework. На виртуальной машине, используемой для исследований PCC, видно, что ISA и PlatformVersion явно задаются в процессе инициализации аппаратной модели.

В качестве bootrom используется AVPBooter.vresearch1.bin (/System/Library/Frameworks/Virtualization.framework/Resources/AVPBooter.vresearch1.bin)

а в качестве SEPROM (avpsepbooter) используется AVPSEPBooter.vresearch1.bin, который отдельно загружает файл SEPStorage, функционирующий аналогично AuxiliaryStorage. (/System/Library/Frameworks/Virtualization.framework/Versions/A/Resources/AVPSEPBooter.vresearch1.bin)
Ещё один интересный момент: если посмотреть на код настройки разрешения, оно установлено на 1290x2796, что соответствует устройствам iPhone 14 Pro Max, 15 Plus, 15 Pro Max и 16 Plus.

Обладая только этой информацией, этого должно быть более чем достаточно для модификации super-tart с целью загрузки виртуального iPhone. Я внёс изменения, как показано ниже.
/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