L'output del tuo modello è input non attendibile. Trova dove il tuo codice se ne dimentica.
Analisi statica del codice attorno al tuo LLM — il codice che costruisce il prompt, chiama il modello e fa qualcosa della risposta. Non il modello. Non la resistenza del prompt a un jailbreak. Il codice.
Il piano gratuito copre 3 progetti e 30 analisi al mese, senza limiti al numero di utenti e senza carta di credito. Questa analisi vi rientra.
Il problema
Un modello non è una libreria. È un interprete non attendibile: gli passi una stringa e te ne restituisce una. Tutto ciò che ha influenzato quella stringa — il prompt dell'utente, una pagina che gli è stata mostrata, un documento che gli è stato dato, il risultato di un altro strumento — ha influenzato la risposta.
La risposta è innocua finché il codice non le dà una capacità. Il pericolo non è che un modello abbia detto qualcosa; è che un programma ci abbia creduto. Ogni punto in cui un programma tratta il testo generato come codice, come un comando, come una query, come un percorso o come una URL è una injection con un salto in più — e, a differenza della domanda se un prompt possa essere aggirato con un jailbreak, quel salto è visibile nel sorgente.
Che cosa cerca Cybseco
Dove l'output del modello raggiunge qualcosa che agisce. Queste sono le categorie, le severità e gli identificatori CWE propri del motore.
eval, exec, compile, new Function, pickle.loads, yaml.load — la risposta diventa un programma.os.system, subprocess, child_process.exec, execSync — la risposta diventa un comando.execute, raw, createQuery — il text-to-SQL è esattamente questo schema, e DROP TABLE è un completamento plausibile.open, readFile, shutil.rmtree, unlink — anche ../../etc/passwd è un completamento plausibile.requests, httpx, fetch, axios, urlopen — server-side request forgery, scelta dal modello.Un esempio concreto
Nove righe, e tutta la forma del rischio.
from openai import OpenAI
client = OpenAI()
def run_plan(task: str):
answer = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": task}],
)
exec(answer.choices[0].message.content)client.chat.completions.create(…) — una chiamata che restituisce output del modello. L'analizzatore lega la variabile a cui è stato assegnato, ed è questo che gli permette di seguire il valore attraverso la funzione senza analisi interprocedurale.answer contiene testo influenzato da un attaccante. Tra la chiamata e il punto di arrivo nulla lo ispeziona, lo vincola o lo riconduce a un insieme fisso di operazioni.exec(…) — il testo diventa un programma nel processo stesso dell'applicazione, con le sue credenziali, la sua rete e il suo filesystem.task — direttamente o tramite un documento mostrato al modello — sceglie che cosa viene eseguito. Questa è esecuzione di codice da remoto con un salto in più.Eseguito sul motore attuale, quel frammento produce un risultato: llm-output-to-code-execution, CWE-94, severità critica, confidenza alta, sulla riga exec. La confidenza è alta perché la variabile è legata a una vera chiamata di completamento. Un nome che somiglia soltanto a una risposta del modello — llm_response, reply — viene invece segnalato con confidenza media, perché quella è una supposizione e sostenere il contrario sarebbe mentire sulle prove.
Che cosa non è
Altri rischi specifici degli LLM nel codice
Ciascuno è stato attivato su un campione contro il motore attuale prima di essere scritto qui.
api_key, una password, un IBAN o una cartella clinica inseriti nel testo che invii. Segnalato dove viene costruito un vero contesto di prompt, non su ogni f-string che per caso contenga una chiave.PythonREPLTool, ShellTool, un interprete di codice, un terminale. Concederne uno trasforma ogni domanda sulla prompt injection in una domanda sull'esecuzione di codice da remoto.allow_dangerous_deserialization=True, trust_remote_code=True, dangerouslyAllow… — un framework l'aveva disattivata perché non era sicura.BLOCK_NONE, safety_settings=None, moderation=false.hub.pull(…), un template di prompt caricato via HTTP. Chi controlla quell'endpoint controlla le istruzioni.sk-…, sk-ant-…, AIza…, hf_… committati nel repository.text-davinci-*, gpt-4-0314, claude-instant — gerarchia delle istruzioni più debole, nessuna separazione del prompt di sistema.Perché crederci
Indipendente dal provider per costruzione. L'analizzatore riconosce la forma — qualcosa produce testo, qualcosa lo consuma — anziché la scrittura di un singolo SDK. Nomina il framework che ha visto quando può (OpenAI, Anthropic, Google, Azure OpenAI, Mistral, Bedrock, Ollama, LiteLLM, LangChain, LangGraph, LlamaIndex, Semantic Kernel, AutoGen, CrewAI, Hugging Face) perché un risultato possa dire da dove viene. Quella è un'etichetta sul risultato, non un'integrazione per SDK, e un framework assente da quell'elenco viene analizzato esattamente allo stesso modo.
Guarda Cybseco ragionare su un sistema reale
Guarda la demo interattiva, poi richiedi una prova guidata per il tuo team.