123% flere rapporterte CVE-er per dag i 2026 enn i fjor.

CI/CD-sikkerhet

Stopp datatyveri fra GitHub Actions med en egress-policy

En CI-jobb har tilgang til hemmeligheter og kjører kode den lastet ned for et minutt siden: actions, pakker og installasjonsskriptene deres. Hvis noe av den koden er ondsinnet, er den enkleste måten å stjele hemmelighetene på å sende dem til en server. En egress-policy bestemmer hvilke servere en jobb kan nå, og blokkerer resten.

Oppdatert

Slik forlater hemmeligheter en CI-jobb

En jobb har tilgang til repositorietokenet, hemmelighetene som sendes til den, og all skylegitimasjon den tar i bruk. Kode som kjører i jobben, kan lese dem. Deretter kan den få dem ut på noen få måter:

  • Over nettverket. En forespørsel til en server angriperen kontrollerer. Dette er kanalen en egress-policy stenger.
  • Gjennom logger. Hemmeligheter skrives ut, ofte kodet, i jobbloggen. I mars 2025 rapporterte CISA at den kompromitterte tj-actions/changed-files-actionen eksponerte hemmeligheter på denne måten.
  • Gjennom utdata. Artefakter, cacher eller commits pushet med jobbens token.

Koden trenger ikke å være en ondsinnet pakke. En AI-agent i workflowen kan kapres av prompt injection skjult i en issue eller pull request, og deretter bruke de samme kanalene.

Hva en egress-policy gjør

De fleste jobber trenger å nå en kort liste med destinasjoner: pakkeregistre, containerregistre, kildeverter og noen få tjenester. En egress-policy tillater den listen og blokkerer alt annet. Med en default deny-policy feiler en forespørsel til en ukjent vert, og hemmelighetene blir værende i jobben.

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 stenger ikke alle dører:

  • Den stopper ikke at hemmeligheter skrives ut i logger. Hold logger private, og fest actions til commit-SHA-er.
  • En destinasjon du tillater, kan fortsatt føre data ut, så hold tillatelseslisten smal.
  • Den forteller deg ikke hvilke pakker som var ondsinnede. Det er jobben til pakkeskanning og en SBOM.

Tre måter å håndheve den på

  • En agent på runneren. StepSecurity Harden-Runner legges til som første steg i en jobb. Den knytter hver tilkobling til steget som gjorde den, bygger en baseline i revisjonsmodus og blokkerer egress til alt utenfor en tillatelsesliste.
  • En runner med innebygd policy. CRACI håndhever policyen som selve runneren. Andre runnerleverandører tilbyr også nettverkskontroller, for eksempel egress-filtrering på Depots Linux-runnere og blokkerende eller rådgivende egress-policyer på Namespace.
  • Ditt eget nettverk. Selvhostede runnere bak en brannmur eller proxy du konfigurerer og vedlikeholder selv.

Slik ruller du den ut uten å ødelegge bygg

  1. Observer. Registrer hver tilkobling en jobb gjør over noen kjøringer.
  2. Tillat. Bygg tillatelseslisten ut fra det jobben faktisk trenger.
  3. Blokker. Bytt til default deny, og følg med på brudd.
  4. Gå gjennom. Behandle hvert nytt brudd som enten en manglende kilde eller en hendelse.

Slik gjør CRACI det

På CRACI er egress-policyen en del av runneren. Den valideres før jobben starter, ukjente felt avvises, og den blokkerer ved feil. Innebygde forhåndsinnstillinger dekker vanlige pakkekilder, og egendefinerte kilder og tilkoblinger legger til resten. Jobbsporet viser hver tilkobling, og hver blokkerte som et brudd med årsaken. Fordi proxyen er pakkebevisst, blir den samme registreringen jobbens SBOM. API-et returnerer SBOM-er, nettverksspor og provenance.

CRACI har ennå ingen egen revisjonsmodus; den står på veikartet. Uten en nettverkspolicy tillates trafikken fra en jobb og registreres i sporet, så du kan se hva en policy trenger før du håndhever den. CRACI kjører GitHub Actions-jobber på Linux. Se CI/CD-sikkerhetsverktøy sammenlignet og CRACI vs StepSecurity.

Egress-policyer i CI: ofte stilte spørsmål

Hva er en egress-policy i CI?

Et regelsett for de utgående nettverkstilkoblingene en CI-jobb kan gjøre. Jobben når pakkeregistrene og tjenestene den trenger, og alle andre destinasjoner blokkeres.

Ville en egress-policy ha stoppet tj-actions-kompromitteringen?

Ikke alene. I det tilfellet rapporterte CISA at hemmeligheter ble eksponert gjennom workflow-logger, ikke sendt til en ekstern server. En egress-policy stenger nettverkskanalen; å feste actions til commit-SHA-er og holde logger private tar for seg loggkanalen.

Ødelegger blokkering av egress bygg?

Det kan skje, hvis policyen mangler en kilde bygget trenger. Begynn med å registrere hva jobben kobler seg til, bygg tillatelseslisten ut fra det, og blokker deretter. På CRACI dekker innebygde forhåndsinnstillinger vanlige pakkekilder, og en blokkert tilkobling vises i jobbsporet med årsaken.

Kan jeg bruke en egress-policy på GitHub-hostede runnere?

Ja, med en agent lagt til i jobben, for eksempel StepSecurity Harden-Runner. Eller flytt jobben til en runner som håndhever policyen selv, for eksempel CRACI.

Sett én jobb bak en egress-policy

Kjør én workflow på CRACI, og se hver tilkobling den gjorde, hvilke en default deny-policy ville blokkert, og SBOM-en over det den hentet.

Book en demo