Nivora
GitHub Live demo

Packet capture

Capture is an opt-in, per-session feature. Everything else in Nivora stays payload-free.

Guarantees#

Architecture#

web / native UI ──HTTP──▶ nivora.py ──unix socket──▶ dev.zyvor.nivora.capture-helper (root, launchd)
                          capture.py                     └─▶ /usr/sbin/tcpdump (fixed argv, no shell)

API#

GET    /v1/captures                 availability, limits, sessions
POST   /v1/captures                 {iface, host?, port?, proto?, snaplen?, seconds?, max_mb?, confirm:true}
POST   /v1/captures/{id}/stop
GET    /v1/captures/{id}/pcap       application/vnd.tcpdump.pcap attachment
DELETE /v1/captures/{id}

Without the helper, POST returns 501 with the equivalent manual sudo tcpdump … command. Demo mode simulates sessions and serves a synthetic, valid pcap.

What is and is not verified#

Verified in this repo: the helper and app compile; Swift/Python validator unit tests (including injection attempts and limit parity); the client against a fake helper socket; the real helper binary answering the protocol and rejecting bad input when run unprivileged; the demo flow in the web UI.

Not verified: signing, SMAppService registration/approval, running tcpdump as root, BPF permission, file-ownership/permissions as root, and getpeereid behaviour under a real launchd install. These need a provisioned, signed build on a Mac.

Edit this page on GitHub