{"id":11,"date":"2026-08-04T12:10:40","date_gmt":"2026-08-04T10:10:40","guid":{"rendered":"https:\/\/orvibe.it\/blog\/?p=11"},"modified":"2026-08-04T12:10:40","modified_gmt":"2026-08-04T10:10:40","slug":"chiave-openrouter-rubata-cosa-fare","status":"publish","type":"post","link":"https:\/\/orvibe.it\/blog\/chiave-openrouter-rubata-cosa-fare\/","title":{"rendered":"Chiave OpenRouter rubata: cosa fare"},"content":{"rendered":"<p class=\"mk-article-paragraph\">Una discussione su r\/LocalLLaMA parte da un caso semplice e, purtroppo, comune: un utente nota che i crediti OpenRouter (circa 70 dollari) sono stati consumati in poche ore da richieste verso modelli molto costosi che dichiara di non aver mai usato. Nei log compaiono chiamate a varianti \u201cfast\u201d di un modello con tariffa elevata (nell\u2019ordine di decine di dollari per milione di token), oltre ad altri modelli premium. L\u2019utente aveva due chiavi API associate all\u2019account (una per s\u00e9 e una per il fratello), ma l\u2019attivit\u00e0 sospetta risulta attribuita alla chiave che usa pi\u00f9 spesso sul proprio computer.<\/p>\n<p class=\"mk-article-paragraph\">Da Reddit non possiamo dedurre se si tratti di un problema della piattaforma, di una compromissione del dispositivo, di una fuga involontaria della chiave o di un errore di configurazione (ad esempio una chiave finita in un log, in una variabile d\u2019ambiente esportata, in un repository, o in un tool di terze parti). Per\u00f2 il caso \u00e8 utile perch\u00e9 mette a fuoco una tesi editoriale netta: una chiave API non \u00e8 \u201csolo una stringa\u201d, \u00e8 un mezzo di pagamento. Va gestita con la stessa disciplina con cui si gestirebbe una carta aziendale.<\/p>\n<h2 class=\"mk-article-heading is-h2\">Cosa sappiamo (e cosa no) dal thread<\/h2>\n<p class=\"mk-article-paragraph\">Fatti riportati dall\u2019autore del post (da considerare come dichiarazioni, non come evidenze verificate): aveva credito residuo la sera prima; il giorno dopo riceve un alert di \u201ccrediti insufficienti\u201d; nei log vede molte richieste verso modelli premium mai usati; l\u2019attivit\u00e0 \u00e8 associata alla sua chiave principale; ha aperto un ticket al supporto e chiede un workaround perch\u00e9 dipende dal servizio per lavoro.<\/p>\n<p class=\"mk-article-paragraph\">Opinioni e ipotesi emerse nella discussione (in sintesi): la comunit\u00e0 suggerisce di revocare subito le chiavi e rigenerarle; di verificare possibili esposizioni accidentali (codice pubblico, screenshot, paste, log); di controllare la presenza di malware o estensioni\/app compromesse; e di non concludere automaticamente che la responsabilit\u00e0 sia della piattaforma. Senza log e un\u2019indagine non \u00e8 possibile stabilire se la fuga sia avvenuta lato utente, in un ambiente compromesso o altrove.<\/p>\n<aside class=\"article-callout mk-article-callout is-accent\">\n          <strong>Principio operativo<\/strong><\/p>\n<p>Tratta ogni evento di spesa anomala come un incidente di sicurezza: contenimento immediato, raccolta evidenze, rotazione credenziali, e solo dopo analisi delle cause. Rimandare la rotazione \u201cper capire prima\u201d di solito peggiora il danno.<\/p>\n<\/aside>\n<h2 class=\"mk-article-heading is-h2\">Risposta rapida: le prime 30\u201360 minuti<\/h2>\n<section class=\"article-card mk-article-workflow\">\n<h2>Runbook di contenimento (pratico, non perfetto)<\/h2>\n<ol class=\"workflow-list\">\n<li>\n                <span>01<\/span><br \/>\n                <strong>Revoca immediata delle chiavi API<\/strong><\/p>\n<p>Disabilita\/elimina tutte le chiavi attive associate all\u2019account, non solo quella \u201csospetta\u201d. Se il servizio lo consente, crea nuove chiavi con scope e limiti pi\u00f9 restrittivi.<\/p>\n<\/li>\n<li>\n                <span>02<\/span><br \/>\n                <strong>Blocca la spesa: limiti e budget<\/strong><\/p>\n<p>Imposta limiti di spesa giornalieri\/mensili, alert a soglie basse e, se possibile, allowlist di modelli o tetti per modello. Se non esistono controlli nativi, valuta un proxy\/gateway interno che li applichi.<\/p>\n<\/li>\n<li>\n                <span>03<\/span><br \/>\n                <strong>Congela l\u2019ambiente<\/strong><\/p>\n<p>Non \u201cripulire\u201d subito il PC: prima salva log locali, cronologia comandi, file di configurazione, output CI\/CD. Ogni modifica pu\u00f2 cancellare tracce utili.<\/p>\n<\/li>\n<li>\n                <span>04<\/span><br \/>\n                <strong>Cambia password e abilita MFA<\/strong><\/p>\n<p>Se l\u2019account supporta MFA, attivalo. Cambia password e termina sessioni attive. Questo non sostituisce la rotazione delle chiavi, ma riduce vettori di accesso all\u2019account.<\/p>\n<\/li>\n<li>\n                <span>05<\/span><br \/>\n                <strong>Apri ticket con dati minimi ma utili<\/strong><\/p>\n<p>Fornisci intervallo temporale, modelli chiamati, volume stimato, e chiedi se possono: bloccare temporaneamente l\u2019account, fornire IP\/User-Agent dei chiamanti, e valutare rimborso\/credito in caso di frode.<\/p>\n<\/li>\n<\/ol>\n<\/section>\n<h2 class=\"mk-article-heading is-h2\">Indagine: come pu\u00f2 \u201cuscire\u201d una chiave che sembra al sicuro<\/h2>\n<p class=\"mk-article-paragraph\">Nel thread emerge una convinzione frequente: \u201cla chiave \u00e8 salvata localmente, quindi non pu\u00f2 essere stata rilasciata\u201d. \u00c8 un\u2019ipotesi comprensibile, ma fragile. \u201cLocale\u201d non significa \u201cinaccessibile\u201d: basta un malware, un\u2019estensione del browser, un tool di sviluppo che invia diagnostica, un backup cloud non intenzionale, o un repository Git con commit accidentale (anche se poi cancellato) per trasformare una chiave in un segreto pubblico.<\/p>\n<section class=\"article-card article-comparison mk-article-comparison-block\">\n<h2>Vettori comuni (probabili) vs vettori meno comuni (ma possibili)<\/h2>\n<div class=\"comparison-grid mk-article-comparison-grid\">\n<div class=\"comparison-column mk-article-comparison-col is-accent\">\n<h3>Pi\u00f9 comuni<\/h3>\n<ul>\n<li>Chiave committata in un repo (pubblico o condiviso) o finita in un gist\/snippet<\/li>\n<li>File .env copiato in chat, ticket, screenshot o registrazioni schermo<\/li>\n<li>Log applicativi che stampano header\/variabili d\u2019ambiente<\/li>\n<li>Tool di terze parti (UI, plugin, wrapper) che memorizza la chiave in chiaro<\/li>\n<li>Malware\/infostealer che esfiltra credenziali e file di configurazione<\/li>\n<\/ul><\/div>\n<div class=\"comparison-column mk-article-comparison-col \">\n<h3>Meno comuni ma da considerare<\/h3>\n<ul>\n<li>Compromissione di un account collegato (email, password manager, storage sync)<\/li>\n<li>Furto di sessione (cookie\/session token) e accesso al pannello per leggere\/creare chiavi<\/li>\n<li>Supply-chain su pacchetti npm\/pip che leggono variabili d\u2019ambiente<\/li>\n<li>Esposizione tramite proxy\/telemetria aziendale mal configurata<\/li>\n<\/ul><\/div>\n<\/p><\/div>\n<\/section>\n<h2 class=\"mk-article-heading is-h2\">Obiezioni serie: \u201cNon \u00e8 colpa mia\u201d vs \u201c\u00c8 sicuramente malware\u201d<\/h2>\n<p class=\"mk-article-paragraph\">Nel dibattito c\u2019\u00e8 un disaccordo implicito sulla responsabilit\u00e0: alcuni tendono a concludere che se compaiono chiamate a modelli premium allora \u201cla piattaforma \u00e8 stata bucata\u201d; altri ribattono che \u201cquasi sempre \u00e8 malware o fuga lato utente\u201d. Entrambe le posizioni, prese come certezze, sono scorrette.<\/p>\n<p class=\"mk-article-paragraph\">Obiezione 1 (legittima): anche se la chiave \u00e8 stata esfiltrata dal client, l\u2019utente pu\u00f2 comunque aspettarsi strumenti di mitigazione dal provider (rate limit, limiti di budget, alert granulari, possibilit\u00e0 di restringere i modelli, log dettagliati). Se questi controlli mancano o sono difficili da usare, il rischio operativo aumenta.<\/p>\n<p class=\"mk-article-paragraph\">Obiezione 2 (altrettanto legittima): attribuire la colpa al provider senza evidenze (IP insoliti, pattern di accesso al pannello, incident report ufficiali) pu\u00f2 portare a ignorare la causa reale, lasciando l\u2019ambiente compromesso. Anche se ti rimborsano, la chiave successiva potrebbe essere rubata di nuovo.<\/p>\n<aside class=\"article-callout mk-article-callout is-muted\">\n          <strong>Cosa chiedere al provider (senza accusare)<\/strong><\/p>\n<p>Chiedi dati: IP sorgenti, user-agent, timestamp precisi, eventuali errori di autenticazione, e se esistono funzionalit\u00e0 di allowlist modelli o limiti per chiave. \u00c8 pi\u00f9 utile di una discussione su \u201cdi chi \u00e8 la colpa\u201d.<\/p>\n<\/aside>\n<h2 class=\"mk-article-heading is-h2\">Prevenzione: progettare l\u2019uso delle API come se fosse produzione<\/h2>\n<section class=\"article-card mk-article-checklist\">\n<h2>Misure che riducono davvero l\u2019impatto (anche se la chiave scappa)<\/h2>\n<ul>\n<li><span class=\"mk-article-check-mark\">\u2713<\/span><span>Una chiave per progetto\/ambiente (dev\/test\/prod), non una chiave \u201cuniversale\u201d<\/span><\/li>\n<li><span class=\"mk-article-check-mark\">\u2713<\/span><span>Permessi e scope minimi: se possibile, limita modelli\/endpoint utilizzabili<\/span><\/li>\n<li><span class=\"mk-article-check-mark\">\u2713<\/span><span>Budget e rate limit per chiave; alert a soglie basse (es. 5\u201310% del budget)<\/span><\/li>\n<li><span class=\"mk-article-check-mark\">\u2713<\/span><span>Proxy interno: il client non vede la chiave del provider; usa token effimeri<\/span><\/li>\n<li><span class=\"mk-article-check-mark\">\u2713<\/span><span>Rotazione programmata delle chiavi (mensile o trimestrale) e revoca di quelle inutilizzate<\/span><\/li>\n<li><span class=\"mk-article-check-mark\">\u2713<\/span><span>Secret scanning su repo e CI (blocca commit con pattern di chiavi)<\/span><\/li>\n<li><span class=\"mk-article-check-mark\">\u2713<\/span><span>Logging sicuro: mai stampare header o variabili d\u2019ambiente in chiaro<\/span><\/li>\n<li><span class=\"mk-article-check-mark\">\u2713<\/span><span>Separazione dei dispositivi: evita di usare la stessa chiave su pi\u00f9 PC se non necessario<\/span><\/li>\n<\/ul>\n<\/section>\n<section class=\"article-card article-table-card mk-article-table-block\">\n<h2>Segnali d\u2019allarme nei log di utilizzo<\/h2>\n<div class=\"table-scroll mk-article-table-scroll\">\n<table>\n<thead>\n<tr>\n<th scope=\"col\">Segnale<\/th>\n<th scope=\"col\">Perch\u00e9 conta<\/th>\n<th scope=\"col\">Azione immediata<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Modelli mai usati prima (soprattutto premium)<\/td>\n<td>Tipico di abuso: l\u2019attaccante massimizza il valore prima della revoca<\/td>\n<td>Revoca chiavi + limiti + ticket con intervallo temporale<\/td>\n<\/tr>\n<tr>\n<td>Picchi notturni o in fasce orarie insolite<\/td>\n<td>Indica automazione esterna o fuso diverso<\/td>\n<td>Verifica IP\/UA se disponibili; attiva alert orari<\/td>\n<\/tr>\n<tr>\n<td>Molte richieste piccole e continue<\/td>\n<td>Pu\u00f2 essere test di validit\u00e0 chiave o scraping<\/td>\n<td>Rate limit per chiave; blocco temporaneo<\/td>\n<\/tr>\n<tr>\n<td>Richieste da pi\u00f9 ambienti contemporanei<\/td>\n<td>Possibile condivisione involontaria o compromissione multipla<\/td>\n<td>Segmenta chiavi per macchina e progetto<\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/div>\n<\/section>\n<h2 class=\"mk-article-heading is-h2\">Conclusione: la lezione non \u00e8 \u201cnon usare OpenRouter\u201d, ma \u201ccostruire guardrail\u201d<\/h2>\n<p class=\"mk-article-paragraph\">La storia su Reddit non dimostra un breach specifico e non basta per attribuire responsabilit\u00e0. Dimostra per\u00f2 qualcosa di pi\u00f9 generale: nel mondo LLM, una chiave API equivale a un rubinetto di spesa potenzialmente molto rapido, perch\u00e9 i modelli premium possono consumare credito a una velocit\u00e0 che sorprende chi \u00e8 abituato a tariffe sotto 1$\/M token.<\/p>\n<p class=\"mk-article-paragraph\">La conclusione motivata \u00e8 pragmatica: la difesa migliore \u00e8 ridurre il \u201cblast radius\u201d. Anche se sei convinto di non aver mai esposto la chiave, progetta il sistema come se potesse accadere domani: chiavi separate, limiti, alert, proxy, rotazione, e un runbook pronto. \u00c8 meno spettacolare di cercare il colpevole, ma \u00e8 ci\u00f2 che evita che un incidente da 70$ diventi un problema ricorrente \u2014 o molto pi\u00f9 costoso.<\/p>\n<section class=\"article-card article-faq mk-article-faq\">\n<h2>Domande frequenti<\/h2>\n<div class=\"mk-article-faq-list\">\n<details open=\"\">\n<summary>Devo revocare solo la chiave che vedo nei log o tutte?<\/summary>\n<p>In un incidente di spesa anomala, la scelta pi\u00f9 sicura \u00e8 revocare tutte le chiavi attive e rigenerarle. Se l\u2019attaccante ha ottenuto accesso al pannello o a un file condiviso, potrebbe avere anche altre chiavi.<\/p>\n<\/details>\n<details>\n<summary>Se la chiave era \u201csolo in locale\u201d, com\u2019\u00e8 possibile che sia stata rubata?<\/summary>\n<p>\u201cLocale\u201d non significa protetto: infostealer, estensioni browser malevole, tool che salvano configurazioni in chiaro, backup\/sync non intenzionali e log verbosi sono vie comuni di esfiltrazione. Anche un commit Git poi cancellato pu\u00f2 essere recuperabile.<\/p>\n<\/details>\n<details>\n<summary>Cosa devo chiedere al supporto per capire l\u2019origine dell\u2019abuso?<\/summary>\n<p>Chiedi metadati delle chiamate (IP sorgente, user-agent, timestamp, eventuali region), se ci sono stati accessi al pannello o creazione di nuove chiavi, e se possono applicare un blocco temporaneo o limiti aggiuntivi mentre indagano.<\/p>\n<\/details>\n<details>\n<summary>Ha senso usare un proxy invece di mettere la chiave nel client?<\/summary>\n<p>S\u00ec, spesso \u00e8 la misura pi\u00f9 efficace: il client riceve token effimeri o passa da un gateway che applica allowlist di modelli, rate limit e budget. Cos\u00ec una fuga sul client non equivale automaticamente a una fuga della chiave del provider.<\/p>\n<\/details>\n<details>\n<summary>Come posso evitare che un attaccante usi modelli premium anche se ottiene la chiave?<\/summary>\n<p>Se il provider offre restrizioni per chiave (allowlist modelli o policy), usale. In alternativa, implementa un gateway che rifiuta richieste verso modelli non autorizzati e impone tetti di spesa\/volume.<\/p>\n<\/details><\/div>\n<\/section>\n<section class=\"orvibe-article-sources article-card mk-article-checklist\">\n<h2>Fonti e discussione originale<\/h2>\n<p>Questo articolo nasce dall\u2019analisi del post e dei commenti visibili nella discussione indicata. Le esperienze dei partecipanti sono presentate come testimonianze, non come fatti verificati automaticamente.<\/p>\n<ul>\n<li><a href=\"https:\/\/www.reddit.com\/r\/LocalLLaMA\/comments\/1vc7sux\/my_openrouter_api_key_was_leakedhacked\/\" rel=\"nofollow noopener noreferrer\">My OpenRouter API key was leaked\/hacked.<\/a><\/li>\n<li><a href=\"https:\/\/www.reddit.com\/r\/LocalLLaMA\/comments\/1vc7sux\/my_openrouter_api_key_was_leakedhacked\/p0zc7ip\/\" rel=\"nofollow noopener noreferrer\">Intervento di u\/Ok-Bill3318<\/a><\/li>\n<li><a href=\"https:\/\/www.reddit.com\/r\/LocalLLaMA\/comments\/1vc7sux\/my_openrouter_api_key_was_leakedhacked\/p0zbs3o\/\" rel=\"nofollow noopener noreferrer\">Intervento di u\/Fedor_Doc<\/a><\/li>\n<li><a href=\"https:\/\/www.reddit.com\/r\/LocalLLaMA\/comments\/1vc7sux\/my_openrouter_api_key_was_leakedhacked\/p0zj48q\/\" rel=\"nofollow noopener noreferrer\">Intervento di u\/Toastti<\/a><\/li>\n<li><a href=\"https:\/\/www.reddit.com\/r\/LocalLLaMA\/comments\/1vc7sux\/my_openrouter_api_key_was_leakedhacked\/p0ztgf9\/\" rel=\"nofollow noopener noreferrer\">Intervento di u\/Grouchy-Conflict-211<\/a><\/li>\n<\/ul>\n<\/section>\n","protected":false},"excerpt":{"rendered":"<p>Una chiave OpenRouter compromessa pu\u00f2 consumare credito in poche ore. Ecco come contenere l\u2019incidente, indagare le cause e ridurre i rischi futuri.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"class_list":["post-11","post","type-post","status-publish","format-standard","hentry","category-sicurezza-governance"],"_links":{"self":[{"href":"https:\/\/orvibe.it\/blog\/wp-json\/wp\/v2\/posts\/11","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/orvibe.it\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/orvibe.it\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/orvibe.it\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/orvibe.it\/blog\/wp-json\/wp\/v2\/comments?post=11"}],"version-history":[{"count":1,"href":"https:\/\/orvibe.it\/blog\/wp-json\/wp\/v2\/posts\/11\/revisions"}],"predecessor-version":[{"id":12,"href":"https:\/\/orvibe.it\/blog\/wp-json\/wp\/v2\/posts\/11\/revisions\/12"}],"wp:attachment":[{"href":"https:\/\/orvibe.it\/blog\/wp-json\/wp\/v2\/media?parent=11"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/orvibe.it\/blog\/wp-json\/wp\/v2\/categories?post=11"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/orvibe.it\/blog\/wp-json\/wp\/v2\/tags?post=11"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}