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_PROXYer 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
GOPATHog tilsvarende respekteres for ikke-standard plasseringer (på vei, #124)
Se cplt-siden for oppdatert funksjonsoversikt og interaktiv config-utforsker.