Compare commits
No commits in common. "master" and "android-v0.4.0" have entirely different histories.
master
...
android-v0
|
|
@ -3,237 +3,6 @@
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 2026-06-27 — LAN standardisé 192.168.10.0/24 + c3box/gk2 live Freebox + bump 1.10.0 (#760)
|
|
||||||
|
|
||||||
Session terrain "c3box derrière Freebox" : la LAN SecuBox par défaut (`br-lan 192.168.1.1/24`)
|
|
||||||
entrait en collision avec la LAN d'un routeur opérateur courant (Freebox/Livebox en
|
|
||||||
`192.168.1.0/24`). En aval d'une Freebox, le WAN DHCP et la LAN se retrouvaient sur le **même
|
|
||||||
sous-réseau** → route dupliquée, ARP ambigu, IP de management injoignable.
|
|
||||||
|
|
||||||
### A. Constat live + remédiation immédiate
|
|
||||||
- **c3box** (second MOCHAbin) derrière Freebox : WAN `eth2=192.168.1.94` (bail Freebox) +
|
|
||||||
`br-lan=192.168.1.1/24` → `.94` injoignable depuis le LAN. Corrigé live : `br-lan → 192.168.10.1/24`.
|
|
||||||
SSH root activé, webadmin `https://192.168.1.94/` OK, `/dev/sda1` (931 G) monté sur `/data`
|
|
||||||
(style gk2 : UUID + nofail), partition eMMC retirée (`emmc-data`).
|
|
||||||
- **gk2** (live PoC) : uplink déplacé de `lan0` (DSA) vers le port cuivre WAN `eth2` ; netplan
|
|
||||||
réparé via **série** (gk2 hors-réseau le temps du switch) → `eth2 dhcp4: true`, `lan0` dépouillé.
|
|
||||||
Bail Freebox réservé sur le MAC eth2 `f0:ad:4e:27:88:9b` → gk2 reprend `192.168.1.200`. Persisté.
|
|
||||||
|
|
||||||
### B. Standardisation source (LAN = 192.168.10.0/24, gw .10.1) — 17 fichiers
|
|
||||||
- Netplans board : mochabin, espressobin-v7, espressobin-ultra, x64-vm, x64-live (`br-lan`),
|
|
||||||
+ unification VM vm-x64/vm-arm64 (`192.168.100.1 → 192.168.10.1`).
|
|
||||||
- Générateurs de netplan : `secubox-netmodes`, `secubox-hub` (preview), `secubox-net-detect`.
|
|
||||||
- dnsmasq (`espressobin-v7.conf`) : `dhcp-range` + `option:router` + `option:dns-server`.
|
|
||||||
- Scripts live-usb (mochabin/ebin) + SAN des certs auto-signés (`firstboot`, `build-image`,
|
|
||||||
`build-rpi-usb`, `build-live-usb`) → `IP:192.168.10.1`.
|
|
||||||
- **Hors scope (intacts)** : `192.168.255.1` (whitelist mgmt/trusted-proxy WAF/mail/wg/mitm),
|
|
||||||
listes `GATEWAYS` de sonde WAN, exemples remote-ui/round + tests.
|
|
||||||
|
|
||||||
### C. Release
|
|
||||||
- Bump mineur (« medium ») **1.9.0 → 1.10.0** : `build-image.sh`, `build-live-usb.sh`,
|
|
||||||
`build-ebin-live-usb.sh`, `build-rpi-usb.sh` (mochabin-live reste sur sa piste 2.0.0).
|
|
||||||
- Artefacts amd64 (x64) reconstruits depuis cette base.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 2026-06-27 — Netboot live PROUVÉ + première install SecuBox Debian sur c3box (second MOCHAbin) (#748 #737)
|
|
||||||
|
|
||||||
Grande session hardware : netboot gk2→c3box validé de bout en bout, premier SecuBox Debian installé
|
|
||||||
sur un vrai MOCHAbin, et le blocage U-Boot qui empêche #748 de fermer est formellement documenté.
|
|
||||||
|
|
||||||
### A. Netboot gk2 → c3box : validé en prod
|
|
||||||
|
|
||||||
- **c3box** (second MOCHAbin, Armada 7040) a booté l'installeur SecuBox Debian servi par gk2 via
|
|
||||||
TFTP : factory U-Boot 2020.10 → `tftpboot Image/dtb/initrd` → `booti` → rescue shell installeur,
|
|
||||||
kernel custom 6.12.85 #5secubox. Le FIT signé (49 Mo) était servi en HTTP sur `:8099`.
|
|
||||||
- Le long détour cabling était une impasse LAB (prouvé via gk2 bridge-FDB + test DHCP) — aucun
|
|
||||||
bug logiciel.
|
|
||||||
- **Learnings opérationnels réutilisables** (documentés dans `wiki/Netboot-Install.md`) :
|
|
||||||
- Factory U-Boot 2020.10 s'interrompt sur **Enter** (pas Ctrl-C), `bootdelay=2`.
|
|
||||||
- Son env n'est PAS dans SPI mtd2 (env étranger fossile) → `fw_setenv` depuis Linux n'a aucun
|
|
||||||
effet ; seule la config U-Boot interne compte.
|
|
||||||
- Seul le port cuivre RJ45 unique = `mvpp2-2` est bootable par le factory U-Boot (les 4 ports
|
|
||||||
switch nécessitent le driver MV88E6XXX DSA, absent au boot).
|
|
||||||
- Kernel load à `0x02080000` = adresse mémoire réservée → crash immédiat ; utiliser `0x0a000000`.
|
|
||||||
- `setenv tftpblocksize 1468` pour TFTP rapide.
|
|
||||||
|
|
||||||
### B. #748 enhanced Tow-Boot (HTTP/wget bootloader) — DIFFÉRÉ, bloquant documenté
|
|
||||||
|
|
||||||
Branche `feature/748-enhanced-tow-boot-http-netboot-serial-fl` (stackée sur #737) :
|
|
||||||
spec+plan (`docs/superpowers/`), Kconfig Tow-Boot, `build-uboot-overlay.sh --tow-boot`,
|
|
||||||
plan serial-flasher, CI `.github/workflows/build-tow-boot.yml` (push-triggered).
|
|
||||||
|
|
||||||
**Bloquant dur (ciseau)** : le board MOCHAbin n'existe que dans le fork U-Boot 2022.07 de
|
|
||||||
Tow-Boot (pas de `wget`) ; `wget` n'existe que dans U-Boot stock ≥2023.07 (pas de board
|
|
||||||
mochabin/DTS). Bump à stock 2023.07 = `wget` compile mais build sans DTS. Pour débloquer :
|
|
||||||
backporter wget/TCP dans le fork Tow-Boot 2022.07, OU porter le board mochabin vers mainline
|
|
||||||
≥2023.07. Pas un tweak de config.
|
|
||||||
|
|
||||||
### C. PREMIÈRE INSTALL — c3box → SecuBox Debian (la headline)
|
|
||||||
|
|
||||||
- **Image** : artefact CI `secubox-mochabin-bookworm` (run 27426515472, 1,8 Go gzip / 8,0 Gio
|
|
||||||
décompressé), téléchargée sur gk2 `/data`, SHA256SUMS vérifié.
|
|
||||||
- **Signature** : clé `secubox-netboot.key` de gk2. Vérifié : cette clé FIT == `netboot-image.pub`
|
|
||||||
embarquée dans l'installeur (modulus match + roundtrip sign/verify). `sbx.img.gz` + `.sig`
|
|
||||||
publiés dans le root HTTP netboot, servis sur `:8099` (symlink depuis `/data`).
|
|
||||||
- **Install automatisé depuis le rescue shell** :
|
|
||||||
`wget sbx.img.gz` (en RAM, c3box a 8 Go) →
|
|
||||||
`openssl dgst -verify` contre `netboot-image.pub` (résultat : Verified OK) →
|
|
||||||
`gunzip | dd of=/dev/mmcblk0 bs=4M conv=fsync` (8 Gio, progression 32→62→94→100%) → sync.
|
|
||||||
- **c3box démarre SecuBox Debian v1.9.0** — hostname `secubox-mochabin`, kernel Debian
|
|
||||||
6.1.0-47-arm64, stack complète : secuboxd, hub, grafana, zigbee, mqtt, authelia,
|
|
||||||
sentinel/rogue-BTS (layers WALL+MIND). Creds root/secubox, Web UI `:9443`.
|
|
||||||
- **Fix auto-boot persistant** : l'image utilise `extlinux.conf` à `0x02080000` (adresse réservée
|
|
||||||
factory U-Boot → reset immédiat) et ne livre pas de `boot.scr` compilé. Construit
|
|
||||||
`/boot/boot.scr` (kernel@`0x0a000000`, initrd@`0x10000000`, `console=ttyS0` + earlycon,
|
|
||||||
`root=LABEL=rootfs`) : le factory U-Boot charge `boot.scr` depuis mmc et démarre Debian sans
|
|
||||||
intervention. **VÉRIFIÉ** : reboot sans intervention → login Debian.
|
|
||||||
- **Layout eMMC installé** : GPT p1=boot (FAT, `/boot`) p2=ROOT (`/`) p3=DATA. c3box était
|
|
||||||
OpenWrt ; eMMC écrasé (install RAM-only, pas de risque sur l'OS tournant avant le `dd`).
|
|
||||||
- **Rig netboot temporaire gk2 encore actif** : `lan1=192.168.77.1/24`, dnsmasq test (DHCP) sur
|
|
||||||
`lan1`, `nft iif lan1 accept`, nginx boot-vhost extra listen `192.168.77.1:8099`.
|
|
||||||
|
|
||||||
## 2026-06-24 (cont.) — R4 analyst mode: MITM-everything + media reverse-catcher + clone (#736)
|
|
||||||
|
|
||||||
New "R4" doctrine — visibility over performance. Delivered + live on gk2:
|
|
||||||
- **Splice flip** — `tls-splice-seed.conf` reduced from a media-CDN perf list to
|
|
||||||
breakers-only (`api.anthropic.com`); splice now applied ONLY where MITM provably
|
|
||||||
breaks (cert pinning). Banner reaches every page; catcher sees media URLs. Live:
|
|
||||||
learned splices cleared, autolearn gated (`tls_splice=off`).
|
|
||||||
- **sbxmitm media reverse-catcher** (`cmd/sbxmitm/mediacatch.go`, toolbox-ng 0.1.20)
|
|
||||||
— 2xx MITM'd flows → cloneable media URLs (HLS/DASH manifests, direct A/V,
|
|
||||||
googlevideo videoplayback) appended to `/run/secubox/media-catch.jsonl` (URLs
|
|
||||||
only, deduped, atomic, fail-open). `--media-catch` default on; worker unit
|
|
||||||
`ReadWritePaths=/run/secubox`.
|
|
||||||
- **mediaflow Discovered Media + Clone** (2.1.0) — `/discovered`, `/clone`
|
|
||||||
(yt-dlp→ffmpeg queue, lazy worker for the aggregator), `/library`,
|
|
||||||
`/download/{id}`, DELETE; dashboard cards. Verified: HLS caught → ffmpeg →
|
|
||||||
464 MiB mp4 in library. yt-dlp installed.
|
|
||||||
- Also fixed the empty mediaflow dashboard (2.0.2 contract + 2.0.3 cumulative
|
|
||||||
services): cards/streams live, Top Media Services from DPI cumulative store.
|
|
||||||
KEY: dashboard routes via the **aggregator** (in-process import) — restart
|
|
||||||
`secubox-aggregator` to pick up mediaflow code changes.
|
|
||||||
- Phase 4 done — R4 button added to the banner topbar (R0..R4) + set-level + by-MAC
|
|
||||||
validation + analytics buckets; gated to the wg path like R3 (secubox-toolbox 2.7.20).
|
|
||||||
- yt-dlp upgraded 2023.03.04 → 2026.06.09 (standalone binary; YouTube works).
|
|
||||||
- Recos: catcher now captures YouTube watch **pages** (kind=page, toolbox-ng 0.1.22);
|
|
||||||
Discovered Media persisted off tmpfs into a durable capped store (mediaflow 2.1.1);
|
|
||||||
yt-dlp packaged (Recommends + weekly refresh timer + postinst).
|
|
||||||
- **Catch-log ownership bug** — `/run/secubox/media-catch.jsonl` was created
|
|
||||||
`secubox`-owned while the worker runs as `secubox-toolbox`, so O_APPEND failed
|
|
||||||
silently → nothing captured. Fixed with a tmpfiles.d entry pre-creating it owned
|
|
||||||
by the writer every boot (zz-secubox-toolbox-ng.conf). Live: rm + worker recreate.
|
|
||||||
|
|
||||||
## 2026-06-24 (cont.) — Banner on nonce-CSP sites + Claude API splice + YouTube unblock (#728)
|
|
||||||
|
|
||||||
Three distinct root causes behind "no banner on youtube / news", fixed in order:
|
|
||||||
|
|
||||||
1. **Trusted Types** (0.1.17) — `require-trusted-types-for` blocked DOM injection. Stripped.
|
|
||||||
2. **Nonce-based CSP** (0.1.18) — the banner is *inlined* (service-worker-proof), but a CSP
|
|
||||||
nonce/hash makes `'unsafe-inline'` IGNORED → the bare inline `<script>` was silently
|
|
||||||
blocked. `relaxCSPForLoader` now **borrows the page's own nonce** and stamps it on the
|
|
||||||
injected `<script nonce=…>` (surgical: page CSP/nonces/hashes untouched), falling back to
|
|
||||||
forcing `unsafe-inline` (drop nonce/hash/strict-dynamic) only when there's no nonce.
|
|
||||||
Nonce validated to base64 charset (attribute-breakout guard). Threaded nonce through
|
|
||||||
injectIntoBody → injectHTML → injectInlineBanner. Tests rewritten for inline semantics.
|
|
||||||
3. **YouTube wholly blocked** (runtime) — autolearn false-positive put `youtube.com` in
|
|
||||||
`/var/lib/secubox/toolbox/learned-trackers.txt` → `Decide()` returned `block` (204) →
|
|
||||||
page never loaded. Removed from learned + added to `ad-allowlist.txt` (hot-reloaded).
|
|
||||||
Latent-bug tracker: **#735** (autolearn must not block apex/first-party nav targets).
|
|
||||||
|
|
||||||
**Claude API splice** (user request) — `api.anthropic.com` added to `tls-splice-seed.conf`
|
|
||||||
(+ live seed): cert-pinned Claude API/SDK clients reject the MITM CA, so pass them through;
|
|
||||||
`claude.ai` web stays MITM'd (browser trusts the CA → still gets the banner).
|
|
||||||
|
|
||||||
Verified end-to-end on gk2: YouTube 200 + banner nonce == page nonce; lemonde/lefigaro
|
|
||||||
banner via unsafe-inline fallback. DPI confirmed healthy — collector writes to
|
|
||||||
`/var/lib/secubox/dpi/` (state.json/cumulative.json fresh), `/exfil` returns categorized
|
|
||||||
flows; the earlier "empty" was me checking the wrong paths (`/run/secubox/dpi`).
|
|
||||||
|
|
||||||
## 2026-06-24 — DPI YouTube bannering: strip Trusted Types CSP (#728)
|
|
||||||
|
|
||||||
- **Root cause** — YouTube serves a standalone `Content-Security-Policy:
|
|
||||||
require-trusted-types-for 'script'` header. sbxmitm's `relaxCSPForLoader` already
|
|
||||||
relaxed `script-src` (drop `strict-dynamic`, add `'self'`/`'unsafe-inline'`) so the
|
|
||||||
banner loader runs, but Trusted Types still blocked the banner's DOM injection →
|
|
||||||
banner silently never mounted on YouTube.
|
|
||||||
- **Fix** (`cmd/sbxmitm/csp.go`, toolbox-ng 0.1.17) — drop `require-trusted-types-for`
|
|
||||||
and `trusted-types` directives during the relax; omit the resulting empty CSP header
|
|
||||||
line. Local Go unit tests cover both the relax and the empty-header drop.
|
|
||||||
- **DPI capture half** — collector `state.json` was stale (frozen 09:44); restarted
|
|
||||||
`secubox-dpi-flowcap` → fresh windows, YouTube/media flows now visible in mediaflow.
|
|
||||||
- Deployed to gk2; R3 workers `secubox-toolbox-ng-worker@1..4` restarted on 0.1.17.
|
|
||||||
- Filed for later: #729 wireguard peers/tabs, #730 yacy, #731 lyrion, #732 magicmirror,
|
|
||||||
#733 firewall dashboard misreport, #734 webui.conf hardcoded-route cleanup.
|
|
||||||
|
|
||||||
## 2026-06-22 — DPI exfil engine + Netrunner report (HTML+PDF) + sbxmitm fixes
|
|
||||||
|
|
||||||
Big session: full per-device DPI exfiltration pipeline, the kbin report reborn as a
|
|
||||||
cyberpunk-netrunner character sheet, and two live-ops fixes on the Go MITM engine.
|
|
||||||
All PRs merged to master and deployed live on gk2.
|
|
||||||
|
|
||||||
### DPI — per-device cloud-exfiltration (#687, secubox-dpi 1.0.5 → 1.1.2)
|
|
||||||
- **Phase 1** nDPI flow-DPI on `wg-toolbox` (ndpiReader, ~1% CPU on the Armada).
|
|
||||||
- **Phase 2** Go collector (`secubox-dpi-collector`, pure stdlib, arm64): attributes
|
|
||||||
flows to devices via `sha256(wg_pubkey)[:16]`, classifies SNI into nDPI-style
|
|
||||||
**categories** (cloud/filehost/messaging/ai/media/game/social/adult), fires exfil
|
|
||||||
scenarios (`exfil_volume`, `new_cloud`, `beaconing`, `unclassified_external`).
|
|
||||||
Producer = `secubox-dpi-flowcap` (60s windows) → `GET /api/v1/dpi/exfil`.
|
|
||||||
- **Dashboard** (#693/#695): "Cloud Exfiltration Watch" panel + stat cards + all list
|
|
||||||
cards repointed off the inactive netifyd to the live exfil engine.
|
|
||||||
- **#692** beaconing tuned to a C2-plausible cadence (1s–1h, CV≤0.25, external).
|
|
||||||
- **#705 cumulative 7d** — `cumulative.json` so the report shows history, not just the
|
|
||||||
last 60s window (was: idle device → all zeros).
|
|
||||||
- **Packaged** `secubox-dpi 1.1.x` (arch arm64, Go built in debian/rules offline,
|
|
||||||
flowcap auto-enabled, `Depends: libndpi-bin`).
|
|
||||||
|
|
||||||
### kbin report — Cyberpunk-Netrunner character sheet (#707, HTML + PDF)
|
|
||||||
- **#699** report tabs (Pistage / DPI-Exfil / Overall) with donut charts.
|
|
||||||
- **#701/#703** DPI stats + visual donut charts in the PDF (mitm/certs/ads/dpi).
|
|
||||||
- **#707** persona sheet: class+emoji from the request UA (live device), level=R3 for
|
|
||||||
wg peers, ICE/Exposition bars, XP, 4 pip-bar CARACTÉRISTIQUES, Inventaire, Bestiaire,
|
|
||||||
Quêtes — HTML neon + PDF `_persona_block`.
|
|
||||||
- **#709** carto hub map + emoji tables (Traceurs/Pays/DPI) in the PDF.
|
|
||||||
- **#711/#712** "En un coup d'œil" added to the PDF.
|
|
||||||
- **#714** charts switched to **matplotlib PNG** embeds (fpdf2 vector donuts were blank
|
|
||||||
in iOS/Chrome viewers).
|
|
||||||
- **#716** donut grid → ONE combined 2×2 image (was spilling each donut/legend onto its
|
|
||||||
own page → 24 pages). Report back to a clean 4 pages. User: "report parfait".
|
|
||||||
|
|
||||||
### sbxmitm (Go MITM engine, #662 line)
|
|
||||||
- **#689** forged leaf cert TTL **24h → 365d** — root cause of recurring "certificat
|
|
||||||
expiré" on clients (cache never evicts; 24h leaves expired daily). Interception kept.
|
|
||||||
- **#697** stop truncating responses >8MiB — `streamResponse()` streams non-injected
|
|
||||||
bodies verbatim; large **Gmail** messages/attachments rendered again over R3.
|
|
||||||
- **#688** own-domain splice approach REJECTED (decision: intercept all vhosts) — reverted.
|
|
||||||
|
|
||||||
### Ops notes
|
|
||||||
- Surf-break incident: R3 mitm CA rotated 2026-06-05 → clients must re-import the CA root
|
|
||||||
(the "expired cert" was client-side trust, not the board).
|
|
||||||
- R3 engine is the Go `sbxmitm` (`secubox-toolbox-ng-worker@1..4`, 10.99.1.1:8091-8094)
|
|
||||||
— NOT the Python mitm; restart THOSE for R3 changes.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 2026-06-20 — kbin Tor shipped + client releases + ad-block/mitm hardening
|
|
||||||
|
|
||||||
- **#683 MERGED (PR #684)** — kbin Tor egress quick-switch (switch + nft owner-match
|
|
||||||
tunnel, own-services exemption, reconciler+timer), dashboard/landing/banner metrics
|
|
||||||
fixes, 🧅 indicators (banner/webext/APK), APK persistent WG identity, landing+report
|
|
||||||
**redesign** (verdict gauge + donut/bars + collapsible details). Live on gk2; Tor armed.
|
|
||||||
- **Client releases served from kbin**: `android-v0.4.0` (Latest) + `webext-v0.1.5`
|
|
||||||
published by CI; pinned webext tag bumped; board fetch-helpers pull them →
|
|
||||||
/wg/toolbox.apk (0.4.0) + /wg/toolbox.xpi (0.1.5). toolbox 2.7.12.
|
|
||||||
- **#685 ad-learner hardened (2.7.13)** — NEVER_LEARN guard (Google/CDN/fonts/captcha/
|
|
||||||
auth/payment), AD_MIN_SITES 1→2, prune existing. Root cause of euronews breakage:
|
|
||||||
the learner had 204'd `www.google.com` → broke reCAPTCHA/consent. Also allowlisted
|
|
||||||
www.google.com/.fr live.
|
|
||||||
- **mitm-wg stream_large_bodies=1m (2.7.14)** — large binary downloads (APK, CA) were
|
|
||||||
corrupted ONLY through the R3 tunnel (HTTP/2 buffer/reframe); now passed verbatim.
|
|
||||||
- **OPEN [#686]** — android-toolbox non-root flow broken (CA auto-install needs root,
|
|
||||||
WG handoff → Play Store, tunnel not detected). Needs on-device dev/testing; rooted-vs-
|
|
||||||
non-rooted decision pending. #685 signing was a red herring (corrupt = mitm buffering).
|
|
||||||
|
|
||||||
## 2026-06-19 — kbin Tor egress quick-switch implemented DARK (#683, ToolBoX 2.7.1)
|
## 2026-06-19 — kbin Tor egress quick-switch implemented DARK (#683, ToolBoX 2.7.1)
|
||||||
|
|
||||||
- **Switch + tunnel** for routing kbin surfing through Tor, shipped **default-OFF /
|
- **Switch + tunnel** for routing kbin surfing through Tor, shipped **default-OFF /
|
||||||
|
|
@ -6758,19 +6527,3 @@ CONFIG_USB_NET_RNDIS_HOST=y
|
||||||
- LAN interfaces scanned: lan0, lan1, lan2, lan3, br0, br-lan, eth0, eth1
|
- LAN interfaces scanned: lan0, lan1, lan2, lan3, br0, br-lan, eth0, eth1
|
||||||
- ARP states mapped to online: REACHABLE, DELAY, PROBE, PERMANENT = online
|
- ARP states mapped to online: REACHABLE, DELAY, PROBE, PERMANENT = online
|
||||||
- STALE, FAILED = offline
|
- STALE, FAILED = offline
|
||||||
|
|
||||||
## 2026-06-24 — build+deploy T0 fixes (#494/#519/#53/#421) + dirs-guard /run self-heal
|
|
||||||
|
|
||||||
- Merged #121/#53/#65; cherry-picked #494 onto master (versions re-bumped above
|
|
||||||
master's advanced core 1.1.8/hub 1.4.6 → core 1.1.9, hub 1.4.7).
|
|
||||||
- Discovered #494 was systemic (7 pkgs chowning /run/secubox parent) AND that
|
|
||||||
91 services declare `RuntimeDirectory=secubox` → systemd re-chowns the parent
|
|
||||||
to secubox:secubox 0755 on each start (#421). Central fix: extended
|
|
||||||
secubox-dirs-guard to re-assert /run/secubox 1777 root:root every minute
|
|
||||||
(core 1.1.10) instead of editing 91 units.
|
|
||||||
- Built + deployed to gk2 (8 pkgs): core 1.1.10, hub 1.4.7, eye-remote 1.0.1,
|
|
||||||
metablogizer 1.2.2, metrics 1.0.4, p2p 1.7.1, wazuh 1.0.1, toolbox 2.7.18.
|
|
||||||
First deploy ssh was timeout-killed mid-toolbox-postinst → recovered with
|
|
||||||
dpkg --configure -a (cleared stale lock). Verified: /run/secubox=1777 root:root
|
|
||||||
holds, 0 half-configured, all services + R3 workers active, webui/portal 200,
|
|
||||||
toolbox blacklist-sync (#519) carried.
|
|
||||||
|
|
|
||||||
161
.claude/TODO.md
|
|
@ -1,164 +1,5 @@
|
||||||
# TODO — SecuBox-DEB Backlog
|
# TODO — SecuBox-DEB Backlog
|
||||||
*Mis à jour : 2026-06-27*
|
*Mis à jour : 2026-06-19*
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ⚪ T5 — Images / OS variants / Hardware (ajouts 2026-06-27)
|
|
||||||
|
|
||||||
### ⬜ MOCHAbin — bootloader propre (adresses réservées + extlinux)
|
|
||||||
|
|
||||||
> Workaround actif : `/boot/boot.scr` compilé forçant le kernel à `0x0a000000`. Fix durable requis.
|
|
||||||
|
|
||||||
- [ ] **Option A — Corriger l'image** : patcher `extlinux.conf` généré par le CI pour utiliser
|
|
||||||
`0x0a000000` (kernel) et `0x10000000` (initrd) au lieu de `0x02080000` (adresse réservée
|
|
||||||
factory U-Boot 2020.10 → reset immédiat). Boot.scr deviendrait redondant.
|
|
||||||
- [ ] **Option B — Enhanced Tow-Boot (#748)** : bloqué par le ciseau U-Boot (voir ci-dessous) ;
|
|
||||||
déverrouille wget/HTTP natif dans U-Boot, supprime le besoin de TFTP pour les futures installs.
|
|
||||||
- [ ] **Valider** que le fix d'adresse tient sur les deux MOCHAbin (gk2 + c3box).
|
|
||||||
|
|
||||||
### ⬜ #748 — wget dans U-Boot pour MOCHAbin (bloquant documenté)
|
|
||||||
|
|
||||||
> Bloquant dur (ciseau) confirmé 2026-06-27. Branche
|
|
||||||
> `feature/748-enhanced-tow-boot-http-netboot-serial-fl` : spec + plan + Kconfig +
|
|
||||||
> `build-uboot-overlay.sh --tow-boot` + CI `.github/workflows/build-tow-boot.yml` en place.
|
|
||||||
> Problème : board mochabin UNIQUEMENT dans fork Tow-Boot U-Boot 2022.07 (pas de `wget`) ;
|
|
||||||
> `wget`/TCP UNIQUEMENT dans stock U-Boot ≥2023.07 (pas de board mochabin/DTS).
|
|
||||||
|
|
||||||
- [ ] **Voie 1** : backporter le stack TCP + `wget` de U-Boot ≥2023.07 dans le fork Tow-Boot
|
|
||||||
2022.07 (mochabin board natif). Diff TCP = `net/wget.c` + dépendances `CONFIG_NET_WGET`.
|
|
||||||
- [ ] **Voie 2** : porter le board mochabin (DTS Armada 7040 + PHY + eMMC) vers U-Boot mainline
|
|
||||||
≥2023.07 (sans Tow-Boot). Plus long mais durable.
|
|
||||||
- [ ] Choisir une voie, débloquer #748.
|
|
||||||
|
|
||||||
### ⬜ Packager le flow netboot + install signé (rig temporaire → procédure reproductible)
|
|
||||||
|
|
||||||
> Actuellement rig manuel sur gk2 : `lan1=192.168.77.1/24`, dnsmasq DHCP, nft, nginx `:8099`.
|
|
||||||
|
|
||||||
- [ ] Scripter la publication de l'image signée dans le root HTTP netboot (wget + sha256 + sig).
|
|
||||||
- [ ] Documenter / packager la config dnsmasq + nft + nginx pour un segment `lan1` dédié.
|
|
||||||
- [ ] Intégrer dans `scripts/deploy-netboot.sh` ou équivalent.
|
|
||||||
|
|
||||||
### ⬜ Teardown rig netboot temporaire gk2
|
|
||||||
|
|
||||||
> Le rig (lan1 bridge, dnsmasq, nft iif lan1 accept, nginx extra listen) reste actif jusqu'à
|
|
||||||
> ce que c3box soit autonome en prod.
|
|
||||||
|
|
||||||
- [ ] Retirer la règle nft `iif lan1 accept` (risque : tout le segment lan1 est accepté sans filtrage).
|
|
||||||
- [ ] Désactiver / retirer dnsmasq test sur lan1.
|
|
||||||
- [ ] Retirer le extra listen `192.168.77.1:8099` du vhost nginx netboot (ou couper le vhost si
|
|
||||||
plus nécessaire).
|
|
||||||
- [ ] Vérifier que c3box auto-boot sans rig (boot.scr en place → OK).
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ✅ Clos 2026-06-22 — DPI exfil + report Netrunner + sbxmitm
|
|
||||||
|
|
||||||
- ✅ **#687 DPI exfil pipeline** — flowcap + Go collector + dashboard + cumulatif 7j,
|
|
||||||
packagé `secubox-dpi 1.1.2` (inclut #692/#693/#695/#705).
|
|
||||||
- ✅ **#707 report kbin = fiche Netrunner** HTML+PDF (#699/#701/#703/#709/#711/#714/#716).
|
|
||||||
- ✅ **#689** sbxmitm cert 365d · **#697** stream >8MiB (Gmail) · **#688** splice rejeté.
|
|
||||||
|
|
||||||
### DPI Phase 3
|
|
||||||
- [x] Enrichissement **ASN** (GeoLite2-ASN) pour l'egress sans SNI — **#719 mergé, live**
|
|
||||||
(`secubox-dpi 1.1.3`, maxminddb-golang vendored).
|
|
||||||
- [x] **Historique + timeline par device** — **#721 mergé, live** (`secubox-dpi 1.1.4`,
|
|
||||||
buckets quotidiens `history.json` 14j + `/api/v1/dpi/history` + panneau Timeline
|
|
||||||
dashboard). NB : JSON daily buckets (pas SQLite — pas de driver CGO dans le binaire
|
|
||||||
statique ; SQL riche reportable si besoin).
|
|
||||||
- [x] Démon **nDPId** — **évalué puis ÉCARTÉ** (#722/#723 revertés). Raison perf :
|
|
||||||
ndpiReader tourne en fenêtres bornées (Nice 15, ~1% CPU, libère le cœur entre
|
|
||||||
les passes) ; nDPId = démon permanent + nDPIsrvd → CPU/RAM **continue** sur une
|
|
||||||
board déjà saturée (load ~4.6/4 cœurs). Gain (JSON riche, pas de respawn) <
|
|
||||||
risque. **Décision : on garde ndpiReader** comme producteur du pipeline exfil.
|
|
||||||
(Le build CI QEMU a aussi échoué au 1er essai → chemin fragile en plus.)
|
|
||||||
|
|
||||||
### ⬜ Cosmétique report PDF (non bloquant)
|
|
||||||
- [ ] Glyphes drapeaux régionaux → lettres (police embarquée). Option : drapeaux PNG.
|
|
||||||
- [ ] Chiffres espacés dans certaines cellules (fallback police).
|
|
||||||
|
|
||||||
### ⬜ APK on-device #685/#686 — NON-ROOT ONLY (plan verrouillé, à faire)
|
|
||||||
> Décision 2026-06-22 : cible **non-root uniquement** ; chemin root abandonné.
|
|
||||||
> Plan détaillé : commentaire #685.
|
|
||||||
- [ ] **VpnService in-app** (`com.wireguard.android:tunnel` / GoBackend wireguard-go)
|
|
||||||
— l'APK EST le client WG, plus de Play Store, détection tunnel in-app fiable.
|
|
||||||
- [ ] **CA en DER** (fix « nom de cert vide » du KeyChain intent) + `network-security-config`
|
|
||||||
pour que la WebView in-app fasse confiance au CA ca-wg.
|
|
||||||
- [ ] Retirer RootShell/RootOnboard/BootReceiver ; manifest VpnService + consent VPN.
|
|
||||||
- [ ] Limite Android : pas de CA **système** sans root → MITM système impossible ;
|
|
||||||
surface « safe browsing » = WebView in-app. À documenter.
|
|
||||||
- [ ] Build via CI `build-android-apk` + **test sur appareil** (gros build, itératif).
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎯 Backlog priorisé — revue 2026-06-24 (64 issues ouvertes)
|
|
||||||
|
|
||||||
> Index d'autorité du triage. Les sections « Phase X » plus bas sont historiques :
|
|
||||||
> plusieurs portent « ✅ COMPLETE » alors que l'issue est restée **ouverte** (livré
|
|
||||||
> mais jamais fermé) → marquées **[vérifier→fermer]** ci-dessous.
|
|
||||||
|
|
||||||
### 🔴 T0 — Régressions & bugs sécurité (petits, débloquants, CSPN priv-sep)
|
|
||||||
- #494 secubox-core ExecStart écrase tmpfiles.d `/run/secubox` *(worktree actif)*
|
|
||||||
- #468 `/etc/secubox` parent 0750 casse la traversée non-secubox *(régression récurrente)*
|
|
||||||
- #471 secubox-mesh postinst écrase perms `/run/secubox` *(régression)*
|
|
||||||
- #421 sockets `/run/secubox` cachés en mount-ns privé (RuntimeDirectory)
|
|
||||||
- #447 kiosk : mot de passe admin semé par le CI (users.json shippe un hash) **← fuite**
|
|
||||||
- #91 haproxyctl régénère haproxy.cfg avec `waf_inspector` inexistant *(intégrité WAF)*
|
|
||||||
- #65 nginx : routes API manquantes dans webui.conf
|
|
||||||
- #53 Wazuh uvicorn 100% CPU spin
|
|
||||||
- #121 metablog ingest : dirs en `secubox:secubox`
|
|
||||||
|
|
||||||
### 🟠 T1 — Plan d'enforcement sécurité (mission CSPN ; détection→action)
|
|
||||||
- #498 Phase 7 — WAF active enforcement (mitm→CrowdSec→nft drop) *(worktree actif)*
|
|
||||||
- ✅ #519 Phase 13 — enforcement plane **FERMÉ 2026-06-22** (livré + réparé :
|
|
||||||
blacklist-sync avortait sur NXDOMAIN + timeout unit → fix `|| true` +
|
|
||||||
TimeoutStartSec 600 ; vérifié live, default-off). Inclut 13.B #522.
|
|
||||||
- #455 secubox-egress — détection egress + corrélation RDS multi-signaux
|
|
||||||
- #500 Phase 8 — Utiq operator-grade tracking (detect/alert/bypass)
|
|
||||||
- #514 Phase 12 — plateforme anti-human-detection (parent ; sous-tracks fermés)
|
|
||||||
- ✅ #515 Phase 12.A CDN cache detection — **FERMÉ** (live, `social_host_meta.cdn_vendor`)
|
|
||||||
- ✅ #516 Phase 12.B anti-bot detection — **FERMÉ** (live via #564/#565, `social_antibot`)
|
|
||||||
- #525 Phase 14 — plan de déception (idée future, parké)
|
|
||||||
- ⬜ Suivi #519 perf (non bloquant) : DNS-guard ne résout que les 2000 premiers
|
|
||||||
domaines/cycle (5523 en base) → couverture partielle ; résolution séquentielle
|
|
||||||
lourde sur board saturé. Option : résolution parallèle bornée + rotation du cap.
|
|
||||||
|
|
||||||
### 🟡 T2 — UX / Hub / conscommateurs report (worktrees actifs + polish)
|
|
||||||
- #615 security-posture dans la sidebar Hub *(worktree actif)*
|
|
||||||
- #655 webext content-script banner CSP-immune *(worktree actif)*
|
|
||||||
- #485 toolbox SOC scoring *(worktree actif)*
|
|
||||||
- #513 ToolBox WebUI : sous-onglets + retrait UI /admin redondante
|
|
||||||
- #69 diagramme flux trafic responsive
|
|
||||||
- #67 cache history-aware glances/netdata
|
|
||||||
- #68 health checks + dépendances services au démarrage
|
|
||||||
|
|
||||||
### 🟢 T3 — Backlog feature (valeur, non bloquant)
|
|
||||||
- #685 APK 'corrupt' — CI signe avec clé éphémère *(plan APK verrouillé)*
|
|
||||||
- #686 android-toolbox flux non-root cassé *(plan APK verrouillé)*
|
|
||||||
- #429 nextcloud dashboard : API stubs au lieu de la vraie instance *(bug)*
|
|
||||||
- #430 nextcloud — fédération OCM (doc/outillage)
|
|
||||||
- #472 nextcloud — Gondwana Desktop (canvas + widgets)
|
|
||||||
- #592 secubox-webmail-hub (Gmail OAuth2 + Gandi + OVH)
|
|
||||||
- #66 auth Google OAuth
|
|
||||||
- #70 Health Banner System *(preplanned)*
|
|
||||||
- #71 CDN proxy injection *(preplanned)*
|
|
||||||
- #393 source-home des scripts health prober
|
|
||||||
|
|
||||||
### 🔵 T4 — Hardware-gated (dépend de pièces ; piste parallèle ; pas de spare EP06)
|
|
||||||
- Modem/PCIe : #254 modules kernel LTE · #255 pins mPCIe modem · #460 DTS cp0_pcie2 ·
|
|
||||||
#467 U-Boot comphy5 SerDes · #462 pivot HW AR9271/MT
|
|
||||||
- Mesh/BLE : #449 WiFi 802.11s · #452 BT mesh · #453 QR multi-canaux · #454 sourcing BLE 5.x
|
|
||||||
- GSM : #347 sentinelle-gsm
|
|
||||||
- Smart-Strip : #33 module HMI · #42 sous-repo · #379 packaging
|
|
||||||
- Eye-remote : #41 sous-repo · #79 buildroot · #127 variante square · #138 radar_concentric ·
|
|
||||||
#155 collision link-rename *(bug)* · #158 multi-gadget L3 · #478 métriques live Round Eye
|
|
||||||
- VILLAGE3B : #480 dossier presse · #497 poster grand public
|
|
||||||
|
|
||||||
### ⚪ T5 — Images / OS variants (basse urgence)
|
|
||||||
- #446 Full Traveller OS multi-mode/arch · #125 build-live-usb +virtualbox · #422 vm-x64 cascade
|
|
||||||
|
|
||||||
### ⚫ T6 — Docs / housekeeping
|
|
||||||
- #81 headers SPDX CMSD-1.0 partout · #243 clarifier scope secubox-zkp-auth *(question)*
|
|
||||||
- #474 ToolBoX (epic parent — garder comme tracker)
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
||||||
115
.claude/WIP.md
|
|
@ -1,118 +1,5 @@
|
||||||
# WIP — Work In Progress
|
# WIP — Work In Progress
|
||||||
*Mis à jour : 2026-06-27*
|
*Mis à jour : 2026-06-19*
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ✅ 2026-06-27 : c3box → SecuBox Debian — première install réussie · netboot prouvé (#748 #737)
|
|
||||||
|
|
||||||
### ✅ Fait (session 2026-06-27)
|
|
||||||
|
|
||||||
- **Netboot gk2→c3box prouvé** — factory U-Boot 2020.10 → TFTP → rescue shell installeur
|
|
||||||
(kernel 6.12.85 #5secubox). Détour cabling résolu (impasse LAB, pas logiciel).
|
|
||||||
- **Première install SecuBox Debian sur un MOCHAbin physique (c3box)** — image CI artefact
|
|
||||||
`secubox-mochabin-bookworm` (run 27426515472, 8 Gio), SHA256 + signature vérifiés,
|
|
||||||
`gunzip|dd` en RAM → eMMC. c3box boot Debian v1.9.0 avec stack complète.
|
|
||||||
- **boot.scr workaround déployé** — extlinux.conf charge le kernel à `0x02080000` (réservé
|
|
||||||
factory U-Boot → reset). Construit `/boot/boot.scr` (kernel@`0x0a000000`) ; auto-boot
|
|
||||||
Debian sans intervention vérifié après reboot.
|
|
||||||
- **#748 bloquant documenté** — ciseau U-Boot : mochabin board UNIQUEMENT dans fork Tow-Boot
|
|
||||||
2022.07 (pas de `wget`) ↔ `wget` UNIQUEMENT dans stock ≥2023.07 (pas de board mochabin).
|
|
||||||
Branche `feature/748-enhanced-tow-boot-http-netboot-serial-fl` parkée (spec+CI+Kconfig en
|
|
||||||
place, dépend du backport wget OU port board mainline).
|
|
||||||
|
|
||||||
### ⬜ Rig netboot temporaire gk2 à démonter (quand c3box autonome)
|
|
||||||
|
|
||||||
- `lan1=192.168.77.1/24` avec dnsmasq DHCP + `nft iif lan1 accept` + nginx `:8099` encore actifs.
|
|
||||||
- À retirer une fois c3box en prod (voir TODO T5 — teardown rig).
|
|
||||||
|
|
||||||
### ⬜ Bootloader propre à faire (#748 ou alternative)
|
|
||||||
|
|
||||||
- boot.scr = workaround ; fix durable = enhanced Tow-Boot (#748, bloqué ciseau) OU corriger
|
|
||||||
les adresses de boot dans l'image (extlinux.conf → `0x0a000000`). Voir TODO T5.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🗂️ 2026-06-22 : triage issues (30 ouvertes → revue obsolètes)
|
|
||||||
|
|
||||||
- **Fermées (user-validé 2026-06-22)** : #722 (nDPId — décidé contre, reverté) ·
|
|
||||||
#475 ToolBoX Phase 1 (live 2.7.x) · #502/#507/#508 Social mapping (carto +
|
|
||||||
/social/me + report PDF live) · #495 Phase 5 mitm-LXC (superseded par #662 Go
|
|
||||||
sbxmitm host) · #531 APK one-tap (superseded par #685/#686 non-root) ·
|
|
||||||
#486 geoip/ASN+flags+catégories dans rapports (livré master : geo.py + dpi_class.py +
|
|
||||||
report wiring ; complémentaire de #718 ASN collector ; worktree stale nettoyé) ·
|
|
||||||
#515 CDN detection (live `social_host_meta.cdn_vendor`) · #516 anti-bot detection
|
|
||||||
(live via #564/#565) · #519 enforcement plane (livré + **réparé** : blacklist-sync
|
|
||||||
avortait NXDOMAIN + timeout unit → fix `|| true` + TimeoutStartSec 600, vérifié live,
|
|
||||||
default-off ; inclut #522). Toolbox source bumpé 2.7.18 (fix live-patché sur gk2) ·
|
|
||||||
#468 /etc/secubox traversal (source+live = 0755, secrets/CA enfants restent 0750).
|
|
||||||
- **Actives (worktrees en cours)** : #655 webext banner · #615 security-posture ·
|
|
||||||
#494 secubox-core ExecStart · #498 Phase 7 WAF enforcement · #485 SOC scoring.
|
|
||||||
|
|
||||||
### 🔎 Reco T0 — recon live gk2 2026-06-24 (avant fix)
|
|
||||||
- ✅ **#494** : **FIX SYSTÉMIQUE poussé** (`fix/494-…`). Pas que core : 7 units re-chownaient
|
|
||||||
le parent partagé `/run/secubox` (core+hub services, eye-remote/eye-square/metablogizer/
|
|
||||||
metrics/p2p postinsts ; eye-square chownait aussi /var/log/secubox = pire). Tous nettoyés
|
|
||||||
(mkdir fallback only ; logs modules en sous-dossier propre ; orphan /etc/tmpfiles.d nettoyé).
|
|
||||||
**Vérifié live** : /run/secubox 1777 **root:root** stable après restart core ET hub ; webui 200.
|
|
||||||
Bumps core 1.1.7/hub 1.4.4/eye-remote 1.0.1/eye-square 1.0.4/metablog 1.2.2/metrics 1.0.4/p2p 1.7.1.
|
|
||||||
- ✅ **#471** (mesh /run/secubox) : déjà résolu (changelog mesh "drop install -d /run/secubox") → verify-close.
|
|
||||||
- ⬜ **#421** : sockets cachés en mount-ns privé (RuntimeDirectory) — mécanisme distinct, non traité.
|
|
||||||
- 🆕 Suivi (classe #511) : mesh/toolbox/admin font `install -d -o <module> /var/log/secubox`
|
|
||||||
(propriétaire du parent partagé = user module) → autres daemons ne peuvent créer leurs logs.
|
|
||||||
Séparé de #494, à traiter (sous-dossiers propres comme fait pour eye-square/p2p).
|
|
||||||
- **#447** : pas une fuite — `password_hash=null` → lockout kiosk + user CI parasite ;
|
|
||||||
**CI-image-gated** (rpi400, pas gk2).
|
|
||||||
- **#91** : `haproxy.cfg` active valide ; backup `*.broken-by-haproxyctl-*` prouve le bug
|
|
||||||
passé ; drift-guard #627 rattrape. Root cause = generate `haproxyctl` (api/main.py l.846/896).
|
|
||||||
- ✅ **#53** : **FIX poussé** (`fix/53-…`) — gate `ConditionPathExists=/var/ossec/etc/ossec.conf`
|
|
||||||
+ `RestartSec=5` ; module conservé (SIEM opt-in). Vérifié gk2 (/var/ossec absent). Bump 1.0.1.
|
|
||||||
- ✅ **#65** : déjà résolu en prod (webui.conf déployé inclut `secubox-routes.d/*.conf`,
|
|
||||||
163 snippets). Template `common/nginx/webui.conf` (stale) synchronisé sur `feature/65-…`.
|
|
||||||
Reco fermer. Convention : `secubox-routes.d/`=actif, `secubox.d/`=legacy.
|
|
||||||
- ✅ **#121** : **FIX poussé** (`fix/121-…`) — helper `fix_perms` chown -R secubox:secubox
|
|
||||||
le site dir après chaque ingest .git (metablog-ingest-site.sh). Script dev, pas de deploy.
|
|
||||||
- ⬜ Restent : **#91** (deploy WAF risqué) · **#65** (refactor include, risque 502) ·
|
|
||||||
**#447** (CI kiosk) · **#494/#471/#421** (worktree fix/494). Build+deploy toolbox 2.7.18 (#519) en attente.
|
|
||||||
- **Backlog/future** : #685/#686 APK non-root (plan verrouillé) · #592 webmail-hub ·
|
|
||||||
#514/#515/#516/#519/#522/#525 Phase 12-14 (#515 CDN / #516 anti-bot partiellement
|
|
||||||
couverts par antibot_sites/opgrade_sites du social graph) · #500 Utiq · #497/#480/
|
|
||||||
#478 VILLAGE3B Eye/poster · #472/#430/#429 Nextcloud · #471/#468/#421 perms (à
|
|
||||||
vérifier si déjà corrigées) · #467/#462/#460/#255/#254 hardware/kernel · #455 egress ·
|
|
||||||
#454/#453/#452/#449 mesh/BLE · #448/#447/#446/#434 kiosk · #422 vm cascade ·
|
|
||||||
#393/#379/#347 packaging · #513 WebUI sub-tabs.
|
|
||||||
- ⚠️ Fermeture finale = **user only** (sauf issues créées en session) ; les
|
|
||||||
recommandations ci-dessus sont commentées sur chaque issue.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ✅ 2026-06-22 : DPI exfil + Netrunner report + sbxmitm fixes (tous mergés, live gk2)
|
|
||||||
|
|
||||||
Session livrée intégralement sur master + déployée. Détail dans HISTORY 2026-06-22.
|
|
||||||
|
|
||||||
### ✅ Fait (mergé + live)
|
|
||||||
- **DPI exfil pipeline (#687)** — `secubox-dpi 1.1.2` : flowcap (ndpiReader) → Go
|
|
||||||
collector (catégories cloud/media/game/adult/ai/messaging/filehost/social + scénarios
|
|
||||||
exfil) → `/api/v1/dpi/exfil` ; dashboard "Cloud Exfiltration Watch" + cartes repointées ;
|
|
||||||
beaconing tuné (#692) ; cumulatif 7j `cumulative.json` (#705) ; packagé arm64.
|
|
||||||
- **Report kbin = fiche Netrunner (#707)** — HTML (onglets Pistage/DPI/Overall + persona
|
|
||||||
néon) **et** PDF (`_persona_block` + "En un coup d'œil" + grille donuts + carto + tables
|
|
||||||
emoji). Charts en **PNG matplotlib** (#714, rendu universel iOS/Chrome) ; grille = une
|
|
||||||
image 2×2 (#716, fin des 24 pages). Classe via UA live + niveau R3 auto (wg peer).
|
|
||||||
- **sbxmitm** — cert forgé 24h→365d (#689, fin des "certificat expiré") ; fin de la
|
|
||||||
troncature >8MiB (#697, Gmail OK) ; splice own-domain **rejeté** (#688, on intercepte tout).
|
|
||||||
|
|
||||||
### ⬜ Next Up (différé)
|
|
||||||
- **#685/#686 APK on-device — NON-ROOT ONLY (plan verrouillé)** : VpnService in-app
|
|
||||||
(wireguard-go), CA en DER + network-security-config WebView, retrait du chemin root.
|
|
||||||
Gros build Android (CI + test device) → session dédiée. Détail : commentaire #685 + TODO.
|
|
||||||
- **DPI Phase 3** — ✅ enrichissement ASN (#719, 1.1.3) · ✅ historique + timeline
|
|
||||||
(#721, 1.1.4) · ❌ démon nDPId **écarté** (#722/#723 revertés) : risque perf
|
|
||||||
(démon permanent vs fenêtres ndpiReader bornées) sur board saturée → **on garde
|
|
||||||
ndpiReader**. **Phase 3 close.**
|
|
||||||
- **#685 APK on-device** — install auto CA + handoff WG + détection tunnel (en attente
|
|
||||||
décision rooted vs non-root du user).
|
|
||||||
- **Cosmétique PDF** — glyphes drapeaux régionaux dégradent en lettres (police embarquée) ;
|
|
||||||
chiffres légèrement espacés dans certaines cellules. Non bloquant.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
||||||
1
.github/workflows/build-all-live-usb.yml
vendored
|
|
@ -48,7 +48,6 @@ jobs:
|
||||||
output_pattern: "secubox-live-amd64-*.img*"
|
output_pattern: "secubox-live-amd64-*.img*"
|
||||||
needs_qemu: false
|
needs_qemu: false
|
||||||
embed_image: false
|
embed_image: false
|
||||||
extra_args: "--kiosk"
|
|
||||||
|
|
||||||
# MOCHAbin (arm64) - U-Boot distroboot
|
# MOCHAbin (arm64) - U-Boot distroboot
|
||||||
- platform: mochabin
|
- platform: mochabin
|
||||||
|
|
|
||||||
25
.github/workflows/build-packages.yml
vendored
|
|
@ -63,11 +63,6 @@ jobs:
|
||||||
# Build the flat {package, arch} matrix. Honour the workflow_dispatch
|
# Build the flat {package, arch} matrix. Honour the workflow_dispatch
|
||||||
# `arch` and `package` filters if set (empty on `push: tags` events).
|
# `arch` and `package` filters if set (empty on `push: tags` events).
|
||||||
requested_arch="${REQUESTED_ARCH:-}"
|
requested_arch="${REQUESTED_ARCH:-}"
|
||||||
# `both` means build every arch — same as the empty (push: tags)
|
|
||||||
# case. Without this the matrix filter (which only compares against
|
|
||||||
# amd64/arm64/empty) yields an EMPTY matrix, so no package builds and
|
|
||||||
# `collect` fails.
|
|
||||||
[ "$requested_arch" = "both" ] && requested_arch=""
|
|
||||||
requested_pkg="${REQUESTED_PKG:-}"
|
requested_pkg="${REQUESTED_PKG:-}"
|
||||||
|
|
||||||
combos=$(find packages/secubox-* -path "*/debian/control" -not -path "*/debian/*/DEBIAN/control" \
|
combos=$(find packages/secubox-* -path "*/debian/control" -not -path "*/debian/*/DEBIAN/control" \
|
||||||
|
|
@ -157,12 +152,7 @@ jobs:
|
||||||
sudo apt-get update -qq
|
sudo apt-get update -qq
|
||||||
sudo apt-get install -y -qq \
|
sudo apt-get install -y -qq \
|
||||||
build-essential dpkg-dev debhelper devscripts fakeroot \
|
build-essential dpkg-dev debhelper devscripts fakeroot \
|
||||||
dh-python python3-all python3-setuptools golang-go
|
dh-python python3-all python3-setuptools
|
||||||
# golang-go satisfies Build-Depends of the pure-Go packages
|
|
||||||
# (secubox-dpi, secubox-toolbox-ng: CGO_ENABLED=0, GOARCH=arm64,
|
|
||||||
# -mod=vendor offline cross-compile). ubuntu-24.04 ships >= 1.22.
|
|
||||||
# Without it dpkg-checkbuilddeps aborts the arm64 build — this was
|
|
||||||
# the real cause of the "arm64 red" runs, not a CGO toolchain gap.
|
|
||||||
# arm64 cross-toolchain — dh_strip and dh_makeshlibs invoke
|
# arm64 cross-toolchain — dh_strip and dh_makeshlibs invoke
|
||||||
# aarch64-linux-gnu-{strip,objdump} when -a arm64 is passed.
|
# aarch64-linux-gnu-{strip,objdump} when -a arm64 is passed.
|
||||||
# Without these, arch-specific packages shipping prebuilt
|
# Without these, arch-specific packages shipping prebuilt
|
||||||
|
|
@ -223,18 +213,7 @@ jobs:
|
||||||
# no-op; for arm64 jobs that don't compile native code (Python +
|
# no-op; for arm64 jobs that don't compile native code (Python +
|
||||||
# prebuilt arm64 binaries — like sentinelle-gsm), -a arm64 is
|
# prebuilt arm64 binaries — like sentinelle-gsm), -a arm64 is
|
||||||
# enough to cross-stamp the .deb.
|
# enough to cross-stamp the .deb.
|
||||||
#
|
dpkg-buildpackage -us -uc -b -a ${{ matrix.arch }}
|
||||||
# Pure-Go packages (CGO_ENABLED=0, GOARCH cross) only need the `go`
|
|
||||||
# toolchain, which is present via golang-1.22-go. But their
|
|
||||||
# `Build-Depends: golang-go (>= 1.22)` trips dpkg-checkbuilddeps
|
|
||||||
# because apt registers golang-1.22-go, not the golang-go
|
|
||||||
# metapackage, on the runner. Skip the dep check (-d) for just these
|
|
||||||
# — the compiler is there and the build is self-contained (-mod=vendor).
|
|
||||||
DEPFLAG=""
|
|
||||||
case "${{ matrix.package }}" in
|
|
||||||
secubox-dpi|secubox-toolbox-ng|secubox-waf-ng) DEPFLAG="-d" ;;
|
|
||||||
esac
|
|
||||||
dpkg-buildpackage -us -uc -b $DEPFLAG -a ${{ matrix.arch }}
|
|
||||||
|
|
||||||
echo "✅ Build OK: ${{ matrix.package }} (${{ matrix.arch }})"
|
echo "✅ Build OK: ${{ matrix.package }} (${{ matrix.arch }})"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,7 @@ network:
|
||||||
bridges:
|
bridges:
|
||||||
br-lan:
|
br-lan:
|
||||||
interfaces: [lan0, lan1, lan2, lan3]
|
interfaces: [lan0, lan1, lan2, lan3]
|
||||||
addresses: [192.168.10.1/24]
|
addresses: [192.168.1.1/24]
|
||||||
dhcp4: false
|
dhcp4: false
|
||||||
parameters:
|
parameters:
|
||||||
stp: false
|
stp: false
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,7 @@ network:
|
||||||
bridges:
|
bridges:
|
||||||
br-lan:
|
br-lan:
|
||||||
interfaces: [lan0, lan1]
|
interfaces: [lan0, lan1]
|
||||||
addresses: [192.168.10.1/24]
|
addresses: [192.168.1.1/24]
|
||||||
dhcp4: false
|
dhcp4: false
|
||||||
parameters:
|
parameters:
|
||||||
stp: false
|
stp: false
|
||||||
|
|
|
||||||
|
|
@ -6,21 +6,16 @@ network:
|
||||||
renderer: networkd
|
renderer: networkd
|
||||||
|
|
||||||
ethernets:
|
ethernets:
|
||||||
# WAN candidate (SFP+, eth0) — connecté à l'opérateur via fibre/module SFP.
|
# WAN — connecté à l'opérateur
|
||||||
eth0:
|
eth0:
|
||||||
dhcp4: true
|
dhcp4: true
|
||||||
dhcp6: false
|
dhcp6: false
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
# LAN — port GbE switch (DSA 88E6341)
|
# LAN — ports GbE (DSA ou directs selon la config switch)
|
||||||
eth1:
|
eth1:
|
||||||
optional: true
|
optional: true
|
||||||
# WAN candidate (RJ45 cuivre, eth2 = mvpp2-2). Sur MOCHAbin le seul RJ45
|
|
||||||
# direct ; sert d'uplink quand l'opérateur arrive en cuivre. Le port WAN
|
|
||||||
# câblé (eth0 SFP+ OU eth2 cuivre) obtient le bail DHCP ; l'autre reste idle.
|
|
||||||
eth2:
|
eth2:
|
||||||
dhcp4: true
|
|
||||||
dhcp6: false
|
|
||||||
optional: true
|
optional: true
|
||||||
eth3:
|
eth3:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
@ -36,8 +31,8 @@ network:
|
||||||
bridges:
|
bridges:
|
||||||
# Bridge LAN
|
# Bridge LAN
|
||||||
br-lan:
|
br-lan:
|
||||||
interfaces: [eth1, eth3, eth4]
|
interfaces: [eth1, eth2, eth3, eth4]
|
||||||
addresses: [192.168.10.1/24]
|
addresses: [192.168.1.1/24]
|
||||||
dhcp4: false
|
dhcp4: false
|
||||||
parameters:
|
parameters:
|
||||||
stp: false
|
stp: false
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ network:
|
||||||
|
|
||||||
# LAN — Interface 2 QEMU (si configurée)
|
# LAN — Interface 2 QEMU (si configurée)
|
||||||
enp0s2:
|
enp0s2:
|
||||||
addresses: [192.168.10.1/24]
|
addresses: [192.168.100.1/24]
|
||||||
dhcp4: false
|
dhcp4: false
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ network:
|
||||||
|
|
||||||
# LAN — Interface 2 VirtualBox (Internal Network ou Host-Only)
|
# LAN — Interface 2 VirtualBox (Internal Network ou Host-Only)
|
||||||
enp0s8:
|
enp0s8:
|
||||||
addresses: [192.168.10.1/24]
|
addresses: [192.168.100.1/24]
|
||||||
dhcp4: false
|
dhcp4: false
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -64,7 +64,7 @@ network:
|
||||||
br-lan:
|
br-lan:
|
||||||
interfaces: []
|
interfaces: []
|
||||||
addresses:
|
addresses:
|
||||||
- 192.168.10.1/24
|
- 192.168.1.1/24
|
||||||
dhcp4: false
|
dhcp4: false
|
||||||
optional: true
|
optional: true
|
||||||
parameters:
|
parameters:
|
||||||
|
|
|
||||||
|
|
@ -63,7 +63,7 @@ network:
|
||||||
bridges:
|
bridges:
|
||||||
br-lan:
|
br-lan:
|
||||||
interfaces: [enp0s8]
|
interfaces: [enp0s8]
|
||||||
addresses: [192.168.10.1/24]
|
addresses: [192.168.1.1/24]
|
||||||
dhcp4: false
|
dhcp4: false
|
||||||
parameters:
|
parameters:
|
||||||
stp: false
|
stp: false
|
||||||
|
|
|
||||||
|
|
@ -55,13 +55,4 @@ server {
|
||||||
proxy_pass http://unix:/run/secubox/system.sock:/;
|
proxy_pass http://unix:/run/secubox/system.sock:/;
|
||||||
include /etc/nginx/snippets/secubox-proxy.conf;
|
include /etc/nginx/snippets/secubox-proxy.conf;
|
||||||
}
|
}
|
||||||
|
|
||||||
# #65: per-module routes self-register here. Every module package drops a
|
|
||||||
# /etc/nginx/secubox-routes.d/<module>.conf (location-only snippet) at
|
|
||||||
# install time, so a newly added module's /<module>/ + /api/v1/<module>/
|
|
||||||
# routes are picked up automatically — no more hand-editing this file per
|
|
||||||
# module. This is the ACTIVE include (matches the deployed webui.conf).
|
|
||||||
# The crowdsec/waf/system blocks above stay hardcoded: those core packages
|
|
||||||
# only ship the legacy secubox.d/ snippet, so they would NOT duplicate here.
|
|
||||||
include /etc/nginx/secubox-routes.d/*.conf;
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 48 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 71 KiB |
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 51 KiB |
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 47 KiB |
|
Before Width: | Height: | Size: 50 KiB |
|
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 65 KiB |
|
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 41 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 46 KiB |
|
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 51 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 37 KiB |