Cyber Controller v2.0.0
The 2.0 line graduates from beta to stable. This is the reformed single-window GUI, and the release the in-app updater offers to everyone on 1.8.0.
Highlights on top of the reform: the Ace Purple palette, a searchable + category-grouped firmware flasher, BFFB (Flipper expansion) as a one-pick ESP32-C5 board, Marauder support current to v1.15.1, and a Flock map that follows your live GPS.
🔧 Rebuilt 2026-09-03 (same 2.0.0, fixed binaries)
A live-hardware session + two deep red-team passes (whole-project, then firmware-by-firmware and feature-by-feature) turned up real issues; these binaries were rebuilt to include the fixes:
- Detects the firmware already on a board when you connect (a CYD running Marauder no longer reads as "no firmware").
- The web password is now shown in Settings ▸ Remote Access (local session only) so you can open the UI from a phone.
- Flash feedback works — the live socket was dropping right after connecting, so progress/results silently never showed; pinned to long-polling, plus a phase status line, live %, an explicit ✔/✖, and a hold-BOOT callout.
- Safety consent gate closed a hole — ~65 offensive verbs whose danger is metadata-only could fan out / auto-fire without the authorized-use confirm; the web broadcast/macro/rule gates are now firmware-aware.
- Firmware profiles — grounded fixes to wrong-chip brick paths (ESP32-DIV cyd/v1 flashed as S3; three Marauder C5 boards), Flipper installing the SDK/scripts package instead of firmware, and Meshtastic phantom boards; MeshCore + CatSniffer version bumps.
- Hunt — the Wi-Fi Encryption column is live again and web tail/follower detection actually works.
- UI — the firmware picker is grouped into collapsible categories; the dashboard serial terminal collapses so it stops forcing constant scrolling.
Full detail in the changelog below (see "Fixed — 2026-09-03 re-cut").
Unsigned build — Windows SmartScreen will warn (More info → Run anyway). Verify with the attached
SHA256SUMS.txt; VirusTotal results are posted below by CI. Portable.exe= run it, nothing installed;-setup.exe= installer.
[2.0.0] — 2026-09-02
The 2.0 line graduates from beta. This is the first stable cut of the reformed single-window GUI, and the
first release the in-app updater offers to everyone on 1.8.0. See [2.0.0-beta] below for the reform's full
scope; the items here are what landed on top of it.
Added
-
Antenna length calculator —
--antenna <freq>(e.g.433,433MHz,2.4GHz) prints the free-space
wavelength and the full / 5-8 / half / quarter / eighth element lengths in cm, in, mm, and m, with a
best-effort band label and an optional--antenna-vfvelocity factor (1.0 free-space, ~0.95 real wire,
a coax's VF for a stub). Also a GET/api/antenna?freq=&vf=route so a GUI card can reach it later. Pure
math (src/core/antenna_calc.py), no device I/O, transmits nothing; 23 tests pinned to the 433 MHz worked
example (69.2 cm / 17.3 cm quarter-wave). Rough-in — the GUI surface comes once the layout is decided. -
Wardrive: upload a saved WiGLE CSV from the reform UI — MAP▸Wardrive now has an "Upload saved CSV" action
that hands an already-exported WigleWifi CSV to WiGLE through the existingwardrive_uploadcore
(POST /api/wardrive/upload, auth + CSRF gated). Credential-gated: nothing is sent until a WiGLE token is
set in Settings, and the target is the one fixed HTTPS endpoint (no user-supplied URL). The desktop shell's
file picker gets awardriveCSV filter. Starting a live survey still needs a connected GPS device, so those
buttons stay honestly gated — only uploading an existing CSV is device-independent and now wired. -
Wardrive export to KML, GPX & GeoJSON —
--wardrive-kml <csv>/--wardrive-gpx <csv>/
--wardrive-geojson <csv>convert a WiGLE wardrive CSV to KML (Google Earth), GPX 1.1 waypoints, or a
GeoJSON FeatureCollection on stdout (one feature per network at its strongest-RSSI position). Pure
serializers (wigle_csv_to_kml/wigle_csv_to_gpx/wigle_csv_to_geojson) built on the existing
header-aware WiGLE reader, so 1.4/1.6/Kismet CSVs all work. The attacker-controlled SSID/BSSID are
XML-escaped + XML-1.0-illegal control chars stripped for KML/GPX (json escaping for GeoJSON), so the
output always parses. Read-only; transmits nothing. -
POSEIDON flash profile (
GeneralDussDuss/poseidon) — keyboard-first pentest firmware for the M5Stack
Cardputer-Advance (ESP32-S3). Tracks the latest upstream release and flashes theposeidon-factory.bin
merged image at0x0(the same offset the project's own web installer uses); theposeidon-launcher.bin
app-slot variant is intentionally not selected. The v0.6.8 factory image is SHA-256-pinned. Labeled
illegal-tx(it ships a 2.4GHz CW/broadband + sub-GHz jammer among its features) per the same convention
as the other jammer-bearing profiles — flash-and-study for an authorized lab; CC authors no TX. Brings the
bundled profile count to 51. -
M5Launcher flash profile (
bmorcelli/Launcher, formerly M5Stick-Launcher) — the multi-board firmware
launcher / SD app-loader that boots Marauder, Bruce, and any.binfrom an SD card. Tracks the latest
upstream release (v2.8.0 ships ~70 per-board images) and flashes the matchingLauncher-<board>.binmerged
image at0x0; the chip family is derived from the board name and esptool auto-detects at flash. Covers the
M5Stack Cardputer/CoreS3/StickC family, the Cheap Yellow Display fleet, and many LilyGo boards across
ESP32 / S3 / C5 / C6. Labeled non-dangerous — the launcher authors no TX; whatever firmware you load onto it
carries its own profile + danger label. Brings the bundled profile count to 52. (Requested: "add the
ability to flash 'launcher' by bmorcelli"; also on ESP Terminator's supported list.) -
Flock map: Follow GPS. The ALPR-camera map can now center on a connected device's live GPS instead of a
typed bounding box. Toggle Follow GPS and it loads only a small window (~1 km) around you, drops a "you"
marker, and recenters as you move. Heavily optimized: it re-fetches from OpenStreetMap only after you've moved
~800 m (hysteresis), keeps a small cache of recent windows, and evicts (sleeps) any area you've moved away
from so memory stays bounded. New/api/gpsserves the live fix from aGpsTrackerfed by every
connection's NMEA stream (read-only; drives no device, transmits nothing). The manual bbox still works when not
following. (GpsTracker+ endpoint + classifier are unit-tested; the live follow needs a GPS-equipped board.) -
Flasher picker: search + category grouping. The DEVICE ▸ Firmware list used to be one long
~50-row scroll. It now has a live search box and a category dropdown (Wi-Fi/BLE multitools,
Wardriving, Mesh/LoRa, Sub-GHz/RF & SDR, Detectors, Pwnagotchi, Flipper Zero, Launchers & OS,
Offensive/lab-only), and the rows are grouped by category. Presentation only — the classifier keys off
the display name and never changes which binary flashes; the/api/flash+/api/variantscontracts
are untouched. -
BFFB (Flipper Zero expansion) support — the Marauder profile now lists the BFFB as its own ESP32-C5
board ("BFFB (Flipper Zero expansion, Dev Board Pro)"), so it flashes with one pick and the correct C5
0x2000offsets. New docs/BFFB.md guide (grounded in the koko wiki) covers the board's
radios (dual CC1101 400/900 MHz, Ebyte NRF24, onboard GPS), flashing via CC, the Flipper WiFi Marauder app
path, and an honest split of what CC drives over USB serial (Wi-Fi/BLE/GPS) vs. what the Flipper drives over
GPIO (the CC1101/NRF sub-GHz side). -
Marauder v1.15.x maintenance commands — the Operate command palette now exposes the four device-local
verbs added since v1.14.0:protocolinfo(query the firmware's machine-protocol + backup capabilities),
backupspiffs,backupstatus, andrestorespiffs(restore the device SPIFFS from an SD backup; the device
reboots on success). All SAFE — device-local filesystem/info, no RF — grounded against the real
CommandLine.cppat tag v1.15.1. Closes the v1.14.0→v1.15.1 Marauder command gap (the rest was already covered).
Changed
- GUI palette — "Ace Purple". The reformed GUI's color system is retuned so purple is the primary
action color (buttons, active/selected states, titles), the neutrals carry a purple bias, and green is
reserved for the live / SAFE / ok signal. The old neutral blue-grays are gone; every color now flows from
the:roottokens inreform.css. Owner-picked from a five-way palette comparison. (No acid green — the
test_no_acid_greenguard still holds.) - ESP32 Dual-Band Wardriver profile updated v2.3.0 → v2.3.2 (
justcallmekoko/ESP32DualBandWardriver,
2026-08-19 release). The app image (c5_wardriver_v2_3_2_20260819_c5_devkit.bin) is re-pinned to its real,
freshly-downloaded SHA-256 (12a4ec28…); the ESP32-C5 bootloader (0x2000) and partition table (0x8000)
are byte-identical to v2.3.0 and keep their existing pinned digests. Offsets cross-checked against the
release's ownfirmware-manifest.json(sourceCommit35b3c1b3). Still passive receive-only — CC flashes
the upstream release and adds no capability. Profile count unchanged (51 — this was already a bundled
profile, not a new one).
Security
safety.pyworst_of()now fails closed. An unrecognised danger label ranks above every known level
(_SEVERITY.get(lvl, len(_SEVERITY))) instead of defaulting to0/SAFE, so a mislabeled or future danger
class is treated as most-severe and still hits the consent gate. Matchesshould_confirm; regression test added.
VirusTotal
Every binary is scanned before release. Unsigned PyInstaller executables normally trip a few heuristic engines — the full reports:
| File | Detections | Report |
|---|---|---|
cyber-controller-v2.0.0-linux-arm64 |
0/61 | report |
cyber-controller-v2.0.0-linux-x64 |
0/60 | report |
cyber-controller-v2.0.0-macos-arm64 |
0/61 | report |
cyber-controller-v2.0.0-windows-x64-setup.exe |
1/67 | report |
cyber-controller-v2.0.0-windows-x64.exe |
2/69 | report |