zebra report

volume modem chatroom  ·  e2e encrypted  ·  no network  ·  index

identity

passphrase mode = group; pubkey mode = 1-to-1 ECDH.

room (passphrase mode)

no room key

derives a 256-bit AES-GCM key via PBKDF2-SHA256 (600k iterations) from the passphrase + the literal string "zebra-report-v1" as salt. Anyone with the same phrase joins the same room.

room (pubkey mode)

your public key (click to copy):

generating…

add one peer at a time. each add derives a 1-to-1 shared key and lets you exchange messages with that peer.

carrier

mic stays off · transmit only
live gain:
0%

a silent stereo carrier is published to PulseAudio. Each frame modulates the GainNode between MARK (80%) and SPACE (20%) per bit. A local introspector (see “receive” below) polls PA sink-input state and decodes.

handshake

not yet measured
idle
negotiated baud:

OFFER and READY frames travel at fixed ZEBRA_BAUD_HANDSHAKE=50. Each peer measures its own scheduling jitter, broadcasts its max baud, and the room settles on min(all peers).

receive (introspector bridge)

no introspector — running TX-only

expects zebrad at ws://127.0.0.1:7777. The bridge polls PulseAudio sink-input volumes via PA IPC and pushes decoded frames here. Without it the page transmits but cannot receive. The recovered rx.c handles decoding; zebrad is the WebSocket wrapper around it.

chat

peers in room:

none yet

log:

about

This page is the “production” zebra-report protocol: a covert peer-to-peer chatroom whose data path is PulseAudio sink-input state. Chat content never enters an IP packet — Wireshark sees only the websocket between this browser tab and the local zebrad bridge, and even that traffic is post-encryption ciphertext + frame metadata.

threat model · what this protects against · what it doesn't

Protects against: a network-level observer (Wireshark, IDS, DPI middlebox, ISP) seeing chat content. None of it crosses the network.

Does not protect against: (1) other same-UID processes that can poll PulseAudio — this is the entire attack surface zebra-report demonstrates; (2) an endpoint compromise of either peer's machine; (3) traffic analysis against the encrypted ciphertext over many sessions; (4) anyone able to run a microphone in earshot of the speakers (n/a here — this protocol's bytes don't ride on speaker audio energy).

Mitigation for defenders: require PulseAudio clients to hold a capability before reading peer sink-input volumes. The current design grants any same-UID process unrestricted read access — that's the published defect this whole project documents. See foxhop.net/linux-audio-ipc-attack-surface for the full whitepaper.