Nyheter
Praksis

5. juli 2026

cplt sikkerhetsoppdatering med Bubblewrap-namespaces, proxy-forced og upstream proxy

cplt, sandboxen for AI-kodingsagenter, har fått en runde med sikkerhetsherding og tre nye funksjoner. Som alltid: dette er lag i et forsvar-i-dybden-oppsett, ikke sølvkuler. SECURITY.md beskriver den ærlige trusselmodellen.


Bubblewrap namespace-isolasjon (Linux)

På Linux kan cplt nå pakke agenten inn i Bubblewrap-namespaces (PID/IPC/UTS/cgroup/user) med en privat /tmp. Dette ligger oppå Landlock + seccomp-BPF, ikke som erstatning. Agenten kan ikke lenger se eller signalisere prosesser på verten, og /tmp er en fersk tmpfs uten exec.

Aktiveres automatisk når bwrap er installert, med graceful fallback til kun Landlock + seccomp hvis ikke. Eksplisitt styring med sandbox.use_bubblewrap:

cplt config set sandbox.use_bubblewrap true   # hard krav — feiler om bwrap mangler
cplt config set sandbox.use_bubblewrap false  # kun Landlock + seccomp

Viktige avgrensninger, med vilje:

  • Ikke en nettverksgrense. Det opprettes ingen network namespace. Vertsnettverket deles slik at agenten når CONNECT-proxyen på 127.0.0.1. Nettverkskontrollen ligger fortsatt hos proxyen og Landlock-portregler.
  • Ikke full filsystem-konfidensialitet. Hele rotfilsystemet bind-mountes read-only og er synlig i mount-tabellen; det er Landlock (deny-by-default) som nekter lesing, ikke mount-namespacet.

Kilde: navikt/cplt#64


Proxy-forced modus (opt-in)

Til nå har proxyen vært rådgivende på kernel-nivå: sandboxen tillater utgående *:443, og trafikken går gjennom proxyen fordi cplt injiserer HTTPS_PROXY. En rå socket, eller env -u HTTPS_PROXY, kunne dermed nå nettet utenom domenefiltreringen.

Det gjelder også på macOS, og på et punkt til: standardprofilen nekter (remote tcp) og tillater så (remote ip "*:443"), og en ip-regel dekker UDP like mye som TCP. QUIC over UDP/443 er derfor kjernetillatt i standardmodus, uten å gå innom cplt-proxyen. Proxyloggen er altså ikke en fullstendig utgangslogg så lenge proxy.forced er av.

proxy.forced lukker den bypassen: proxyen blir obligatorisk, og kernel-egress begrenses til proxy-porten alene (ingen direkte *:443). Feiler proxyen ved oppstart, starter ikke agenten. Oppsettet er fail-closed.

cplt config set proxy.forced true

Håndhevingen er asymmetrisk mellom plattformene:

  • macOS pinner fullt til localhost:<proxy_port>, uten noen restkanal. *:443-regelen droppes i sin helhet, så QUIC-hullet over UDP/443 lukkes sammen med TCP-veien.
  • Linux dropper *:443-regelen, men Landlock er portbasert og kan ikke pinne til localhost, så en smal portbasert restkanal (evil.com:<proxy_port>) gjenstår. Dette er en kjent og bevisst begrensning, sporet oppstrøms i navikt/cplt#114.

Av som standard. Kilde: navikt/cplt#117

Rettelse 3. september: Saken beskrev standardmodus som om proxyen så all utgående trafikk når HTTPS_PROXY er satt; UDP/443 er også tillatt der, og QUIC går utenom.


Upstream proxy-chaining for bedriftsnettverk

Team bak en bedriftsproxy har til nå måttet skru av cplt-proxyen. Med proxy.upstream (i merge-køen) videresender cplt CONNECT-tunneler gjennom bedriftsproxyen i stedet, og beholder egen domenefiltrering, logging og portsjekker. Policyen håndheves før videresending: et blokkert domene når aldri bedriftsproxyen.

cplt config set proxy.upstream "http://corporate-proxy.example.com:8080"

Basic-auth i URL-en støttes; kun http-skjema mot upstream.

Kilde: navikt/cplt#125


Andre forbedringer i samme bølge

  • Landlock best-effort ABI gjør at sandboxen bruker beste tilgjengelige Landlock-ABI på eldre kjerner i stedet for å kreve nyeste (#119)
  • Guard- og sikkerhetsfikser tetter gh/git guard-bypasses og parsing-feil, pluss en runde med fikser for loopback-SSRF, trust pinning og en token-lekkasje (#118)
  • Verktøystier fra miljøvariabler betyr at GOPATH og tilsvarende respekteres for ikke-standard plasseringer (på vei, #124)

Se cplt-siden for oppdatert funksjonsoversikt og interaktiv config-utforsker.

Alle nyheter