A Rust CLI that reduces every identifier a Linux system locally controls when joining or transmitting on a network. MAC addresses, DHCP options, IPv6 derivations, hostname, mDNS chatter, TCP fingerprint quirks, Bluetooth name, and the parts of the RF surface software can shape (TX power, probe-request behavior). Rotates MACs on a schedule and on connectivity loss. Single binary, embedded wiki, runs on Fedora 43+ with systemd and NetworkManager.
Named after the shapeshifter.
v0.4.0-beta1 — beta. Not a stable release; the CLI surface, config schema, and on-disk formats may still change before v1.0. v0.4 is the bug-and-vulnerability-hunt phase; no new features land in this cycle.
What has shipped on main:
- v0.1 cycle (Phases A–G) — full skeleton + L2 identity + probes/timers/captive-portals + DHCP/IPv6/hostname/802.1X/DNS + discovery silencing + stack fingerprint + 45-page embedded wiki + packaging + revert/diff/dry-run/reset/uninstall/kill-switch + podman+systemd integration tests. See docs/ROADMAP-v0.1.md for the archived detail.
- v0.2 cycle "Polish" — multi-profile NM rotation (#122), uuid-keyed state (#124), the May 2026 security audit, and a long tail of low-severity polish.
- v0.3 cycle "Reach + Persona" — six milestones, all shipped:
- M1
NetworkBackendabstraction. Trait + three impls (NM full; networkd / raw probes-then-degrades),[backend] driverconfig, doctor matrix. Everycommands/*.rscall site routes through the trait.proteus rotate-if-neededtyped entry point. - M2 Persona / Randomizer dual-mode stealth. 25 stealth covers + 6 randomizer mirrors. Schema, loader, validator, 11-subcommand CLI. Full integration with apply / rotate (MAC OUI shaping, hostname template, DHCP fingerprint write, Bluetooth alias). RFC 5227 ARP probe + IPv6 DAD with adaptive backoff. wiki/personas.md + threat-model addendum.
- M3 Per-SSID profile policies.
[per_ssid."<ssid>"]config,proteus ssid {list,show,set,clear}, four-layer resolver with source trace. - M4 Fingerprint hardening + RF + rotation triggers.
proteus resolved(mDNS+LLMNR off),proteus ntp(timesyncd normalization, detect-and-defer), nftablesextra_dropschain.proteus rf scan/chipset+ per-scan MAC randomization.proteus dhcp renew. Event-driven framework (proteus events run) under a hardened systemd unit. - M5 Distro reach. Init-system abstraction (
Systemd/Openrc/Runit/Sysvinit), aarch64 + armv7 cross-compile matrix, packaging recipes for Alpine APKBUILD + Void template + Gentoo ebuild + AUR-bin/-git+ Copr spec polish + Debian submission-prep. - M6 Ergonomics + bug-fix queue. Short aliases (
proteus s/r/a),--watchmode,proteus completions <bash|zsh|fish>,LOCK_BUSYexit code,State::schema_versionmigration ladder, 13 bug-fix items closed. wiki/troubleshooting.md symptom matrix. docs/security/dbus-surface.md audit artifact.
- M1
- v0.4.x cycle "Hardening Across Streams" — no new features.
v0.4.0-beta1shipped the May 2026 vulnerability-hunt cluster (30+ issues) plus three critical-for-beta fixes (#276 packaging version sync, #284Mac::from_strpanic, #297timer setnewline injection). The remaining ~75 items fromdocs/ISSUES.md— including 4 critical CLI confirmation bypasses and 21 high-severity findings — land across ten parallelisable streams indocs/ROADMAP.md. The cycle stays inside0.4.x-betauntil every Critical and High row has afixed-inversion.
See CHANGELOG.md for the full list and docs/ROADMAP.md for the operational view. Prior cycles: docs/ROADMAP-v0.3.md, docs/ROADMAP-v0.1.md.
Commands shipping today:
proteus status,proteus current,proteus original,proteus session— read-only views of what is applied, what is live, what the cached originals are, and a one-screen current-network snapshotproteus rotate— fresh MAC on one or every interface (NetworkManager DBus, nonmclishelling)proteus rotate-if-needed --cooldown <secs>— typed-result entry the dispatcher script consumesproteus pin/proteus unpin— pin a MAC per interface or per NM connection profileproteus persona list / show / use / random / current / clear / new / edit / validate / import / export— device-persona management; 25 stealth covers (iphone-15,pixel-8,macbook-pro-m3,samsung-tv-2024,nest-mini, ...) + 6 randomizer mirrorsproteus ssid list / show / set / clear— per-SSID profile policies (persona / aggressiveness / pin / rotate-interval / portal-policy overrides)proteus bluetooth status / apply / revert— generic alias,discoverable=off, BLE Resolvable Private Address mode where the controller supports itproteus hostname rotate / pin / status / revert— rotate kernel/pretty/transient names from the 534-entry wordlist or render a persona'shostname_templateproteus ipv6 status / apply / revert— stable-privacy + temporary addresses + DUID rotation per NM connectionproteus dhcp status / apply / revert / renew— option 12/60/61/81 + DUID/IAID suppression or persona-shaped writes; lease release+renew without changing MACproteus dns status / apply / revert— EDNS-Client-Subnet strip drop-in for systemd-resolved with detect-and-defer hard guardproteus resolved status / apply / revert— mDNS+LLMNR off via systemd-resolved drop-inproteus ntp status / apply / revert— timesyncd NTP normalization (skips if chrony/ntpd present)proteus stack status / apply / revert— TCP/ICMP/NDP sysctl hardening drop-inproteus nft status / apply / revert— nftables table for ICMP info-drops, optional SSDP/WSD blocks, and an opt-inextra_dropschain (ICMP timestamp / broadcast ping / IGMP query)proteus rf status / apply / revert / scan / chipset— TX-power reduction, scan-style report, driver/chipset/firmware inventoryproteus enterprise-wifi status / enable / disable— 802.1X anonymous outer identity (opt-in, default off)proteus portal status / mark / unmark / list / open— captive-portal detection and known-portal SSID listproteus events run— long-running daemon that subscribes to NM connection-up / link-flap / regulatory-domain / portal-auth events and re-applies the right policy per SSID (opt-in via[events] enabled = true)proteus kill/proteus resume— emergency network shutdown (interfaces down, radios off, BlueZ adapters powered down) and full restorationproteus apply [--yes]— orchestrator across every enabled component, prints risk warnings before applying breaking knobsproteus revert [--yes]— back out Proteus's network-layer side-effectsproteus diff— drift between config, defaults, and live state (with managed-file SHA edit-detection; tamper hint, not an integrity guarantee against an attacker with write access)proteus dry-run <cmd>— preview any mutator without applyingproteus timer status / list / enable / disable / set / reset / logs— manage the systemd timers without scriptingproteus probe— manual probe quorum check against the configured targetsproteus config show / get / set / enable / disable / reset / edit / validate / keys— edit/etc/proteus/config.tomlwithout touching TOML by handproteus doctor— read-only health check (ok / warn / fail / skipper check); now reports theBackend,Initsystem, package-format, and quirky-setup matrixproteus reset— restore config to defaults; cached originals are sacred and untouchedproteus uninstall [--purge]— full removal hatchproteus completions <bash|zsh|fish>— print the bundled shell completions on stdoutproteus wiki [page]— curated TOC by default, or render any embedded wiki page to the terminal (markdown to ANSI on TTY, raw on pipe,NO_COLORhonored)proteus wiki search <query>— full-text search across every embedded page- Aliases:
proteus s→status,proteus r→rotate,proteus a→apply.--watch [--interval]onstatus/current/session.
Full per-feature plan in docs/PLAN.md. Comparison to existing tools in docs/PRIOR-ART.md.
The mission is local controllable fingerprint reduction — every identifier the OS / NetworkManager / BlueZ / kernel / supplicant can rewrite, plus the parts of the RF surface software can shape (TX power, probe behavior, scan policy). Things controlled by another tool's layer stay with that tool. So Proteus is not:
- a TLS or browser fingerprint tool — use Tor Browser, librewolf, or Brave's randomization
- a DNS-privacy tool beyond the one ECS-strip knob — use dnscrypt-proxy, NextDNS, AdGuard Home, or Pi-hole
- a tracker blocker — use Pi-hole, NextDNS, or uBlock Origin
- a traffic correlation defense — use Tor or Mullvad VPN
- a hardening framework — Proteus refuses to weaken Fedora's
crypto-policies, touch/etc/ssh/ssh_config, or rotate/etc/machine-id - an SSH client fingerprint tool — your
ssh_configis yours - a fix for hardware-baked RF fingerprints (oscillator drift, DAC nonlinearity, IQ imbalance) — those need a swappable USB Wi-Fi adapter, not software
proteus wiki threat-model and proteus wiki rf-fingerprinting spell out the boundary so you do not over-trust the tool.
git clone https://github.com/Kit3713/Proteus.git && cd Proteus
cargo build --release
sudo ./install.sh
proteus doctor
proteus status
sudo proteus apply --yesproteus doctor is read-only and tells you what will work on this host before you change anything. proteus status shows per-feature applied / skipped (reason) / failed (reason). proteus apply is idempotent — running it ten times converges to the same state as running it once.
For the first-time tutorial, run proteus wiki getting-started.
When a Linux system joins a coffee-shop, hotel, conference, or airport network it announces itself loudly — MAC, hostname in the DHCP request, _workstation._tcp mDNS broadcast, IPv6 address derived from the MAC, and a probe-request burst naming every saved SSID. Network-side analytics platforms key on those. Proteus shuts them up.
Proteus is one layer in a defense-in-depth stack. It pairs naturally with:
- Tor Browser or LibreWolf for the L7 browser fingerprint
- dnscrypt-proxy, NextDNS, AdGuard Home, or Pi-hole for DNS resolution policy
- Mullvad or Tor for IP-layer correlation and traffic analysis
- A swappable USB Wi-Fi adapter when the RF threat is targeted SDR-in-the-room (Proteus reduces the OS-controllable RF surface; it cannot change your chip's analog characteristics)
Each layer is its own complex world and deserves its own tooling. Proteus owns the surface that the local OS can rewrite. It refuses to overstep — the detect-and-defer guards on DNS and NTP are deliberate, your tool wins. See proteus wiki hostile-environments for the field guide, proteus wiki threat-model for the boundary discussion, and proteus wiki rf-fingerprinting for the RF half.
- Linux with systemd
- NetworkManager (managed via DBus, no
nmclishelling) - systemd-resolved
- BlueZ for the Bluetooth features (optional)
- firewalld or nftables for the future discovery blocks (optional)
- Glibc or musl
- Fedora 43+ is the primary target; other modern systemd distros are secondary
git clone https://github.com/Kit3713/Proteus.git && cd Proteus
cargo build --release
sudo ./install.shinstall.sh is POSIX-shell (no bashisms). It copies the binary to /usr/local/bin, creates /etc/proteus and /var/lib/proteus, installs the systemd units from dist/systemd/ if present, and applies SELinux file contexts on systems where semanage is available. It does not run proteus apply for you — applying is mutating, you should review your config first.
A PolicyKit action policy from dist/polkit/ is also installed when /usr/share/polkit-1/actions/ exists. This file is a UX hint to GUI wrappers that elevate via pkexec — it provides the desktop password-prompt text and the auth_admin defaults — and is not a binary-side authorization gate. The proteus binary never consults polkit; the only real privilege gates are sudo and pkexec. Anyone with sudo can run sudo proteus apply directly and bypass the policy entirely. See dist/polkit/README.md for the full framing.
Packaging recipes for the major distributions:
dist/arch/— Arch Linux PKGBUILDdist/rpm/— Fedora / RHEL RPM spec + Copr configdist/debian/— Debian / Ubuntu deb packaging (amd64 + arm64)dist/nix/— NixOS module + flake
Each directory has a README.md with build instructions for that distro.
sudo proteus uninstall # remove binary + systemd units; keep config and state
sudo proteus uninstall --purge # also clear /etc/proteus and /var/lib/proteus./uninstall.sh is a thin wrapper around the same code path so distro packages can reuse it.
Run proteus wiki (no args) for the curated TOC, or proteus wiki search <term> for full-text search across every embedded page.
Suggested entry points:
proteus wiki getting-started— first-time tutorial: doctor, current, first rotation, cadence, daily mental modelproteus wiki concepts— mental model: identifiers, rotation, captive portals, managed files, revertproteus wiki hostile-environments— field guide for cafes, hotels, conferences, airports, hostile actorsproteus wiki threat-model— what Proteus does not do and which tool to reach for insteadproteus wiki cli— full command reference, exit codes, JSON schemasproteus wiki troubleshooting— symptom-based recovery recipes
Project-level docs:
- docs/PLAN.md — what is being built and in what order
- docs/ROADMAP.md — operational status by stream
- docs/ISSUES.md — full issue inventory feeding the v0.4.x cycle
- docs/PRIOR-ART.md — what already exists and where Proteus fits
- CHANGELOG.md — release notes per version
- SECURITY.md — how to report vulnerabilities
- CONTRIBUTING.md — how to help
See CONTRIBUTING.md. The major phases are landed; v0.4.x is hardening across ten parallel streams (see docs/ROADMAP.md). The streams are partitioned by file area, so multiple contributors can work simultaneously without merge conflict. The open frontiers folded into Stream 10 are real-world testing on diverse Wi-Fi (coffee shops, hotels, conferences with quirky DHCP servers), independent security review of the threat model + DBus surface, and distro adoption (AUR/Copr/Debian-unstable submissions need a packager sponsor). Pick any ⏳ row and open an issue first if it is non-trivial.
GPL-3.0-or-later — see LICENSE. If you distribute a modified version of Proteus, you must release the source under GPLv3 (or later) as well.
Contributions are accepted under the same terms.