Home / News / Claude Code: 1.122 copie pubbliche con credenziali in chiaro su GitHub

Claude Code: 1.122 copie pubbliche con credenziali in chiaro su GitHub

Password e chiavi API digitate in comandi accettati da Claude Code sono state scoperte salvate in chiaro nel file .claude/settings.local.json, presente in 1.122 repository pubblici su GitHub. La società di sicurezza Apiiro ha rilevato che, in alcuni casi, le credenziali compromesse risultavano ancora attive.

Claude Code: 1.122 copie pubbliche con credenziali in chiaro su GitHub

Il problema si manifesta quando l’utente, durante una sessione di coding assistito dall’intelligenza artificiale, seleziona l’opzione “Yes, and don’t ask again” in risposta a una richiesta di conferma. In questa circostanza, l’assistente di programmazione sviluppato da Anthropic può salvare il comando completo, incluse le credenziali fornite, all’interno del file .claude/settings.local.json.

Claude Code: perché è importante

Apiiro ha identificato 1.122 copie pubbliche del suddetto file contenenti almeno una credenziale. Un’azienda, avvisata dai ricercatori di Apiiro, ha confermato che la propria chiave API era ancora funzionante al momento della segnalazione.

La semplice rimozione del file dal progetto non è sufficiente a risolvere il problema, in quanto le versioni precedenti del file persistono nella cronologia di Git e nei fork dei repository. Per questo motivo, i ricercatori raccomandano vivamente di procedere alla sostituzione di tutte le password, i token e le chiavi che il file ha mai contenuto prima di effettuare qualsiasi operazione di pulizia.

Normalmente, Claude Code richiede una conferma esplicita da parte dell’utente prima di eseguire la maggior parte dei comandi shell. Tuttavia, selezionando l’opzione “Yes, and don’t ask again”, viene salvata una regola di autorizzazione nel file .claude/settings.local.json, consentendo l’esecuzione automatica dei comandi corrispondenti nelle sessioni successive.

La suddetta regola copre sia il comando specifico digitato dall’utente, sia uno schema più generico, come ad esempio “npm test *”. Nel secondo caso, qualsiasi password o token inserito all’interno del comando viene salvato in chiaro insieme al resto della stringa.

Nei file pubblici analizzati, i ricercatori hanno riscontrato comandi salvati con le credenziali ancora presenti. Hanno inoltre riprodotto il comportamento problematico utilizzando i modelli più recenti di Claude Code, ovvero Opus 5.5 e Fable 5.1.

Dei 16 agenti di coding presi in esame per questo studio, Claude Code è l’unico per il quale è stata confermata la memorizzazione predefinita del comando approvato nella sua interezza all’interno di un file di progetto.

Claude Code tenta di impedire che il file .claude/settings.local.json venga incluso nei commit Git aggiungendolo automaticamente all’elenco globale di esclusione dell’utente, come indicato nella documentazione ufficiale. Tuttavia, questa protezione è limitata alle impostazioni di un singolo computer e non si applica ai file già inclusi in un commit.

Secondo Apiiro, Claude Code non aggiunge mai il file al .gitignore del progetto, impedendo quindi alla protezione di essere trasferita con esso. La documentazione specifica che l’utente deve aggiungere manualmente il file al .gitignore per garantire la sua esclusione dal controllo di versione.

L’analisi dei dati ha rivelato che, su un totale di 1.105 repository esaminati, in 539 casi un commit con Claude come coautore ha modificato il file .claude/settings.local.json. Da questo dato, i ricercatori deducono che spesso è lo stesso Claude a includere involontariamente il file nei commit.

Su un totale di 104.185 copie del file sparse in 103.617 repository, le 1.122 contenenti almeno una credenziale rappresentano circa l’1,1% del campione complessivo e ospitano 1.379 credenziali distinte.

Una stringa è stata considerata come credenziale se corrispondeva a un formato noto di chiave API o se una password o un token compariva in prossimità dell’indirizzo di un server pubblico. La validazione finale è stata effettuata con l’approvazione di un revisore basato su intelligenza artificiale.

I ricercatori non hanno reso noto se qualcuno abbia effettivamente sfruttato queste credenziali compromesse. Tuttavia, hanno accertato che più di un terzo delle credenziali consente l’accesso diretto a un database, incluse 379 password di database.

Sono stati inoltre rilevati 43 accessi SSH a server pubblici, 42 token per GitHub, GitLab e npm e 23 chiavi AWS. I file appartengono a 63 organizzazioni, prevalentemente aziende software di diverse dimensioni.

Tra i casi più critici individuati, i ricercatori citano una chiave cloud con privilegi di amministratore appartenente a un fornitore di database e la password del proprietario di un database contenente cartelle cliniche sensibili.

Al momento della rilevazione, ogni file contenente una credenziale si trovava ancora nel branch predefinito del suo repository. In metà dei casi, il file era presente da almeno 217 giorni.

Le versioni precedenti dei file contengono altre 734 credenziali in 509 repository, assenti dalle copie attuali principalmente perché il file è stato cancellato. Inoltre, 211 fork di 74 repository riportano le stesse credenziali presenti negli originali.

Anche 298 delle 76.011 copie del file .claude/settings.json, incluse intenzionalmente nei commit dai team di sviluppo, contengono credenziali, generalmente all’interno delle regole “allow”.

Sommando queste credenziali a quelle presenti nelle versioni precedenti dei file e nei log di chat degli agenti salvati, il totale sale a 2.539 credenziali in 1.994 repository.

Cosa cambia e quali sono gli effetti

Gli scanner Gitleaks e TruffleHog hanno segnalato rispettivamente 564 e 643 delle 1.122 copie contenenti una credenziale; 215 sono sfuggite a entrambi gli strumenti di analisi, principalmente password digitate all’interno dei comandi.

Boris Cherny, responsabile di Claude Code in Anthropic, ha risposto alle segnalazioni su Hacker News affermando che, storicamente, Claude Code non ha implementato meccanismi per la rimozione automatica dei segreti. Tuttavia, ha assicurato che stanno valutando possibili soluzioni per prevenire il ripetersi del problema.

Cherny ha inoltre precisato che il file .claude/settings.local.json è pensato per rimanere locale e dovrebbe essere aggiunto al .gitignore quando creato manualmente. Ha suggerito di utilizzare la modalità “auto”, più sicura, attiva di default e inclusa in tutti i piani, e di abilitare il secret scanning offerto da GitHub e altri provider.

Secondo un aggiornamento fornito da Apiiro, Cherny ha indicato che Anthropic sta valutando approcci per intercettare il problema con la modalità “auto”, integrando un controllo di base sui segreti.

A un utente che ha fatto notare come lo stesso problema possa verificarsi in modalità “auto” quando viene richiesta conferma su un comando sensibile, Cherny ha risposto affermando che si tratta di una valida osservazione.

Una segnalazione degli utenti relativa al comportamento problematico, aperta l’11 agosto 2025 per comandi approvati con chiavi API e token salvati in chiaro, è stata chiusa da un bot come “not planned” il 3 gennaio successivo, dopo 60 giorni di inattività. Anche le altre segnalazioni correlate citate dai ricercatori non hanno ricevuto risposta da Anthropic ed sono state chiuse automaticamente.

Per gli sviluppatori, oltre a sostituire le credenziali compromesse, i ricercatori consigliano di cercare nella propria organizzazione GitHub i file .claude/settings.local.json e .claude/settings.json, controllando la cronologia di ogni repository anche nel caso in cui i file siano stati eliminati.

Il file locale deve quindi essere escluso dal tracciamento con il comando “git rm –cached .claude/settings.local.json” e aggiunto al .gitignore del repository. È inoltre consigliabile aprire il file sul proprio computer ed eliminare ogni regola che contenga una credenziale, anche se il file non è mai stato incluso in un commit.

Le credenziali dovrebbero essere tenute fuori dai comandi, richiamandole come variabili da un gestore di segreti (ad esempio $DB_URL). È inoltre consigliabile approvare schemi come Bash(npm run:*) anziché comandi singoli.

Per i team di sicurezza, le cartelle degli agenti come .claude/, .cursor/, .gemini/ e .specstory/, insieme ai file di memoria degli agenti, devono essere trattate come i file .env, sia sui laptop che nei repository.

È necessario aggiungerle alla scansione in pre-commit e CI, inclusa la cronologia, utilizzando uno scanner in grado di intercettare le password all’interno dei comandi e non solo i formati noti di chiave. Il file .claude/settings.local.json deve essere inserito nei template del .gitignore dell’organizzazione.

Anche le copie che non arrivano su GitHub sono importanti, poiché il file JSON in chiaro nella cartella del progetto può finire in un pacchetto npm, in un’immagine Docker, in un archivio zip o in una cartella sincronizzata. Le prime da controllare sono le credenziali associate a un server pubblico.

Fonte e approfondimento su Claude Code: articolo originale.

* Contenuto realizzato con l'ausilio di sistemi di intelligenza artificiale.