Skip to content

AE control surface serves plaintext by default (CONTROL_TLS off) — dx bearer JWT crosses the CNI in cleartext #96

Description

@ConstanzeTU

Symptom

adaptive_export logs on every boot:

level=warning msg="control surface: TLS DISABLED — bearer JWT crosses the CNI in cleartext (set CONTROL_TLS=true)"

Root cause

The control surface (:9100 — the endpoint dx calls for /export/start, /dx/evidence_graph, /dx/evidence_manifest) requires a bearer JWT when CONTROL_REQUIRE_AUTH=true + PL_JWT_SIGNING_KEY is set (which it is in the dx-steered topology). But TLS on that same surface is gated on CONTROL_TLS=true, which is default-OFF (src/vizier/services/adaptive_export/cmd/main.go:724-737, comment: "Default-OFF for incremental rollout").

Result: auth is ON but the channel is plaintext, so the signed token (and the control payloads) travel the pod network unencrypted — anyone able to sniff the CNI on the node can capture a valid AE-control token.

Why it's currently off

  • CONTROL_TLS is not set in the AE manifest (k8s/vizier/bootstrap/adaptive_export_deployment.yaml), and the service-tls-certs secret (the cert the broker/PEM already use, expected at /certs/server.{crt,key}) is not mounted into the AE DaemonSet.

Investigate / fix

  1. Confirm the service-tls-certs (or equivalent) secret is available in pl and mountable into the AE DaemonSet.
  2. Mount it at /certs + set CONTROL_TLS=true in adaptive_export_deployment.yaml.
  3. Set dx's AE_CONTROL_ADDR to https://adaptive-export-control.pl.svc.cluster.local:9100 (the dx client already does TLS skip-verify for the in-cluster self-signed cert — see k8s/vizier/dx/dx-daemon.yaml comment).
  4. Verify dx still steers + writes the evidence graph over TLS, and the warning becomes control surface: TLS ENABLED.
  5. Decide whether default-ON is appropriate now that the rollout is past incremental (the cert infra already exists).

Refs

  • src/vizier/services/adaptive_export/cmd/main.go:706-742
  • k8s/vizier/dx/dx-daemon.yaml (AE_CONTROL_ADDR http, with the flip-to-https comment)
  • observed on the sovereign-SOC lab (fix/ae-protocol-export-pxexport, aeprod63)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions