123% fler rapporterade CVE:er per dag 2026 än förra året.

CI/CD-säkerhet

Så stoppar du exfiltrering från GitHub Actions med en egress-policy

Ett CI-jobb har tillgång till hemligheter och kör kod som det laddade ner för en minut sedan: actions, paket och deras installationsskript. Om någon del av den koden är skadlig är det enklaste sättet att stjäla hemligheterna att skicka dem till en server. En egress-policy avgör vilka servrar ett jobb får nå och blockerar resten.

Uppdaterad

Så lämnar hemligheter ett CI-jobb

Ett jobb har tillgång till repots token, de hemligheter som skickas till det och alla molnbehörigheter det använder. Kod som körs i jobbet kan läsa dem. Den kan sedan få ut dem på några olika sätt:

  • Över nätverket. En begäran till en server som angriparen kontrollerar. Det är den här kanalen som en egress-policy stänger.
  • Via loggar. Hemligheter skrivs ut, ofta kodade, i jobbloggen. I mars 2025 rapporterade CISA att den komprometterade actionen tj-actions/changed-files exponerade hemligheter på det här sättet.
  • Via utdata. Artefakter, cachar eller commits som pushas med jobbets token.

Koden behöver inte vara ett skadligt paket. En AI-agent i arbetsflödet kan kapas genom prompt injection gömd i ett issue eller en pull request, och sedan använda samma kanaler.

Vad en egress-policy gör

De flesta jobb behöver nå en kort lista med destinationer: paketregister, containerregister, källvärdar och några tjänster. En egress-policy tillåter den listan och blockerar allt annat. Med en policy som nekar som standard misslyckas en begäran till en okänd värd, och hemligheterna stannar i jobbet.

What happens when malware in a build tries to send your secrets out Left, a runner that allows all outbound traffic: the build reaches its package registry and publishes its output, then a malicious install hook sends the build's secrets to an attacker's server, and they arrive. Right, CRACI with a default-deny egress policy: the registry and publish connections are allowed, the connection to the attacker's server is blocked at the policy, and an alert is sent. The policy allows only what the build needs, so it works even against an attack nobody has seen before. Any outbound allowed build job holds your tokens and keys malicious install hook runs no egress policy package registry publish output attacker server allowed allowed secrets sent to the attacker CRACI default-deny egress policy build job on CRACI holds your tokens and keys malicious install hook runs egress policy: only what the build needs package registry publish output attacker server allowed allowed blocked blocked, and you get an alert
The policy allows only what the build needs, instead of looking for known-bad hosts, so it stops a new attack the first time it runs.

Den stänger inte varje dörr:

  • Den hindrar inte att hemligheter skrivs ut i loggar. Håll loggarna privata och lås actions till commit-SHA:er.
  • En destination som du tillåter kan fortfarande föra ut data, så håll tillåtelselistan snäv.
  • Den talar inte om vilka paket som var skadliga. Det är jobbet för paketgranskning och en SBOM.

Tre sätt att upprätthålla en

  • En agent på runnern. StepSecurity Harden-Runner läggs till som första steg i ett jobb. Den kopplar varje anslutning till steget som gjorde den, bygger en baslinje i granskningsläge och blockerar egress till allt som inte finns på en tillåtelselista.
  • En runner med inbyggd policy. CRACI upprätthåller policyn som själva runnern. Även andra runnerleverantörer erbjuder nätverkskontroller, som egress-filtrering på Depots Linux-runners och blockerande eller rådgivande egress-policyer på Namespace.
  • Ditt eget nätverk. Egenhostade runners bakom en brandvägg eller proxy som du konfigurerar och underhåller.

Så inför du den utan att byggen går sönder

  1. Observera. Registrera varje anslutning ett jobb gör under några körningar.
  2. Tillåt. Bygg tillåtelselistan utifrån vad jobbet faktiskt behöver.
  3. Blockera. Gå över till att neka som standard och håll utkik efter överträdelser.
  4. Granska. Behandla varje ny överträdelse som antingen en saknad källa eller en incident.

Så gör CRACI

På CRACI är egress-policyn en del av runnern. Den valideras innan jobbet startar, okända fält avvisas och den blockerar vid fel. Inbyggda förinställningar täcker vanliga paketkällor, och egna källor och anslutningar lägger till resten. Jobbets spårning listar varje anslutning, och varje blockerad anslutning som en överträdelse med orsaken. Eftersom proxyn är paketmedveten blir samma registrering jobbets SBOM. API:t returnerar SBOM:er, nätverksspårningar och proveniens.

CRACI har ännu inget särskilt granskningsläge; det finns på roadmapen. Utan en nätverkspolicy tillåts ett jobbs trafik och registreras i spårningen, så du kan se vad en policy behöver innan du upprätthåller den. CRACI kör GitHub Actions-jobb på Linux. Se CI/CD-säkerhetsverktyg i jämförelse och CRACI vs StepSecurity.

Egress-policyer i CI: vanliga frågor

Vad är en egress-policy i CI?

En uppsättning regler för de utgående nätverksanslutningar som ett CI-jobb får göra. Jobbet når de paketregister och tjänster det behöver, och alla andra destinationer blockeras.

Hade en egress-policy stoppat tj-actions-attacken?

Inte på egen hand. I det fallet rapporterade CISA att hemligheter exponerades via arbetsflödesloggar, inte skickades till en extern server. En egress-policy stänger nätverkskanalen; att låsa actions till commit-SHA:er och hålla loggarna privata tar hand om loggkanalen.

Går byggen sönder om man blockerar egress?

Det kan de göra, om policyn missar en källa som bygget behöver. Börja med att registrera vad jobbet ansluter till, bygg tillåtelselistan utifrån det och blockera sedan. På CRACI täcker inbyggda förinställningar vanliga paketkällor, och en blockerad anslutning syns i jobbets spårning med orsaken.

Kan jag använda en egress-policy på GitHub-hostade runners?

Ja, med en agent som läggs till i jobbet, till exempel StepSecurity Harden-Runner. Eller så flyttar du jobbet till en runner som själv upprätthåller policyn, till exempel CRACI.

Sätt ett jobb bakom en egress-policy

Kör ett arbetsflöde på CRACI och se varje anslutning det gjorde, vilka som en policy som nekar som standard skulle blockera och SBOM:en över vad det hämtade.

Boka en demo