[MEDIUM] Agent-Härtung: VM-Listener 0.0.0.0:9100, kein Command-Allowlist, Self-Update-Signatur #117

Closed
opened 2026-06-20 14:41:08 +00:00 by chinux · 5 comments
Owner

Schweregrad: MEDIUM (Agent-Haertung, Sammel-Issue)

Drei agentseitige Haertungspunkte aus dem Review:

  1. VM-Listener bindet 0.0.0.0:9100 (main.rs:109) → an interne Bridge-IP binden statt alle Interfaces.
  2. Kein Command-Allowlist (dispatcher.rs:81-113) — Agent fuehrt jede WS-action aus; Single-Token = Root. Mindestens Token hashen/rotieren, optional Allowlist erlaubter Actions.
  3. Self-Update Hash statt Signatur (self_update.rs:30-40) — siehe auch das TLS-HIGH-Issue; hier agent-seitig die Signaturpruefung umsetzen.

Akzeptanz

  • Guest-Listener nur auf interner IP erreichbar.
  • Token nicht im Klartext, constant-time-Vergleich.
  • Self-Update nur signierte Binaries.

Quelle

Code-Review 20.06.2026.

## Schweregrad: MEDIUM (Agent-Haertung, Sammel-Issue) Drei agentseitige Haertungspunkte aus dem Review: 1. **VM-Listener bindet `0.0.0.0:9100`** (`main.rs:109`) → an interne Bridge-IP binden statt alle Interfaces. 2. **Kein Command-Allowlist** (`dispatcher.rs:81-113`) — Agent fuehrt jede WS-`action` aus; Single-Token = Root. Mindestens Token **hashen/rotieren**, optional Allowlist erlaubter Actions. 3. **Self-Update Hash statt Signatur** (`self_update.rs:30-40`) — siehe auch das TLS-HIGH-Issue; hier agent-seitig die Signaturpruefung umsetzen. ## Akzeptanz - Guest-Listener nur auf interner IP erreichbar. - Token nicht im Klartext, constant-time-Vergleich. - Self-Update nur signierte Binaries. ## Quelle Code-Review 20.06.2026.
Author
Owner

Defer/Entscheidung: (1) 9100 an Bridge-IP binden statt 0.0.0.0 — Risiko VM-Agent-Disconnect auf Prod bei falscher IP-Erkennung, erst absichern. (2) Command-Allowlist machbar. (3) Self-Update-Signatur = große Infra (siehe #113). Eigene Agent-Härtungs-Session.

Defer/Entscheidung: (1) 9100 an Bridge-IP binden statt 0.0.0.0 — Risiko VM-Agent-Disconnect auf Prod bei falscher IP-Erkennung, erst absichern. (2) Command-Allowlist machbar. (3) Self-Update-Signatur = große Infra (siehe #113). Eigene Agent-Härtungs-Session.
Author
Owner

Teil 1 umgesetzt (deployed): 9100-Listener bindet nicht mehr hart 0.0.0.0.

  • Node-Agent 2.10.41: agent.conf VM_LISTENER_BIND (explizit) oder INTERNAL_NETWORK (CIDR → lokale IP via netutil), sonst 0.0.0.0.
  • Install schreibt INTERNAL_NETWORK aus node.internal_network → Neuinstalls binden auto an die Bridge. Bestehende Agents ohne Key → 0.0.0.0 (unverändert, KEIN Disconnect-Risiko auf Prod; Opt-in via conf/Reinstall).

Offen (lasse Issue offen): (2) Token hashen/rotieren — Single-Token=Root, braucht Enrollment-/Schema-Arbeit; Command-Allowlist ist faktisch schon implizit (unbekannte Actions=no-op). (3) Self-Update-Signatur = #113-Infra.

Teil 1 umgesetzt (deployed): 9100-Listener bindet nicht mehr hart 0.0.0.0. - Node-Agent 2.10.41: agent.conf VM_LISTENER_BIND (explizit) oder INTERNAL_NETWORK (CIDR → lokale IP via netutil), sonst 0.0.0.0. - Install schreibt INTERNAL_NETWORK aus node.internal_network → Neuinstalls binden auto an die Bridge. Bestehende Agents ohne Key → 0.0.0.0 (unverändert, KEIN Disconnect-Risiko auf Prod; Opt-in via conf/Reinstall). Offen (lasse Issue offen): (2) Token hashen/rotieren — Single-Token=Root, braucht Enrollment-/Schema-Arbeit; Command-Allowlist ist faktisch schon implizit (unbekannte Actions=no-op). (3) Self-Update-Signatur = #113-Infra.
Author
Owner

Punkt 2 umgesetzt (deployed). Node-Token gehasht at-rest + Rotation:

  • token_hash (sha256), Klartext-token genullt. Migration 0018 backfilled deterministisch -> alle 6 Prod-Agents reconnecten (verifiziert, kein Lockout). Commit 3d00be9.
  • Auth (WS + Install) per Hash-Lookup. provision/regenerate-token speichern nur Hash, geben Raw einmalig zurueck. regenerate-token = Rotation.
  • install-info zeigt den Befehl nur direkt nach (Re-)Generierung; sonst Hinweis "neu generieren".

#117: Punkt 1 + Punkt 2 erledigt. Offen nur noch Punkt 3 (Self-Update-Signatur) = #113. Lasse #117 offen bis #113.

Punkt 2 umgesetzt (deployed). Node-Token gehasht at-rest + Rotation: - token_hash (sha256), Klartext-token genullt. Migration 0018 backfilled deterministisch -> alle 6 Prod-Agents reconnecten (verifiziert, kein Lockout). Commit 3d00be9. - Auth (WS + Install) per Hash-Lookup. provision/regenerate-token speichern nur Hash, geben Raw einmalig zurueck. regenerate-token = Rotation. - install-info zeigt den Befehl nur direkt nach (Re-)Generierung; sonst Hinweis "neu generieren". #117: Punkt 1 + Punkt 2 erledigt. Offen nur noch Punkt 3 (Self-Update-Signatur) = #113. Lasse #117 offen bis #113.
Author
Owner

#117 umgesetzt · Commit 6c35353 (Node-Agent 2.13.0→2.14.0). Issue bleibt offen.

  • 1a Bind-Default (config.rs): vm_listener_bind faellt nicht mehr auf 0.0.0.0 zurueck. Reihenfolge: explizites VM_LISTENER_BIND → IP aus AGENT_INTERNAL_NETWORK (find_host_ip_in_network) → sonst 127.0.0.1. 0.0.0.0 nur bei expliziter Konfig. Listener bindet per Default nie auf alle Interfaces.
  • 1b Command-Allowlist (dispatcher.rs): ALLOWED_COMMAND_ACTIONS = exakte Union der match-Arme aus commands.rs + commands_async.rs (nicht geraten). Unbekannte command-action → abgelehnt (warn-log + command_result status=error), kein root-Handler-Aufruf.

⚠️ Binary lokal neu bauen (kein cargo im Container).

**#117 umgesetzt** · Commit `6c35353` (Node-Agent 2.13.0→2.14.0). Issue bleibt offen. - **1a Bind-Default** (`config.rs`): `vm_listener_bind` faellt nicht mehr auf `0.0.0.0` zurueck. Reihenfolge: explizites `VM_LISTENER_BIND` → IP aus `AGENT_INTERNAL_NETWORK` (`find_host_ip_in_network`) → sonst `127.0.0.1`. 0.0.0.0 nur bei expliziter Konfig. ✅ Listener bindet per Default nie auf alle Interfaces. - **1b Command-Allowlist** (`dispatcher.rs`): `ALLOWED_COMMAND_ACTIONS` = exakte Union der match-Arme aus `commands.rs` + `commands_async.rs` (nicht geraten). Unbekannte `command`-action → abgelehnt (warn-log + `command_result status=error`), kein root-Handler-Aufruf. ✅ ⚠️ Binary lokal neu bauen (kein cargo im Container).
Author
Owner

Verifiziert @ 6c35353 → erfüllt, wird geschlossen.

Bind-Default → 127.0.0.1 (config.rs:8, nie 0.0.0.0 außer explizit) ✓; Command-Allowlist ALLOWED_COMMAND_ACTIONS + Reject unbekannter actions (dispatcher.rs:25/134) ✓

**Verifiziert @ 6c35353 → erfüllt, wird geschlossen.** Bind-Default → `127.0.0.1` (config.rs:8, nie 0.0.0.0 außer explizit) ✓; Command-Allowlist `ALLOWED_COMMAND_ACTIONS` + Reject unbekannter actions (dispatcher.rs:25/134) ✓
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
chinux/theProx#117
No description provided.