Onveilige artefacten downloaden via GitHub Acties

De manier waarop het GitHub Actions-platform build-artefacten opslaat, zou aanvallers in staat kunnen stellen kwaadaardige code in softwareprojecten te injecteren met CI/CD-workflows (Continuous Integration en Continuous Delivery) die bij het downloaden van artefacten onvoldoende filtering toepassen. Onderzoekers op het gebied van cyberbeveiliging hebben verschillende populaire scripts voor het downloaden van artefacten geïdentificeerd die door duizenden repositories worden gebruikt en die kwetsbaar zijn voor dit probleem.

“We hebben vastgesteld dat wanneer artefacten tussen verschillende workflows worden overgedragen, er een groot risico bestaat op ”artefactvergiftiging’ – een techniek waarbij een aanvaller de inhoud van een legitiem artefact vervangt door een aangepast, kwaadaardig artefact om een aanval op de toeleveringsketen uit te voeren,” aldus onderzoekers van het ketenbeveiligingsbedrijf Legit Security bij hun analyse van het probleem.

Om de CI/CD-pijplijn van een kwetsbaar project aan te vallen die artefacten downloadt en gebruikt die door andere workflows zijn gegenereerd, hoeft een aanvaller alleen maar de repository met die workflows te forken en ze in de lokale kopie zodanig aan te passen dat ze malafide artefacten genereren, en vervolgens pull-verzoeken in te dienen bij de oorspronkelijke repository, die deze verzoeken niet hoeft te accepteren.

Logische fout in de API voor het opslaan van artefacten

GitHub Actions is een CI/CD-platform voor het automatiseren van het bouwen en testen van softwarecode. De dienst is gratis voor openbare repositories en biedt gratis worker-runtime en opslagruimte voor privé-repositories. Het wordt op grote schaal gebruikt door projecten die GitHub inzetten voor het hosten en beheren van hun broncoderepositories.

1 seconde van 27 seconden, deel 01, TP5T

GitHub Actions-workflows zijn geautomatiseerde processen die in .yml-bestanden met YAML-syntaxis worden gedefinieerd en die worden uitgevoerd wanneer bepaalde triggers of gebeurtenissen plaatsvinden, bijvoorbeeld wanneer er nieuwe code naar een repository wordt gecommit. Build-artefacten zijn gecompileerde binaire bestanden, logbestanden en andere bestanden die voortkomen uit de uitvoering van een workflow en de afzonderlijke taken daarvan. Deze artefacten worden opgeslagen in buckets, en aan elke workflow-uitvoering wordt een specifieke bucket toegewezen waaruit bestanden kunnen worden geüpload en later gedownload.

De door GitHub aangeboden standaard-“action” (script) voor het downloaden van artefacten biedt geen ondersteuning voor het downloaden van artefacten uit verschillende workflows, maar het hergebruiken van artefacten die door verschillende workflows zijn gegenereerd als invoer voor volgende buildstappen is een veelvoorkomend gebruiksscenario bij softwareprojecten. Daarom maken ontwikkelaars hun eigen aangepaste scripts die gebruikmaken van de GitHub Actions API om met complexere filters artefacten te downloaden, zoals artefacten die zijn aangemaakt door specifieke workflowbestanden, specifieke gebruikers, specifieke branches, enzovoort.

Het door Legit Security ontdekte probleem is dat de API geen onderscheid maakt tussen artefacten die zijn geüpload vanuit geforkte repositories en basisrepositories. Als een downloadscript dus artefacten filtert die zijn gegenereerd door een specifiek workflowbestand uit een specifieke repository, zal de API de nieuwste versie van de door dat bestand gegenereerde artefacten leveren, Maar dit zou een kwaadaardige versie kunnen zijn die automatisch is gegenereerd via een pull-request vanuit een geforkte versie van de repository.

“Simpel gezegd: in een kwetsbare workflow kan elke GitHub-gebruiker een branch aanmaken waarmee een artefact wordt gebouwd,” aldus de onderzoekers. “Dit artefact wordt vervolgens in het bouwproces van de oorspronkelijke repository geïnjecteerd, waardoor de output ervan wordt gewijzigd. Dit is een andere vorm van een aanval op de softwaretoeleveringsketen, waarbij de output van het bouwproces door de aanvaller wordt gewijzigd.”.

Onderzoekers hebben vier door de community ontwikkelde aangepaste acties ontdekt waarmee alle kwetsbare artefacten kunnen worden gedownload. Een daarvan staat als afhankelijkheid vermeld in meer dan 12.000 repositories.

Een roestig voorbeeld

Een van de repositories die dergelijke aangepaste scripts in een van zijn workflows gebruikt, is de officiële repository van de programmeertaal Rust. De kwetsbare workflow met de naam ci.yml is verantwoordelijk voor het bouwen en testen van de code van de repository en maakt gebruik van een aangepaste actie om een artefact met de naam libgccjit.so (een Linux-bibliotheekbestand) te downloaden, dat wordt aangeboden door een repository van een derde partij. Genereren van workflows.

Het enige wat een aanvaller hoeft te doen, is een repository van een derde partij forken, de workflow van die repository aanpassen om een kwaadaardige versie van de bibliotheek te genereren, en een pull-verzoek indienen bij de oorspronkelijke repository om het artefact te genereren. Als een Rust-workflow vervolgens een besmette versie van de bibliotheek zou introduceren, zou een aanvaller in staat zijn om kwaadaardige code uit te voeren in de Rust-repository met behulp van de rechten van de workflow.

“Zodra deze kwetsbaarheid wordt misbruikt, kan een aanvaller repository-branches, pull-verzoeken, issues, releases en alle entiteiten wijzigen waarvoor workflow-tokenrechten gelden,” aldus de onderzoekers.

Gebruikers moeten strengere filters toepassen bij het downloaden van artefacten

GitHub reageerde op het rapport van Legit door meer filtermogelijkheden aan de API toe te voegen, waarmee ontwikkelaars beter kunnen vaststellen welke artefacten zijn aangemaakt door een specifieke actieve instantie van een workflow (workflow-run-ID). Deze wijziging kan echter niet in bestaande implementaties worden doorgevoerd zonder dat workflows worden verstoord, dus gebruikers zullen hun workflows moeten bijwerken met strengere filters om beschermd te zijn.

Een andere manier om dit risico te beperken is het filteren van gedownloade artefacten op basis van de hash van de commit waarmee ze zijn gegenereerd, of het volledig uitsluiten van artefacten die via pull-verzoeken zijn aangemaakt met behulp van de optie `exclude_pull_requests`. Legit Security heeft ook contact opgenomen met de auteur van het kwetsbare aangepaste script voor het downloaden van artefacten dat zij hebben ontdekt.

“Als het gaat om de beveiliging van de supply chain, ligt de focus altijd op het voorkomen dat mensen kwaadaardige code toevoegen. Daarom beschikt GitHub over tal van ingebouwde validatiecontroles telkens wanneer je een wijziging aanbrengt in een repository, een pull-verzoek indient of een wijzigingsverzoek indient,” vertelde Liav Caspi, Chief Technology Officer bij Legit Security, aan CSO. “Iemand moet je code goedkeuren, iemand moet deze samenvoegen, dus er is altijd iemand bij betrokken. We zijn op zoek geweest naar technieken die misbruik maken van logische kwetsbaarheden waarbij iedereen invloed kan uitoefenen zonder dat er een controle plaatsvindt, en ik denk dat dit er een van is. Als iemand hiervan op de hoogte was, zou hij of zij het artefact zonder enige goedkeuring kunnen injecteren.”

Volgens Caspi wordt de workflow van een CI-pijplijn doorgaans automatisch uitgevoerd bij een pull-verzoek om de code te testen voordat deze handmatig wordt beoordeeld, en als het pull-verzoek artefacten bevat die moeten worden gebouwd, zal de workflow deze bouwen. Hij zei dat een geavanceerde aanvaller een pull-verzoek zou kunnen maken om een artefact te bouwen en vervolgens het verzoek zou kunnen verwijderen door de commit te sluiten, en dat alle ruis in de activiteit die tegenwoordig in broncoderepositories aanwezig is, hoogstwaarschijnlijk onopgemerkt zou blijven.