Cyberbeveiliging

Copilot Autofix Opende een Shell‑injectie in de CI/CD‑pipeline van Snowflake

mm
Voeg Unite.AI toe aan je voorkeursbronnen op Google

Een beveiligingspatch geschreven door GitHub’s Copilot Autofix en op 18 juni 2026 samengevoegd in een Snowflake‑repository verwijderde een gesaniteerd invoerpatroon en liet de CI/CD‑pipeline van het bedrijf openstaan voor commandoinjectie, en vijf dagen later vond een autonoom AI‑onderzoeksagent het lek, maakte er gebruik van en haalde werkende Jira‑referenties uit een GitHub Actions‑runner, Wiz Research heeft op 17 augustus 2026 bekendgemaakt.

De kwetsbaarheid zat in jira_issue.yml, een GitHub Actions‑workflow in snowflakedb/snowflake-connector-net, de openbare repository voor Snowflake’s .NET‑dataconnectors. De workflow werd geactiveerd telkens wanneer iemand een GitHub‑issue opende en interpoleerde de titel van het issue (tekst volledig beheerd door de indiener) direct in een shell‑script. Omdat de trigger issues: opened was, kon elk GitHub‑account op internet er zonder authenticatie bij.

Wiz’s “Red Agent,” een autonoom beveiligingsonderzoeksinstrument dat opereert via Snowflake’s HackerOne‑bug‑bounty‑programma, markeerde de workflow, bouwde een werkende exploit en exfiltreerde een Jira‑API‑token uit de omgeving van de runner. Snowflake patchte de workflow dezelfde dag dat het rapport werd ontvangen, 23 juni 2026, roteerde de referentie een dag later, en vertelde Wiz dat de audit‑logs geen andere actor hadden laten zien die de blootgestelde systemen tijdens het vijfdaagse venster had aangeraakt.

De “Autofix” verwijderde de sanitisator

De commit die het injecteerbare patroon introduceerde kwam via PR #1218, “SNOW-2069227: Update jira workflows”, binnen op 18 juni 2026. De geschiedenis van de pull‑request toont een menselijke auteur die sinds augustus 2025 aan de Jira‑automatisering werkt — en halverwege een commit mede‑auteur was van Copilot Autofix powered by AI, de GitHub Advanced Security‑bot die voorgestelde oplossingen genereert voor code‑scanning‑waarschuwingen.

De AI‑suggestie wijzigde hoe de workflow de issue‑titel behandelde. De bestaande code gaf de titel door via een env:‑variabele en bouwde de JSON‑payload met jq --arg, een patroon dat onbetrouwbare tekst buiten de shell houdt. Het voorgestelde alternatief verving dat door directe tekenreeks‑expansie:

run: | TITLE=$(echo '${{ github.event.issue.title }}' | sed 's/"/\"/g' | sed "s/'/\'/g")

De sed‑escaping wordt uitgevoerd nadat de sjabloonengine van GitHub de titel al in het script heeft geplaatst. Een enkel aanhalingsteken in de titel breekt uit de echo '...'‑omslag, en alles erna wordt als shell uitgevoerd. GitHub’s eigen documentatie voor Copilot Autofix beschrijft de functie als het genereren van “een enkele voorgestelde oplossing voor een waarschuwing, die je zelf beoordeelt en toepast” — de beoordelingsstap is waar deze doorheen kwam.

De workflow bevatte bovendien een guard‑conditie die leek te beperken wie deze kon activeren:

if: (github.event_name == 'issues' && github.event.pull_request.user.login != 'whitesource-for-github-com[bot]')

Bij issue‑events is github.event.pull_request altijd null, waardoor de vergelijking altijd waar is. Elke GitHub‑gebruiker kwam daardoor door de poort.

Een agent aan elke kant van de exploit

De eerste exfiltratie‑poging van Red Agent mislukte. Zijn payload gebruikte een #‑commentaarteken om de rest van de geïnjecteerde regel te absorberen, maar het commentaar verbruikte ook de sluitende haak van TITLE=$(...), waardoor de runner een bash‑syntaxisfout retourneerde in plaats van uit te voeren. Volgens Wiz’s verslag analyseerde de agent de fout, herschreef zijn payload om het shell‑blok te sluiten met ; echo ', en probeerde opnieuw.

De werkende payload, geleverd als issue‑titel, base64‑codeerde de omgevingvariabelen JIRA_API_TOKEN, JIRA_USER_EMAIL en JIRA_BASE_URL van de runner en stuurde deze via curl naar een out‑of‑band‑listener. De callback kwam binnen enkele seconden van een Azure‑gehoste GitHub Actions‑runner.

Het teruggevonden token werd geauthenticeerd als [email protected] tegen snowflakecomputing.atlassian.net, met leestoegang tot Snowflake’s engineering‑, security‑compliance‑ en bug‑bounty‑volgprojecten.

De remediering van Snowflake, samengevoegd in PR #1402 op 23 juni 2026, herstelde de veilige env:‑variabele en het jq --arg‑ontleedpatroon. Het Jira‑token werd ingetrokken en op 24 juni 2026 geroteerd. Wiz meldde dat het alle tijdens de proof‑of‑concept‑test geraadpleegde gegevens veilig had verwijderd.

“Snowflake waardeert de verantwoordelijke rapportage en samenwerking van Wiz rond deze bevindingen via ons kwetsbaarheids‑disclosure‑ en bug‑bounty‑programma, HackerOne,” zei het bedrijf in een verklaring die samen met het Wiz‑rapport werd gepubliceerd. “De melding werd ontvangen op 23 juni 2026, en werd onmiddellijk onderzocht en verholpen, en ons onderzoek vond geen bewijs van ongeautoriseerde toegang.”

Wat het vijfdaagse venster aantoont

De openbaarmaking valt midden in een gedocumenteerd patroon: AI‑ondersteunde wijzigingen die sneller door de review komen dan de beveiligingsveronderstellingen eromheen. Snowflake’s eigen audit‑logs maken dit incident inzichtelijk: ze stellen het bedrijf in staat, en Wiz bevestigt, dat het blootstellingsvenster geen toegang door derden heeft opgeleverd. De audit‑loganalyse van Snowflake bevestigde dat geen externe derden het eindpunt tijdens het vijfdaagse venster hebben benaderd.

De tijdlijn comprimeert bovendien een reeks die de industrie als hypothetisch heeft beschouwd: een code‑assistent verwijderde een verdedigingspatroon dat specifiek was ingesteld om shell‑injectie te voorkomen, omdat de assistent geen record had waarom dat patroon bestond. Een offensieve agent vond vervolgens het resultaat en wapeniseerde het binnen dagen, waarbij hij zijn exploit zelf corrigeerde op basis van live‑foutoutput. De exploit‑kant draaide zonder mens achter het toetsenbord; aan de code‑kant genereerde de AI de wijziging, maar een mens paste de suggestie toe en voegde deze samen — precies de beoordelingsstap die faalde.

Het rapport van Wiz beveelt aan dat AI‑gegenereerde pull‑requests dezelfde statische analyse ondergaan als menselijke code, dat teams de levensduur van referenties verkorten om te passen bij de snelheid van geautomatiseerde ontdekking, en dat guardrails agents blokkeren om gestructureerde parsers te vervangen door directe tekenreeks‑interpolatie. Check Point heeft eerder deze zomer de prompt‑inspectie voor AI‑verkeer in enterprise‑firewalls verplaatst, en Unite.AI heeft agent‑sandbox‑ontsnappingen en agent‑systemen die echte productiedoelen bereiken behandeld, nu de offensieve kant rijpt. Het Snowflake‑incident is hetzelfde verhaal, verteld vanuit een CI‑pipeline: de kwetsbaarheid was vijf dagen live, en de enige reden dat het als een case‑study wordt gepresenteerd in plaats van een inbreukmelding, is welke agent er eerst was.

Miles Okada is een door AI gegenereerde analist bij Unite.AI, waar hij artificiële intelligentie en cybersecurity behandelt met een focus op opkomende bedreigingen, defensieve architectuur en de evoluerende dynamiek tussen aanvallers en geautomatiseerde systemen. Zijn werk onderzoekt hoe AI de beveiligingsoperaties vormgeeft, van autonome dreigingsdetectie en -reactie tot de opkomst van tegenwerkende AI-technieken.
Met een technische en onderzoekende benadering, analyseert Miles beveiligingsonderzoek, incidentmeldingen en echte implementaties om te begrijpen waar AI de verdediging versterkt - en waar het nieuwe kwetsbaarheden introduceert. Hij let met name op modeluitbuiting, datapervering, aanvalsautomatisering en de operationele realiteiten van het beveiligen van AI-gepowered systemen op grote schaal.
Artikelen geschreven door Miles Okada zijn AI-gegenereerd en worden beoordeeld door het redactionele team van Unite.AI om accuratesse, rigor en verantwoorde dekking van het snel veranderende AI-beveiligingslandschap te garanderen.