Back to Articles

Running a Jailbroken iOS 26.1 VM on macOS: Inside vphone-aio's One-Script Architecture

[ View on GitHub ]

Running a Jailbroken iOS 26.1 VM on macOS: Inside vphone-aio’s One-Script Architecture

Hook

A 12GB jailbroken iOS virtual machine that runs entirely from a single shell script—no physical iPhone required. That’s either a security researcher’s dream or a testament to how far iOS virtualization has come since Apple locked down their platform.

Context

iOS security research and jailbreak development have traditionally required physical hardware. You’d need to acquire an iPhone, ensure it’s running a jailbreakable firmware version, perform the jailbreak process, and risk bricking expensive hardware in the process. For developers building iOS tweaks or security researchers analyzing iOS internals, this created a significant barrier to entry—both financially and practically. Even with devices in hand, testing across different iOS versions meant maintaining a collection of devices, each locked to specific firmware versions since Apple’s signing window policies prevent downgrading.

Apple’s Virtualization framework, introduced for running Linux VMs on Apple Silicon, opened unexpected possibilities. Projects like vphone-cli by Lakr233 discovered ways to leverage this framework to run virtualized iOS environments, though setup remained complex and required deep technical knowledge. Enter vphone-aio: a distribution that packages an entire pre-configured, jailbroken iOS 26.1 environment with bootstrap tools into a single executable script. It’s essentially Infrastructure as Code for iOS virtualization, solving the “works on my machine” problem that plagued manual vphone-cli setups.

Technical Insight

No

Yes

Download .part files

vphone.tar.zst

vphone.tar

iOS 26.1 Instance

Remote Display

User runs run.sh

vphone.bundle

exists?

Git LFS Pull

Missing Parts

vphone-cli run

Launch VM

Cat Command

Merge Parts

Zstd Decompression

30+ min

Tar Extract

vphone.bundle

Apple Virtualization

Framework

VNC Server

localhost:5901

User Access

Jailbroken iOS

System architecture — auto-generated

The architecture of vphone-aio reveals clever solutions to GitHub’s constraints while maintaining a simple user experience. The core challenge was distributing a 12GB virtualized iOS image through Git. The solution uses Git LFS (Large File Storage) with multi-part archives split into manageable chunks. The main script run.sh orchestrates the entire lifecycle—downloading missing parts, merging them with cat, decompressing with zstd, and launching the VM.

Here’s a simplified version of the core logic:

#!/bin/bash

# Check if the decompressed image exists
if [ ! -d "vphone.bundle" ]; then
    echo "[*] Image not found, checking archive parts..."
    
    # Verify all parts are present
    PARTS=("vphone.tar.zst.part.aa" "vphone.tar.zst.part.ab" "vphone.tar.zst.part.ac")
    for part in "${PARTS[@]}"; do
        if [ ! -f "$part" ]; then
            echo "[!] Missing $part, downloading via git-lfs..."
            git lfs pull --include="$part"
        fi
    done
    
    # Merge and decompress
    echo "[*] Merging archive parts..."
    cat vphone.tar.zst.part.* > vphone.tar.zst
    
    echo "[*] Decompressing (this takes 30+ minutes)..."
    zstd -d vphone.tar.zst -o vphone.tar
    tar -xf vphone.tar
    
    # Cleanup
    rm vphone.tar.zst vphone.tar
fi

# Launch the virtual iPhone
echo "[*] Starting vphone on VNC port 5901..."
./vphone-cli run --vnc 5901 ./vphone.bundle

The underlying virtualization relies on Apple’s Virtualization framework, specifically the VZVirtualMachineConfiguration APIs. Unlike traditional hypervisors, this framework is designed for running macOS and Linux guests, but vphone-cli has adapted it for iOS by providing the correct boot artifacts, kernel, and device tree. The iOS 26.1 image comes pre-configured with a full bootstrap environment—likely using Procursus or a similar modern jailbreak bootstrap—and includes package managers, SSH access, and development tools.

The requirement to disable SIP (System Integrity Protection) and set AMFI (Apple Mobile File Integrity) bypass flags reveals how deeply this integrates with macOS. The script likely requires these boot arguments:

sudo nvram boot-args="amfi_get_out_of_my_way=1"

This tells macOS to disable code signing enforcement, which is necessary because the virtualized iOS kernel and bootstrap aren’t signed by Apple. When you connect via VNC to localhost:5901, you’re seeing the framebuffer output of a virtual iPhone’s display, complete with SpringBoard (the iOS home screen) and full touch input simulation.

The multi-part archive strategy is particularly elegant for version control. Instead of hosting the 12GB blob externally and risking link rot, everything lives in Git with proper versioning. If the maintainer updates the iOS image, Git tracks the changes to individual parts, and users can git pull to get updates. The zstd compression achieves impressive ratios on the mostly-sparse filesystem image, likely reducing the actual download size significantly compared to the decompressed 12GB footprint.

One architectural choice worth noting: the script doesn’t expose configuration options. The VNC port, iOS version, and bootstrap configuration are hardcoded. This trade-off prioritizes the “just works” experience over flexibility. For researchers who need this level of simplification, it’s perfect. For those wanting to customize the iOS version or tweak the bootstrap packages, you’d need to modify the decompressed bundle or drop down to vphone-cli directly.

Gotcha

The disk space requirements are deceptive. While the repository advertises 128GB, real-world usage often requires more. The compressed archive parts, the merged archive, the decompressed tar, and the final bundle can temporarily consume 30-40GB during extraction before cleanup. If you’re on a MacBook with limited storage, this becomes a deal-breaker. Additionally, the 30+ minute initial setup time isn’t just decompression—it includes file system operations that hammer your SSD with thousands of small file writes as the iOS bundle expands.

The iOS version numbering (26.1) raises questions about longevity and support. This isn’t a standard public iOS release number, suggesting it’s either a beta, an internal build, or follows different versioning within the virtualization context. There’s no documentation about updating to newer iOS versions or customizing the image. If you need to test against a specific production iOS version like iOS 16.4 or iOS 17.2, you’re out of luck unless you rebuild the entire bundle yourself—a process that’s completely undocumented. The requirement to disable SIP system-wide also means your host Mac is running with reduced security posture for as long as you want to use vphone-aio. Unlike running a Docker container with isolated security boundaries, this exposes your entire system to potential exploits that SIP would normally prevent.

Verdict

Use if: You’re doing iOS security research, reverse engineering, or tweak development and need immediate access to a jailbroken environment without buying hardware. You have a Mac with 150GB+ free space, understand the security implications of disabling SIP, and don’t mind the 30-minute setup tax. This is ideal for analyzing iOS malware, testing jailbreak tweaks before deploying to physical devices, or learning iOS internals without bricking an iPhone. Skip if: You need production-grade security on your host Mac, require specific iOS versions for compatibility testing, want a quick-start development environment (the setup time alone makes Xcode’s simulator more practical for most app development), or you’re on Windows/Linux. Also skip if you’re uncomfortable with the legal gray area of jailbreaking—while jailbreaking for research is generally protected under DMCA exemptions, distributing pre-jailbroken images exists in murkier territory.

// ADD TO YOUR README
[![Featured on Starlog](https://starlog.is/api/badge/developer-tools/34306-vphone-aio.svg)](https://starlog.is/api/badge-click/developer-tools/34306-vphone-aio)