-
v0.12.0
Stablereleased this
2026-07-03 12:29:48 +00:00 | 1 commits to main since this releaseSecurity hardening sweep — a 4-agent audit (deploy.sh, Python worker, infra/web) plus a docs↔code
security-claims cross-check. Fixes below, ranked by severity.Security
- CRITICAL — root RCE via
set-fqdn. An unvalidated FQDN (set-fqdn <arg>/PM_FQDN) was spliced
into ased -iscript; a|or newline could trigger GNU sed'secommand → arbitrary command
execution as root (and YAML injection intopackagemini.yml). FQDNs are now validated against a
hostname charset (_check_fqdn) before they reachsed/ the config writer. - HIGH — GoAccess board exposure. The board's
:7443listener — and its unauthenticated/ws
WebSocket — inherited none of the mirror's IPallow/denygate, rate-limit, or headers, so an
allowlist didn't cover the board and basic-auth brute-force was unthrottled. The board block now applies
the same allow/deny (covering/ws), a rate-limit, and headers; the raw log archive under
/srv/report/archiveis hidden from browsing. - HIGH — path traversal.
version/arch/pintokens reachedmkdirbefore validation. A new
safe_token()guard gates every token before it builds a filesystem path or URL — at discovery
(sources.py), at config load (architectures/pinrejected), and defensively beforemkdir. - MEDIUM — Caddyfile injection.
public_base_url,tls_*, usernames,*_hash_env, and the server
timeouts are validated at config load (reject braces/tabs/newlines; env-name + username charsets),
matching the existingrate/ CIDR validation. - MEDIUM — secret & permission exposure. Passwords are hashed via stdin (no longer visible in
ps/ argv);.envand the imported TLS key are written under a private umask (no world-readable
window); the public-facingwebcontainer getsno-new-privileges(matching sync/goaccess). - MEDIUM — resource DoS. Response reads are capped (8 MiB text / 4 GiB artifact) so a misbehaving
upstream can't exhaust worker memory; the main npk is size-checked after download (verify_npkwired
into the sweep) and re-fetched if it fails. - LOW / defense-in-depth. git refs rejected if they start with
-or contain metacharacters; strict
CSP on the (fully self-contained) mirror site; the feed usesquoteattrfor XML attributes; the
SSH key-only guard now requires a non-emptyauthorized_keys(avoids lockout); marker dotfiles
(.complete/.size/.absent) hidden from the file server.
Docs
- Corrected security claims that over-promised:
sources.archive_backfillis now marked not yet
implemented (it was a silent no-op stub), and the false "checks NPK magic bytes" claim is replaced
with the actual behavior (TLS-verified fetch + a size sanity check; no cryptographic verification).
SYSTEM-HARDENING documents the7443/tcpfirewall opening and the board's public-listener caveat. - New doc/REAL-TIME-MONITORING.md — the GoAccess board + live-update
WebSocket architecture, with a dashboard screenshot.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- CRITICAL — root RCE via