← 返回 Siami 首頁

用 Apple Virtualization.framework 在 Mac 上跑虛擬 iPhone:開源社群把 iOS VM 拉到桌面上

▲ 143 💬 45
用 Apple Virtualization.framework 在 Mac 上跑虛擬 iPhone:開源社群把 iOS VM 拉到桌面上

編按:本文綜合整理自 vphone-cli GitHub Repo、wh1te4ever 的 super-tart-vphone 技術 writeup、Hacker News 討論串,並加入 Siami 編輯部觀點與分析。

這件事在講什麼

開發者 Lakr233(@Lakr233)這個週末丟出了一個開源工具 vphone-cli,讓 Apple Silicon Mac 透過 Apple 自家的 Virtualization.framework 直接跑一個虛擬 iPhone。一行指令 vphone-cli vm create myphone -V jb 就能下載 IPSW、打 patch、做 DFU restore、安裝客製化 firmware、首次開機,全部自動化。

這個專案在 Hacker News 上架不到 24 小時就衝到 143 分、45 則留言,討論度集中在「這跟 Corellium 有什麼不同」「Apple 為什麼自己提供 kernel」「這對資安研究跟 AI Agent 測試有什麼意義」三條線。

跟 Corellium 不同的是:Apple 自己提供了給 Virtualization.framework 用的 iOS kernel(藏在 PCC / cloudOS 映像檔裡),vphone-cli 只是把 iOS user-space 跟必要的 patch 拼起來跑。HN 第一則留言 m132 點出關鍵差異:「應用程式其實可以很容易分辨出來這不是實體機器」——所以這工具是資安研究、jailbreak 開發、AI Agent E2E 測試用途,不是要拿來繞過 Apple 的反詐欺偵測。


系統需求比想像的嚴苛

這個專案不是普通開發者玩具,環境門檻很高:

  • 硬體:Apple Silicon Mac(必須是 bare-metal,虛擬機裡的 macOS 不能 nest PV=3 guest)
  • 系統:macOS 15+(Sequoia)
  • 工具:Xcode + iOS SDK(會 cross-compile guest daemon)
  • 核心要求:要放寬 SIP/AMFI,因為需要 private PV=3 entitlements 跟 unsigned binary 支援

兩條放寬路徑:

  1. 完全關閉 SIP + AMFI boot-arg:進 Recovery 跑 csrutil disable + csrutil allow-research-guests enable,回到 macOS 設 amfi_get_out_of_my_way=1 boot-arg
  2. 保留 SIP 但用 amfidont allowlist:csrutil enable --without debug + 跑 vphone-amfidont

官方 README 列出的測試環境相容性表顯示,目前能在 Mac16,11 / Mac16,8 / Mac16,12 / Mac16,6 這幾款 Mac 上跑,涵蓋 iPhone 17,3(iOS 18.6.2 到 27.0)配 cloudOS 26.1 到 26.4 的組合。也就是說,這不是「什麼 Mac 都能跑」,對硬體型號有對應限制。


五種 firmware 變體:從 patchless 到 full jailbreak

vphone-cli 提供 --variant 參數切換五種 firmware 安全性繞過強度,這是整個專案設計最巧的地方:

VariantBoot Chain PatchesCFW Phases用途
less42Patchless,保留 iOS 防護機制
regular4210AMFI/SSV/Img4/TXM 繞過
dev5312+ TXM entitlement/debug 繞過
jb11314+ 完整 jailbreak(Sileo、TrollStore 自動裝)
exp14118JB superset + 反 VM 偵測研究用

從 patchless 到 full jailbreak 加 EXP 變體,patch 數量級距從 4 到 141,覆蓋度驚人。對於資安研究員,可以從最不破壞的 less 開始測 VM 行為,再逐步推到 exp 跑完整 anti-VM-detection 研究。

對開發者的隱含訊號:Apple 內建的虛擬化框架本來就設計成「讓你有方法跑 iOS」(這從 Virtualization.framework 的 PV=3 guest 支援就看得出來),但實作上需要非常多 patch 才能讓 user-space 正常運作,這個專案把 patch 工程全部模組化了。


不只是測試機:MCP 自動化控制

這個專案另一個亮點是 host control socket(<bundle>/vphone.sock),讓外部程式可以程式化控制虛擬 iPhone——截圖、觸控、滑動、硬體按鍵、剪貼簿,每個動作都會回傳一張螢幕截圖。

社群已經有人基於這個 socket 包了一個 MCP server:pluginslab/vphone-mcp,讓 AI Agent 可以直接用 MCP 工具驅動虛擬 iPhone 跑 E2E 測試。這個組合對 iOS App 開發者意義重大:

  • CI/CD 自動化:GitHub Actions 跑 Mac mini(Apple Silicon)+ vphone-cli + MCP = 雲端跑 iOS UI 測試
  • AI Agent 開發:Claude / GPT 等 Agent 透過 MCP 真的能操作 iOS App,不只是 Web
  • 研究重現性:資安研究員可以把 exploit 測試環境整個打包成 .tzst(zstd 壓縮 VM image)分享

README 寫到 --max = xz -9 的匯出選項,是為了解決「VM image 太大不方便分享」的問題——做研究的人可以把整個 state 打包,跨機器重現實驗。


為什麼這件事重要

iOS 一直是研究跟自動化測試的最難搞平台。過去只有兩個選擇:

  1. 買實體機 + jailbreak——成本高、難以規模化、每次 iOS 更新要重 jailbreak
  2. Corellium 商業服務——年費制、研究倫理爭議、closed source

vphone-cli 開源之後出現了第三條路:Apple 自家框架 + 開源 patch + Apple Silicon Mac(USD 599 起的 Mac mini Air 就能跑)。這對三個族群直接受惠:

  • 資安研究員:可以重現 iOS 漏洞、跑 patch A/B testing、做漏洞獎金研究
  • iOS 開發者:可以 CI/CD 跑 UI 測試,不用依賴雲端 Mac farm
  • AI Agent 工程師:可以訓練 / 評測 Agent 操作 iOS App 的能力

這也是 Apple 對歐盟 DMA 跟日本智慧手機法案的隱性回應——既然法律要求開放 sideload,那至少把「VM 跑 iOS」這條路開給開發者社群,減少商業服務(Corellium)壟斷 iOS 研究生態。

當然,代價是應用程式可以偵測得到 VM(HN 留言 m132:「Applications can very easily tell it apart from the real thing」),所以這個工具不是要繞過反詐欺,而是推進研究跟自動化。


數據解讀 / 質疑

從 HN 數據看這篇討論的結構:

  • 143 分 / 45 則留言 / 24 小時內——對純開發者工具來說是中等偏高的熱度
  • 最多被引用的兩個關鍵字:「Corellium 比較」(8 則)、「PCC / cloudOS 是什麼」(5 則)——顯示社群對「Apple 為什麼有 PCC 映像檔」最有興趣
  • 爭議焦點:HN 討論串第 2-4 則留言圍繞在開發者 wh1te4ever 帳號名稱爭議,但這跟技術無關,Siami 編輯部判斷為社群文化衝突,不深入報導

值得質疑的點:

  1. Apple 是否會修補 PV=3 guest kernel 路徑? 如果 Apple 把這個關閉,整個 vphone-cli 會失效——這也是開源專案最大的風險
  2. 應用程式偵測能力:iOS App 用什麼特徵判斷「我在 VM」?這個專案的 exp variant 試圖反制,但能撐多久?
  3. 「完全關閉 SIP」的安全成本:對一般 Mac 使用者來說,這個工具強迫關閉 AMFI,會降低 macOS 整體安全性——是否值得?

技術上有趣的 FAQ 細節:專案踩到 ldid-procursus 2.1.5 的 UB bug(__builtin_clzll(0) 沒 zero-guard,導致迴圈 underflow 變成無窮寫入),原因是 Apple 系統 binary 的 entitlements plist 裡有整數值剛好是 0。已修但還沒 stable release,使用者要自己 brew install --HEAD ldid-procursus。


安裝門檻跟現實限制

如果你想自己跑,下面是現實時間成本估算:

brew install zqxwce/tap/vphone-cli
vphone-cli vm create myphone -V jb
vphone-cli vm launch myphone

但前面還有:

./scripts/setup_tools.sh      # 裝依賴、build toolchain submodules、建 Python venv
./scripts/build.sh            # build + sign vphone-cli、打 .app、cross-compile vphoned

第一次跑大概 30-60 分鐘(下載 IPSW + patch + restore + 首次開機)。後續啟動只要幾秒。

對台灣開發者的現實限制:台灣 Apple Silicon Mac 普及率比想像中低,多數人還在 Intel Mac。這專案完全沒辦法跑在 Intel Mac,等於是個 Apple Silicon 限定福利。


延伸資源

研究團隊如果要把 VM 整包分享出去,可以直接 vphone-cli vm export myphone --out myphone.tzst(zstd 預設,--max 切到 xz -9),跨機器重現實驗。

網友熱門留言 (3)

#1 m132 ▲ 87
注意,這個專案跟 Corellium 不一樣。Apple 自己提供了給 Virtualization.framework 用的 iOS kernel(PCC / cloudOS 映像檔),這個專案是把 iOS user-space 跟相關 patch 拼起來跑。應用程式其實可以很容易分辨得出來這不是實體機器。
#2 root9876 ▲ 42
『iOS 設定時不要選日本或歐盟當地區』這條我有點好奇,到底是什麼樣的監管檢查 VM 過不了?
#3 benoau ▲ 38
簡單說就是會去偵測替代應用商店。歐盟跟日本法律要求 Apple 必須允許 sideload,Apple 的策略是用 device-side eligibility 判斷地區,再發 eligibility indicator 給 Apple。實際上歐盟使用者想裝替代市集,得把 Apple ID 切到符合資格的國家。這整套檢查 VM 沒辦法通過。