Apple SiliconのMac上で、仮想のiPhoneを起動するためのCLIツールがGitHubに公開されています。名前は vphone-cli。見た目は地味ですが、中身はかなり攻めています。iOS向けのファームウェアを準備し、パッチを当て、DFU復元を経て、カスタムファームウェアを入れ、最初の起動まで一気通貫で進められるようにしているからです。単なるデモではなく、研究用途や自動化テストまで視野に入った道具に見えます。
この手の話は、単に「面白い」で終わりません。AppleのVirtualization.framework、iOSの復元、AMFIやSIPの制約、さらにはSileoやTrollStoreまで出てくるので、macOSとiPhoneの境界がどこまで揺らされているのかを知る材料になります。元記事はREADME中心ですが、そこに書かれている内容だけでも十分に濃いです。
vphone-cli は、Lakr233 が公開している公開リポジトリで、README には「Apple の Virtualization.framework を使って、PCC research VM infrastructure ിലൂടെ virtual iPhone を起動する」と書かれています。要するに、Macの上でiPhone相当の仮想マシンを動かすためのコマンドラインツールです。対応ホストは Apple Silicon の Mac で、macOS 15 以降、Xcode と iOS SDK も必要です。さらに、未署名バイナリに対して private な PV=3 entitlements を通すため、SIP/AMFI の緩和も求めています。
導入方法は2通りあり、Homebrew から brew install zqxwce/tap/vphone-cli で入れるか、リポジトリを --recurse-submodules 付きで clone して自前で build します。README では ./scripts/setup_tools.sh で依存関係や Python 仮想環境を整え、./scripts/build.sh で vphone-cli の署名、.app のバンドル化、vphoned のクロスコンパイルまで行う手順が示されています。起動後は .build/vphone-cli.app/Contents/MacOS/ に移動して vphone-cli --help を叩く想定です。
いちばん目を引くのは、vm create 一発で仮想機の作成から起動まで進められる点です。README では vphone-cli vm create myphone -V jb が例として載っており、これはダウンロード、パッチ、DFU restore、カスタムファームウェアのインストール、最初のブートまでをまとめて実行します。その後に vphone-cli vm launch myphone で起動します。もちろん、各工程を分けて手動で進めることもでき、fw prepare、fw patch、restore、cfw install、vm launch のように段階を追って操作できます。
--variant で選べるファームウェアの種類も細かいです。less は4 patches、2 phases で、iOS の mitigations を残す patchless に近い位置づけです。regular は42 patches、10 phases で AMFI、SSV、Img4、TXM の bypass を行い、dev は53 patches、12 phases で TXM entitlement/debug bypass が追加されます。jb は113 patches、14 phases で full jailbreak、初回起動時に Sileo と TrollStore を自動導入します。最も強い exp は141 patches、18 phases で、jailbreak の上に anti-VM-detection research patches を積んだものです。README には、詳細は research/0_binary_patch_comparison.md にあると案内されています。
起動後の接続も書かれています。jailbreak 構成なら SSH は ssh -p 22222 mobile@<vm-ip> で、パスワードは alpine。regular と dev では root@<vm-ip> になります。VNC は vnc://<vm-ip>:5901 です。仮想マシン関連のデータはすべて ~/.vphone/ 以下に置かれ、VM 本体、ダウンロードした IPSW、APFS seal-volume の素材、.deb パッケージ、Python の venv などが用途ごとに分かれています。VPHONE_ROOT や VPHONE_LIBRARY_ROOT のような環境変数で保存先を切り替えられるのも、研究用ツールらしい作りです。
README には、SIP/AMFI の緩和方法や、Virtualization が使えない場合の条件、iOS セットアップ時に Japan や EU の地域を避ける必要があること、EXC_GUARD で落ちる場合の再パッチ方法まで載っています。さらに、ldid-procursus の既知の不具合として、特定の entitlements plist に整数0が入ると無限に書き込み続けてしまう問題も説明されていました。これは upstream では修正済みだが、タグ付きリリースにはまだ入っていないので、brew install --HEAD ldid-procursus と brew link --overwrite ldid-procursus で再ビルドするよう勧めています。最後には、外部制御用の vphone.sock まで用意され、スクリーンショット、タッチ、スワイプ、ハードキー、クリップボードを操作でき、AI駆動の E2E テストにも使えるとしています。
まず感じたのは、これを普通の意味での「エミュレータ」と見ると少しズレる、ということです。README の書き方を見る限り、vphone-cli はiPhoneを見た目だけ再現するおもちゃではありません。IPSW を取り込み、ブートチェーンをパッチし、DFU restore を通し、必要なら jailbreak まで載せる。つまり、Apple が本来想定していない経路をかなり丁寧に積み上げた研究基盤です。だからこそ、Virtualization.framework という公式APIを使いながら、周辺では SIP や AMFI の制約を外しにいく構図になっています。ここに、このツールの本気度が出ています。
一方で、ここまでやっても「万能」ではないのが面白いところです。README には、Virtualization が使えないハードでは動かないこと、Press home to continue で止まったら VNC でホームボタンを右クリックすること、地域設定を誤ると system apps が入らないことなど、かなり泥くさい注意点が並びます。私はここに、この分野の現実がよく出ていると思いました。最先端の話に見えて、実際には設定の一つ一つが足を引っ張る。だからこそ、完成品の便利さより、研究の再現性を上げる道具として価値があるのでしょう。
jb で Sileo と TrollStore まで自動導入するのは、かなり踏み込んでいるvphone-cli が興味深いのは、単なるブート支援に留まらず、jb では Sileo と TrollStore を初回起動時に自動インストールする点です。これはかなり強い宣言です。仮想iPhoneを「起動できる」だけではなく、脱獄後の環境としてすぐ触れる状態まで持っていく。研究者や開発者から見れば、検証のたびに手作業で環境を組み直す時間を減らせるので、実験の回転が速くなります。
ただ、私はここに少し危うさも感じます。脱獄や bypass は、使い方次第でセキュリティ研究の道具にもなるし、保護回避の実装例にもなります。README が exp という、anti-VM-detection research patches を含む最上位の variant を用意しているのも象徴的です。これは悪意の表明ではなく、研究対象を広げるための設計だと思いますが、同時に「何を再現できるか」がそのまま「何を壊せるか」に近づく領域でもあります。公開リポジトリとして透明に置かれていること自体は健全ですが、読む側にも用途の線引きが求められるはずです。
vphone.sock の存在がいちばん効くREADME の後半で目立つのは、外部制御用の host control socket vphone.sock です。スクリーンショット、タッチ、スワイプ、ハードキー、クリップボードを扱え、各操作のたびにインラインのスクリーンショットが返るとあります。これは単なる「リモート操作できます」以上の意味があります。GUI テストを回すとき、いま何が画面に出ているかを都度取り出せると、失敗の切り分けがかなり楽になるからです。
私はここが、このプロジェクトのいちばん実用的な顔だと思いました。仮想マシンの研究は、どうしても「動いた」「動かない」で終わりがちです。でも vphone-cli は、VM のライフサイクル管理だけでなく、操作の自動化と観測までまとめようとしている。AI-driven E2E testing という表現も、少し流行語っぽく見えるものの、実際には自然な方向です。画面の状態を取り出せて、操作も注入できるなら、アプリ検証の自動化にそのまま使えるからです。Apple の枠内でどこまでやれるかを押し広げる試みとしても、かなり筋がいいと思います。
この README は、一般向けにわかりやすく見せるより、最初から相当詳しい人に向けて書かれています。Apple Silicon、macOS 15+、Xcode、iOS SDK、SIP/AMFI、DFU restore、SHSH、APFS clone、ldid、TrollStore。知らない単語が多くても、文脈で追えるようにはなっていますが、気軽な入門書ではありません。私はこれを、あえて正しいと思います。曖昧な期待を持って触ると環境構築で止まるので、最初から「これは研究用で、しかも要求が多い」と明示したほうが親切です。
同時に、この厳しさはプロジェクトの将来像も示している気がします。~/.vphone/ にデータを閉じ込め、バンドルを portable に保ち、CLI から create/import/export/clone を回せるようにしているのは、単発のデモではなく、繰り返し実験するための土台を作ろうとしているからでしょう。iPhone の仮想化は、これまで断片的なツールの寄せ集めになりがちでした。そこを一つの操作体系にまとめようとした点に、このリポジトリの面白さがあります。完成度よりも、問題の置き方がはっきりしている。だからこそ、技術者には強く刺さるのだと思います。