[HIGH] Root-Command-Kanal Backend→Agent ohne erzwungenes TLS + Self-Update nur Hash (keine Signatur) #113
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Schweregrad: HIGH (deployment-abhaengig: trifft zu, sobald ohne TLS betrieben)
Der Node-Agent laeuft als root und fuehrt jedes Backend-Command aus. Leitet sich
SERVER_URLaushttp://ab, laeuft der gesamte Command-Kanal inkl. Klartext-Node-Token ueberws://→ ein MITM liest das Token und injiziert Commands = Root-RCE auf allen Proxmox-Hosts.Self-Update prueft nur einen mitgelieferten Hash (Integritaet, keine Signatur) → bietet keinen MITM-Schutz (Angreifer ersetzt Binary + Hash konsistent).
Belege:
main.py:300(URL-Ableitung),self_update.rs:30-40(Hash),agent_ws.py:95(WS-Auth).Fix
wss://erzwingen wenn nicht localhost; beihttp://-Ableitung in Produktion Fehler/Warnung statt stillesws://.Akzeptanz
ws://ausser explizit erlaubtem localhost/Dev.Quelle
Code-Review 20.06.2026 (verifiziert: URL-Ableitung + Hash-only).
NICHT umgesetzt — bewusst. TLS-Zwang würde die aktuelle Prod-Instanz sofort lahmlegen: alle Agents laufen über ws:// (http SERVER_URL). Hartes Erzwingen = Disconnect aller Hosts. Self-Update-Signatur = Schlüssel-/Signier-Infra (Keygen, Signing, Agent-Verify). Braucht Deployment-Entscheidung (TLS-Rollout-Plan) + eigene Session. Vorschlag: optionales ENFORCE_TLS-Flag (default aus) + Warn-Log statt Hard-Break, Signatur separat.
Scope-Klarstellung: DEV-Umgebung, sauber statt kompatibel
Entscheidung: Dies ist eine reine Dev-Umgebung. Umsetzung clean, ohne Rueckwaertskompatibilitaet:
Konkret fuer dieses Issue:
AGENT_ALLOW_INSECURE_WSo.ae.).ws://zu Nicht-localhost = ausnahmsloser Startfehler. (ws://localhost/127.0.0.1/::1bleibt fuer lokale Dev erlaubt.)#113 — beide Phasen umgesetzt (Issue bleibt offen)
Phase 1 — wss:// erzwingen · Commit
34a6176config::validate_server_url: localhost/127.0.0.1/::1 → ws:// + wss:// (Dev); jeder andere Host → nur wss://, ws:// = harter Startfehler, kein Insecure-Override.ws.rs:connect_async+ rustls-webpki-roots verifiziert Server-Cert; keindanger_accept_invalid_certs(geprüft: keine Insecure-Pfade im Agent).install_script: SERVER_URL nicht https & Host nicht localhost → 400 statt ws://-Install-Script.Phase 2 — ed25519-signiertes Self-Update · Commit
eb9cde9self_update.rs: verifiziertX-Binary-Sig(base64 ed25519) gegen eincompiliertenUPDATE_PUBKEY_B64(ed25519-dalek). Fehlt/ungültig → kein Ersetzen, alte Binary bleibt. Kein Hash-Fallback. ✅node_agent_binary: liefert<binary>.sigalsX-Binary-Sig(Build-/Release-Zeit, nicht per Request).scripts/gen-update-key.sh,scripts/sign-release.sh,wiki/Self-Update-Signing.md. Signing-Key = Offline-Secret (.gitignore *.pem).⚠️ Setup nötig (Sebastian)
scripts/gen-update-key.shausführen → Private Key (update-signing-key.pem) offline halten.Node-Agent/src/self_update.rs→UPDATE_PUBKEY_B64eintragen (Placeholder = fail-closed, kein Update bis ersetzt).scripts/sign-release.sh theprox-node-agent-x86_64→.signeben Binary committen (je arch).Alte/unsignierte Agents bleiben bewusst zurück → neu ausrollen. Issue bleibt offen (Rest von Epic #184).
Verifiziert @
eb9cde9→ beide Phasen erfüllt, wird geschlossen.Phase 1 (wss-Zwang)
34a6176:validate_server_urlinConfig::load()aufgerufen (config.rs:35). wss→ok, ws→nur localhost/127.0.0.1/[::1], sonst harter Startfehler. Kein Insecure-Override ✓Phase 2 (Self-Update-Signatur)
eb9cde9:X-Binary-Sigper ed25519 (ed25519-dalek), fail-closed — kein Hash-Fallback, fehlende/ungültige Signatur verweigert das Update (self_update.rs) ✓.sig-Datei (Release-Zeit, main.py:356) ✓scripts/sign-release.shvorhanden ✓⚠️ Offenes Action-Item (kein Code-Mangel — bewusst fail-closed)
UPDATE_PUBKEY_B64inself_update.rs:33ist noch der PlatzhalterREPLACE_WITH_ED25519_PUBLIC_KEY_BASE64. Solange der drinsteht, wird jedes Self-Update abgelehnt. Vor produktivem Self-Update nötig:scripts/sign-release.sherzeugen, Signing-Key offline halten.self_update.rs:33eintragen, Agent neu bauen..signeben das Binary legen.In der Dev-Umgebung unkritisch (Neu-Ausrollung statt Self-Update).