Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Submit
ToolsExploitsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

··Feeds·Contact·Privacy·© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
dd — JIT-based userspace Linux kernel that runs containers natively on Apple Silicon macOS without a VM. Drop-in Docker Engine API replacement with container isolation, overlay images, and port publishing. | Kitploit
Tools/GitHubGitHub/ricccrd/dd
Container SecurityDynamic Analysis (Sandboxing)Reverse EngineeringSecurity VirtualizationDevSecOpsBinary Analysis
GitHubricccrd/dd

dd

JIT-based userspace Linux kernel that runs containers natively on Apple Silicon macOS without a VM. Drop-in Docker Engine API replacement with container isolation, overlay images, and port publishing.

View Repository
25852613 days agoReviewed by Kitploit

Most Popular

View all →

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools →
Share

dd

dd

Run Linux containers on macOS — with no VM.

Download Platform License Website


What is dd?

dd runs Linux containers natively on Apple-Silicon macOS without a virtual machine. There is no Linux kernel and no hypervisor underneath: a JIT translates the container's code and services its Linux syscalls in userspace (the gVisor / PRoot lineage). The JIT is the guest's Linux kernel — namespaces, cgroups, overlay image layers and networking are maintained as userspace state. It speaks the Docker Engine API, so the ordinary docker CLI drives it.

The container's compute runs as native Apple-Silicon instructions; only its syscalls are interpreted. No VM to boot, no daemon-in-a-VM, no virtualization cost.

Website & docs: https://ricccrd.github.io/dd/

make jit                                          # build.rs compiles + codesigns the JITs
DD_IMAGES=/path/to/images cargo run -p dd-daemon  # start the daemon
export DOCKER_HOST=unix://$PWD/dd.sock
docker run -p 8080:80 -m 256m alpine sh -c 'echo hi from $(hostname)'

Features

  • No virtual machine. No hypervisor, no Linux kernel, no VM to keep resident. The guest's instructions run natively on arm64; only the syscall boundary is trapped and serviced in userspace.
  • Drop-in Docker. dd implements the Docker Engine API. Point DOCKER_HOST at its socket and your existing docker run / ps / images / build commands work unchanged.
  • The JIT is the kernel. Namespaces, cgroups, overlay image layers and networking are ordinary userspace state — a userspace kernel in the gVisor / PRoot lineage, with none of a VM's cost.
  • Three guest runtimes, one engine. Native arm64 Linux images; x86-64 Linux images via a JIT (jit86) that decodes x86, synthesizes its flags, and lowers SSE/x87 onto NEON (glibc binaries run); and macOS arm64 guests (ddcli mac) — no VM in any of them.
  • Real container isolation. Overlay image layers (copy-up / .wh. whiteout, merged getdents), a TOCTOU-free path-jail VFS, PID / UTS / USER namespaces, a private loopback netns with -p port publishing, and cgroup memory + pids limits (OOM at the limit).
  • Desktop app, no root. A native GTK4 app (dd-app) plus a dd CLI install a per-user background daemon and a docker context — everything under $HOME, never sudo.

Why a JIT, not a VM?

Every other way to run Linux containers on a Mac — Docker Desktop, Colima, Rancher, OrbStack — boots a Linux VM under a hypervisor and runs the daemon inside it. That VM is a tax you pay all day. dd deletes it: a container is a plain macOS process whose syscalls happen to be serviced by a userspace Linux kernel.

dd — userspace kernel (JIT)VM-based Docker (Desktop / Colima / …)
Underlying modelA JIT services Linux syscalls in userspace (gVisor lineage)A full Linux kernel inside a hypervisor VM
Resident RAM when idleNone — per-container, freed on exitGigabytes reserved for the VM, always on
StartupProcess spawn — no VM to bootBoot a Linux VM + the in-VM daemon first
Bind-mount / file I/ODirect host filesystem through a path jailvirtiofs/gRPC-FUSE bridge across the VM boundary
Port publishingStraight to host socketsThrough the VM's NAT/forwarding layer
Battery / background costNothing running when no container isA VM idling and draining battery
Footprint to ship & patchNo Linux kernel — nothing to CVE-trackShips, patches and tracks a whole Linux kernel
ObservabilityA normal macOS process — sample, debug, Activity MonitorAn opaque VM; the workload is invisible to host tools

The win is structural: the guest's compute runs as native Apple-Silicon instructions (no hardware-virtualization layer in the hot path), and the notorious Docker-Desktop file-sharing bottleneck — the virtiofs/FUSE bridge between macOS and the VM — simply doesn't exist, because dd's VFS is the host filesystem behind a path jail.

Honest trade-off: a userspace kernel is only as complete as the syscalls it implements, and today By default the guest runs in one process — fast, and the right call for code you trust (your dev environment, CI, your own tools). For untrusted code there's now an opt-in sentry split (DDJIT_UNTRUSTED): the guest runs in a deny-default Seatbelt sandbox holding no host fs/net authority, while a trusted sentry process owns the real resources and serves syscalls across a shared-memory ring — the gVisor shape. It's early (the core file syscalls — read/write/open/close/lseek — forward today; sockets/exec/fork are landing), so for fully hostile code a VM still exposes a narrower surface.

Performance

The same static Linux binary, run two ways on an Apple M5 Pro (macOS 26.3): inside the Linux VM (how VM-based Docker runs containers) vs. through dd's JIT on the host with no VM. Median of 7 (make bench). Lower time is better; "dd vs VM" > 1× means dd is faster. The dd lane even pays a small cross-process bridge tax the real app doesn't — so these are conservative.

x86-64 containers — dd vs VM emulation (qemu-user; running x86 on Apple Silicon means translating it either way). dd's JIT beats qemu on 9 of 10 workloads, dramatically on floating-point:

WorkloadVM (qemu)dd (no VM)dd vs VM
float n-body5.39s0.23s24× faster
mandelbrot7.81s0.83s9.4× faster
matmul8.21s1.37s6.0× faster
SQLite (600k rows)2.99s1.01s3.0× faster
qsort3.91s1.68s2.3× faster
memcpy2.40s1.10s2.2× faster
text-scan (wc/grep)1.42s1.11s1.3× faster
int sieve1.31s1.04s1.25× faster
SHA-2562.72s2.44s1.1× faster
base644.28s5.39s0.79× (1.26× slower)

aarch64 containers — dd vs a native VM (the VM runs arm64 at full native speed — the hardest bar):

WorkloadVM (native)dd (no VM)dd vs VM
int sieve0.75s0.48s1.58× faster
mandelbrot0.79s0.77s1.03× faster
matmul0.66s0.66s~parity
memcpy0.55s0.56s~parity
base640.68s0.68s~parity
float n-body0.17s0.17s~parity
SHA-2560.80s0.82s~parity
qsort0.83s1.10s1.33× slower
text-scan (wc/grep)0.51s0.68s1.35× slower
SQLite (600k rows)0.36s0.62s1.71× slower
Download Tool