Securitate cibernetică
Copilot Autofix a deschis o injecție de shell în pipeline‑ul CI/CD al Snowflake

Un patch de securitate scris de Copilot Autofix de la GitHub și integrat într-un depozit Snowflake pe 18 iunie 2026 a eliminat un model de intrare sanitizat și a lăsat pipeline‑ul CI/CD al companiei vulnerabil la injecție de comandă, iar cinci zile mai târziu, un agent autonom de cercetare AI a descoperit vulnerabilitatea, a exploatat‑o și a extras credențiale Jira funcționale dintr-un runner GitHub Actions, Wiz Research a dezvăluit pe 17 august 2026.
Vulnerabilitatea se afla în jira_issue.yml, un workflow GitHub Actions în snowflakedb/snowflake-connector-net, depozitul public pentru conectorul de date .NET al Snowflake. Workflow‑ul se declanșa ori de câte ori cineva deschidea un issue pe GitHub și insera titlul issue‑ului (text controlat în totalitate de persoana care îl creează) direct într-un script shell. Deoarece declanșatorul era issues: opened, orice cont GitHub de pe internet putea accesa fără autentificare.
„Red Agent” de la Wiz, un instrument autonom de cercetare în securitate care operează prin programul de bug bounty al Snowflake pe HackerOne, a semnalat workflow‑ul, a construit un exploit funcțional și a exfiltrat un token API Jira din mediul runner‑ului. Snowflake a corectat workflow‑ul în aceeași zi în care a primit raportul, 23 iunie 2026, a rotit credențialul cu o zi mai târziu și i-a comunicat lui Wiz că jurnalele de audit nu arată că alt actor a accesat sistemele expuse în intervalul de cinci zile.
„Autofix” a eliminat filtrul de sanitizare
Commit‑ul care a introdus modelul injectabil a ajuns prin PR #1218, „SNOW-2069227: Update jira workflows”, integrat pe 18 iunie 2026. Istoricul pull request‑ului arată un autor uman lucrând la automatizarea Jira din august 2025 — și, la jumătatea procesului, un commit co‑autor cu Copilot Autofix powered by AI, botul GitHub Advanced Security care generează remedieri sugerate pentru alertele de scanare a codului.
Sugestia AI a modificat modul în care workflow‑ul gestiona titlul issue‑ului. Codul existent transmitea titlul printr-o variabilă env: și construi payload‑ul JSON cu jq --arg, un model care ține textul neîncredere în afara shell‑ului. Înlocuirea propusă a renunțat la acesta în favoarea expansiunii directe a șirului:
“ run: | TITLE=$(echo '${{ github.event.issue.title }}' | sed 's/"/\"/g' | sed "s/'/\'/g") “`
Escaparea cu sed se execută după ce motorul de șabloane al GitHub a înlocuit deja titlul în script. Un apostrof în titlu iese din învelișul echo '...', iar tot ce urmează se execută ca shell. Documentația GitHub pentru Copilot Autofix descrie funcționalitatea ca generarea „unei singure remedieri sugerate pentru o alertă, pe care o revizuiți și o aplicați voi înșivă” — pasul de revizuire este locul în care această remediere a trecut.
Workflow‑ul conținea, de asemenea, o condiție de protecție care părea să restricționeze cine îl poate declanșa:
“ if: (github.event_name == 'issues' && github.event.pull_request.user.login != 'whitesource-for-github-com[bot]') “`
La evenimentele de tip issue, github.event.pull_request este întotdeauna null, astfel că comparația evaluează întotdeauna true. Orice utilizator GitHub a trecut de poartă.
Un agent pe fiecare parte a exploatului
Prima încercare de exfiltrare a Red Agent a eșuat. Payload‑ul său a folosit caracterul de comentariu # pentru a absorbi restul liniei injectate, dar comentariul a consumat și paranteza de închidere a TITLE=$(...), iar runner‑ul a returnat o eroare de sintaxă bash în loc să execute. Conform raportului Wiz, agentul a analizat eroarea, a rescris payload‑ul pentru a închide blocul shell cu ; echo ', și a încercat din nou.
Payload‑ul funcțional, livrat ca titlu de issue, a codificat în base64 variabilele de mediu ale runner‑ului JIRA_API_TOKEN, JIRA_USER_EMAIL și JIRA_BASE_URL și le-a trimis către un ascultător out‑of‑band prin curl. Callback‑ul a sosit de la un runner GitHub Actions găzduit pe Azure în câteva secunde.
Token‑ul recuperat s‑a autentificat ca qa@snowflake.net pe snowflakecomputing.atlassian.net, având acces de citire la proiectele de inginerie, conformitate de securitate și urmărire a bug bounty‑urilor ale Snowflake.
Remedierea Snowflake, integrată în PR #1402 pe 23 iunie 2026, a restaurat variabila sigură env: și modelul de parsare jq --arg. Token‑ul Jira a fost revocat și rotit pe 24 iunie 2026. Wiz a declarat că a șters în mod securizat toate datele accesate în timpul testării proof‑of‑concept.
„Snowflake apreciază raportarea responsabilă și colaborarea cu Wiz în legătură cu aceste constatări prin programul nostru de divulgare a vulnerabilităților și bug bounty, HackerOne”, a declarat compania într-un comunicat publicat împreună cu raportul Wiz. „Divulgarea a fost primită pe 23 iunie 2026, a fost investigată și remediată imediat, iar investigația noastră nu a găsit dovezi de acces neautorizat.”
Ce arată fereastra de cinci zile
Divulgarea apare în mijlocul unui model documentat: modificări asistate de AI care trec prin revizuire mai repede decât presupunerile de securitate legate de ele. Jurnalele de audit ale Snowflake sunt cele care fac acest incident lizibil: ele permit companiei să declare, iar Wiz să confirme, că fereastra de expunere nu a produs acces din partea terților. Analiza jurnalelor de audit a Snowflake a confirmat că niciun terț extern nu a accesat punctul final în intervalul de cinci zile.
Cronologia comprimă, de asemenea, o secvență pe care industria a tratat‑o ca ipotetică. Un asistent de codare a eliminat un model defensiv care fusese implementat special pentru a preveni injecția de shell, deoarece asistentul nu avea nicio înregistrare a motivului existenței acelui model. Un agent ofensiv a găsit apoi și a exploatat rezultatul în câteva zile, corectându‑și automat exploatarea pe baza ieșirii de eroare în timp real. Partea de exploatare a rulat fără un om la tastatură; în partea de codare, AI a generat modificarea, dar un om a aplicat sugestia și a integrat‑o — exact pasul de revizuire care a eșuat.
Raportul Wiz recomandă ca pull request‑urile generate de AI să treacă prin aceeași analiză statică ca și codul uman, ca echipele să reducă durata de viață a credențialelor pentru a se potrivi cu viteza descoperirii automate și ca barierele să împiedice agenții să înlocuiască parserele structurate cu interpolare directă de șiruri. Check Point a mutat inspecția de prompt pentru traficul AI în firewall‑urile enterprise la începutul verii, iar Unite.AI a acoperit evadările din sandbox‑ul agenților și sisteme agentice care ating ținte de producție reale pe măsură ce partea ofensivă maturizează. Incidentul Snowflake este aceeași poveste spusă din interiorul unui pipeline CI: vulnerabilitatea a fost activă timp de cinci zile, iar singurul motiv pentru care este prezentată ca un studiu de caz și nu ca o notificare de încălcare este care agent a ajuns primul.












