Tietoturvayhtiö Apiiro löysi julkisesta GitHubista 2 539 aitoa salaisuutta 1 994 repositoriosta. Joukossa on tietokantojen salasanoja, pilvipalvelujen avaimia, maksurajapintojen tunnisteita ja SSH-pääkäyttäjän kirjautumisia. Suurin yksittäinen lähde on Claude Coden tiedosto, johon koodausagentti tallentaa kehittäjän hyväksymät komennot.
Ongelma syntyy arkisesta napautuksesta. Kun kehittäjä valitsee Claude Coden kysymykseen vaihtoehdon "Yes, and don't ask again", työkalu tallentaa komennon sellaisenaan. Jos komennossa on salasana, myös salasana päätyy tiedostoon ja sieltä usein versionhallintaan.
Apiiron mukaan kyse on Claude Coden omasta toiminnasta, ei kielimallin virheestä. Yhtiö toisti ilmiön myös Anthropicin uusimmilla malleilla, Opus 5.5:llä ja Fable 5.1:llä.
Miten salaisuus päätyy asetustiedostoon
Kehittäjän koneella on aina salaisuuksia: tietokannan yhteysmerkkijono asetustiedostossa, pilviavaimet paikallisessa asennuksessa ja API-tunniste .env-tiedostossa. Kun agenttia pyytää selvittämään kirjautumisvian testiympäristössä tai ajamaan migraation, sen ehdottama komento sisältää salaisuuden. Ilman sitä komento ei toimisi.
Claude Code kysyy luvan ennen jokaista komentorivikomentoa, usein monta kertaa saman istunnon aikana. "Älä kysy uudelleen" -valinta lisää projektikansion .claude/settings.local.json-tiedostoon sallittujen komentojen säännön. Sääntö on itse komentomerkkijono, joten salasana tallentuu siihen selväkielisenä.
Claude Code yrittää pitää tiedoston paikallisena lisäämällä sen kehittäjän globaaliin git-ohitusluetteloon. Suoja ei kuitenkaan kulje projektin mukana, koska sääntöä ei kirjoiteta repositorion omaan .gitignore-tiedostoon. Se ei auta, jos kansiosta tehdään repositorio myöhemmin, projekti kloonataan toiselle koneelle tai tiedosto on jo kerran committoitu.
Usein agentti committoi tiedoston itse. Apiiro jäljitti 1 105 repositoriota, joissa oli aito salaisuus. Niistä 539:ssä tiedostoa oli muuttanut commit, jonka toisena tekijänä oli Claude.

Laajuus: tuhansia tiedostoja ja 63 organisaatiota
Julkisessa GitHubissa on 104 185 kopiota settings.local.json-tiedostosta. Niistä 1 122 sisältää aidon salaisuuden, yhteensä 1 379 eri tunnistetta. Yli kolmannes avaa suoraan tietokannan: joukossa on 379 tietokantasalasanaa ja 122 Supabasen palvelutason avainta.
Vuoto koskee 63 organisaatiota, enimmäkseen eri kokoisia ohjelmistoyrityksiä. Vakavimpia tapauksia ovat tietokantatoimittajan oma hallinta-avain ilman vanhenemisaikaa, tuotannon Azure Postgres -salasana, Squaren tuotantotunniste sekä potilastietosovelluksen tietokannan omistajasalasana. Yksi yritys vahvisti, että sen avain oli ollut voimassa.
Tiedostot ovat myös vanhoja. Mediaanirepositoriossa tiedosto oli committoitu ensimmäisen kerran 217 päivää ennen tutkimusta, ja 118 repositoriossa yli vuotta aiemmin. Lisäksi 211 haaraa eli forkia kopioi samat salaisuudet eteenpäin.
Tiedoston poistaminen ei ratkaise ongelmaa. Versiohistoriasta löytyi 734 salaisuutta, jotka eivät enää näy nykyisessä tiedostossa. Kun mukaan lasketaan jaettu settings.json, agenttien keskustelulokit ja muistitiedostot, kokonaismäärä nousee 2 539 salaisuuteen.

Skannerit eivät tunnista komentoihin kirjoitettuja salasanoja
Apiiro ajoi kaikki tiedostot kahden yleisen skannerin, gitleaksin ja TruffleHogin, läpi. Gitleaks tunnisti 564 ja TruffleHog 643 niistä 1 122 tiedostosta, joissa oli aito salaisuus. Joka viidettä tiedostoa kumpikaan työkalu ei merkinnyt.
Syy on salaisuuksien muodossa. Skannerit etsivät tunnettuja avainmuotoja, kuten palveluntarjoajan etuliitettä ja pitkää satunnaista merkkijonoa. PGPASSWORD-muuttujan, sshpass-komennon tai curl-kutsun bearer-otsakkeen perään kirjoitettu salasana näyttää tavalliselta sanalta tavallisella komentorivillä.
Sama kaava toistuu muissakin agenttien kirjoittamissa tiedostoissa. Jaetusta settings.json-tiedostosta löytyi salaisuus 298 tapauksessa, ja agenttien keskustelulokeista 120 tiedostosta. Myös muistitiedostot, luovutusmuistiot ja VS Coden Copilot-asetukset sisälsivät tunnisteita.
Vaara ei rajoitu GitHubiin. Sama tiedosto on selväkielisenä jokaisella koneella, jolla joku on valinnut "älä kysy uudelleen". Shai-Hulud-niminen npm-mato ajoi syyskuussa 2025 TruffleHogia uhrien tiedostoihin, ja se olisi tunnistanut 643 tutkimuksen tiedostoista.

Näin kehittäjä ja tietoturvatiimi korjaavat ongelman
Apiiron ensimmäinen ohje on yksinkertainen: vaihda tunnisteet ensin, siivoa vasta sitten. Jos tiedosto on repositoriossa, se poistetaan seurannasta komennolla git rm --cached ja lisätään projektin omaan .gitignore-tiedostoon. Jokainen tiedostossa koskaan ollut tunniste pitää vaihtaa, koska historia, forkit ja kloonit säilyttävät vanhan version.
Myös paikallisesti säilynyt tiedosto kannattaa avata ja poistaa sieltä säännöt, joissa on salaisuus. Pysyvä ratkaisu on lopettaa salaisuuksien kirjoittaminen komentoihin. Kun salasana viitataan ympäristömuuttujana, kuten $DB_URL, sääntöön tallentuu vain muuttujan nimi.
Yksittäisten komentojen sijaan kannattaa hyväksyä kaavoja, kuten Bash(npm run:*). Tietoturvatiimien kannattaa käsitellä .claude-, .cursor- ja .gemini-kansioita samalla vakavuudella kuin .env-tiedostoja. Ne kuuluvat commitia edeltävään ja CI-putken salaisuusskannaukseen, ja skannerin pitää tunnistaa myös komentoihin upotetut salasanat.
Apiiron mukaan käyttäjät ovat raportoineet mekanismista Anthropicin GitHub-sivuilla elokuusta 2025 lähtien. Yksikään neljästä ilmoituksesta ei saanut vastausta Anthropicilta, ja kolme suljettiin automaattisesti. Apiiro vertasi 16 koodausagentin dokumentaatiota, ja Claude Code oli niistä ainoa, joka tallentaa hyväksytyn komennon kokonaisena projektitiedostoon oletuksena.

Yhteenveto
Apiiron tutkimus osoittaa, että koodausagentin mukavuustoiminto voi muuttua hiljaiseksi vuotokanavaksi. Yksi "älä kysy uudelleen" -napautus riittää, kun hyväksytyssä komennossa on salasana ja projektin .gitignore ei suojaa tiedostoa.
Korjaus on kehittäjän omissa käsissä jo nyt: tunnisteiden vaihto, tiedoston poisto seurannasta ja salaisuuksien siirto ympäristömuuttujiin. Pidemmän aikavälin kysymys on, muuttaako Anthropic Claude Coden oletustoimintaa vai jääkö vastuu edelleen käyttäjille ja heidän skannereilleen.
