Apiiro: Claude Code tallensi salasanoja lupatiedostoon – kopioita julkisesti GitHubissa
Tietoturvayhtiö Apiiron mukaan Claude Coden ”Yes, and don't ask again” -valinta voi tallentaa hyväksytyn komennon salasanoineen projektikansion tiedostoon. Jos tiedosto on joskus viety GitHubiin, Apiiro neuvoo vaihtamaan salaisuudet ennen siivousta.
Tietoturvayhtiö Apiiro julkaisi tutkimuksensa 5. marraskuuta.
Anthropicin koodausagentti Claude Code kysyy luvan ennen useimpia komentorivikomentoja. Kun käyttäjä valitsee ”Yes, and don't ask again”, Claude Code tallentaa sallintasäännön projektikansion tiedostoon .claude/settings.local.json, eikä samaa komentoa enää kysytä. Joskus sääntö on kaava, joskus yksi tarkka komento. Tarkan komennon mukana tallentuu selväkielisenä myös siihen kirjoitettu salasana tai token. Apiiron mukaan vika on Claude Codessa eikä mallissa: yhtiö toisti ilmiön Opus 5.5- ja Fable 5.1 -malleilla.
Kun Claude Code luo tiedoston git-repositorioon, se lisää tiedoston käyttäjän globaaliin git-ohituslistaan, mutta asetus on voimassa vain sillä koneella. Se ei suojaa toiselle koneelle kloonattua projektia, myöhemmin repositorioksi muutettua kansiota eikä jo commitoitua tiedostoa. Projektin omaan .gitignore-tiedostoon Claude Code ei sääntöä lisää.
Apiiro jäljitti 1 105 repositoriota, joissa oli todellinen salaisuus, ja niistä 539:ssä tiedostoa muutti commit, jonka tekijöihin Claude oli merkitty. Apiiro päättelee tästä, että Claude usein commitoi tiedoston itse. Agentbeamin blogin mukaan merkintä osoittaa kuitenkin vain sen, että Claude osallistui commitiin.
Yli tuhat julkista tiedostoa
Apiiro kävi 1.–3. marraskuuta läpi GitHubista 104 185 julkista kopiota tiedostosta. Yhtiön luokittelun mukaan 1 122:ssa niistä eli 1,1 prosentissa oli todellinen salaisuus, yhteensä 1 379 eri salaisuutta. Niistä yli kolmannes avaa suoraan tietokannan. Kun mukaan lasketaan tiedoston vanhat versiot, tiimien tarkoituksella jakama .claude/settings.json ja tallennetut agenttikeskustelut, salaisuuksia on 2 539 yhteensä 1 994 repositoriossa.
Apiirolle todellinen salaisuus on tunnetun avainmuodon mukainen arvo tai salasana, jonka vieressä on julkisen palvelimen osoite, ei toimivaksi todettu tunnus. Sääntöjen lisäksi arvot tarkisti kielimalliarvioija. Apiiro ei kokeillut tunnuksia, mutta yksi Apiiron ilmoituksen saanut yritys vahvisti, että sen avain oli ollut voimassa. P.K. Sharman analyysi muistuttaa, että Apiiro myy salaisuuksien suojaustuotteita eikä kukaan muu ole toistanut laskentaa.
Kumpikaan salaisuusskanneri, gitleaks tai TruffleHog, ei tunnistanut 215:tä salaisuuksia sisältänyttä tiedostoa. Apiiron mukaan syy on komentoon kirjoitettu salasana, joka ei näytä tunnetulta avainmuodolta.
Ensin vaihto, sitten siivous
Apiiro neuvoo hakemaan GitHub-organisaatiosta tiedostoja .claude/settings.local.json ja .claude/settings.json sekä käymään kunkin repositorion git-historian läpi myös silloin, kun tiedostoa ei enää ole. Enzo Solerin sivusto mainitsee historian tarkistukseen komennon git log --all -- .claude/settings.local.json. Löytyneistä tiedostoista kannattaa lukea sallintasäännöt ja etsiä salasanoja, tokeneita ja yhteysosoitteita.
Apiiro neuvoo vaihtamaan salaisuudet ensin ja siivoamaan vasta sen jälkeen. Tiedoston poistaminen ei riitä, koska vanhat versiot jäävät git-historiaan, forkkeihin ja klooneihin. Historiasta löytyi 734 salaisuutta, joita ei ollut enää yhdessäkään nykyisessä kopiossa. Jos git seuraa tiedostoa, se irrotetaan versionhallinnasta komennolla git rm --cached .claude/settings.local.json, ja polku lisätään projektin omaan .gitignoreen.
Myös koneelle jääneestä tiedostosta kannattaa poistaa säännöt, joissa on salaisuus, koska haittaohjelmat ovat keränneet tunnuksia kehittäjien koneilta. Apiiro neuvoo viittaamaan salaisuuksiin salaisuuksien hallinnasta haettavilla muuttujilla, kuten $DB_URL, jolloin sääntöön jää muuttujan nimi, ja hyväksymään kaavoja yksittäisten komentojen sijaan.
Lue lisää: Miten agentti toimii · Agenttikartta