A saída do seu modelo é entrada não fiável. Descubra onde o seu código se esquece disso.
Análise estática do código à volta do seu LLM — o código que constrói o prompt, chama o modelo e faz alguma coisa com a resposta. Não o modelo. Não a resistência do prompt a um jailbreak. O código.
O plano gratuito cobre 3 projetos e 30 análises por mês, sem limite de utilizadores e sem cartão de crédito. Esta análise está incluída.
O problema
Um modelo não é uma biblioteca. É um interpretador não fiável: entrega-lhe uma cadeia de texto e ele devolve outra. Tudo o que influenciou essa cadeia — o prompt do próprio utilizador, uma página que lhe foi mostrada, um documento que lhe foi dado, o resultado de outra ferramenta — influenciou a resposta.
A resposta é inofensiva até o código lhe dar uma capacidade. O perigo não é um modelo ter dito alguma coisa; é um programa ter acreditado. Cada ponto em que um programa trata texto gerado como código, como um comando, como uma consulta, como um caminho ou como um URL é uma injeção com mais um salto — e, ao contrário da questão de saber se um prompt pode ser contornado por jailbreak, esse salto é visível no código-fonte.
O que o Cybseco procura
Onde a saída do modelo chega a algo que age. Estas são as categorias, severidades e identificadores CWE do próprio motor.
eval, exec, compile, new Function, pickle.loads, yaml.load — a resposta torna-se um programa.os.system, subprocess, child_process.exec, execSync — a resposta torna-se um comando.execute, raw, createQuery — o text-to-SQL é exatamente este padrão, e DROP TABLE é uma continuação plausível.open, readFile, shutil.rmtree, unlink — ../../etc/passwd também é uma continuação plausível.requests, httpx, fetch, axios, urlopen — falsificação de pedidos do lado do servidor, escolhida pelo modelo.Um exemplo concreto
Nove linhas, e toda a forma do risco.
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(…) — uma chamada que devolve saída do modelo. O analisador associa a variável a que foi atribuída, e é isso que lhe permite seguir o valor ao longo da função sem análise interprocedimental.answer contém texto influenciado por um atacante. Entre a chamada e o destino nada o inspeciona, nada o restringe e nada o reduz a um conjunto fixo de operações.exec(…) — o texto torna-se um programa no próprio processo da aplicação, com as suas credenciais, a sua rede e o seu sistema de ficheiros.task — diretamente, ou através de um documento mostrado ao modelo — escolhe o que é executado. Isto é execução remota de código com mais um salto.Executado no motor atual, esse excerto produz um resultado: llm-output-to-code-execution, CWE-94, severidade crítica, confiança alta, na linha exec. A confiança é alta porque a variável está ligada a uma verdadeira chamada de completamento. Um nome que apenas se parece com uma resposta do modelo — llm_response, reply — é reportado com confiança média, porque isso é uma suposição e afirmar o contrário seria mentir sobre a evidência.
O que isto não é
Outros riscos específicos de LLM no código
Cada um foi acionado numa amostra contra o motor atual antes de ser escrito aqui.
api_key, uma palavra-passe, um IBAN ou um registo clínico colocados no texto que envia. Reportado onde está realmente a ser construído um contexto de prompt, não em qualquer f-string que por acaso contenha uma chave.PythonREPLTool, ShellTool, um interpretador de código, um terminal. Conceder uma delas transforma qualquer questão de prompt injection numa questão de execução remota de código.allow_dangerous_deserialization=True, trust_remote_code=True, dangerouslyAllow… — um framework desativou-a porque não era segura.BLOCK_NONE, safety_settings=None, moderation=false.hub.pull(…), um modelo de prompt carregado por HTTP. Quem controla esse endpoint controla as instruções.sk-…, sk-ant-…, AIza…, hf_… submetidos ao repositório.text-davinci-*, gpt-4-0314, claude-instant — hierarquia de instruções mais fraca, sem separação do prompt de sistema.Porque deve acreditar em alguma coisa disto
Independente do fornecedor por construção. O analisador reconhece a forma — algo produz texto, algo consome-o — em vez da escrita de um SDK em particular. Nomeia o framework que viu quando consegue (OpenAI, Anthropic, Google, Azure OpenAI, Mistral, Bedrock, Ollama, LiteLLM, LangChain, LangGraph, LlamaIndex, Semantic Kernel, AutoGen, CrewAI, Hugging Face) para que um resultado possa dizer de onde veio. Isso é uma etiqueta no resultado, não uma integração por SDK, e um framework ausente dessa lista é analisado exatamente da mesma maneira.
Veja o Cybseco a raciocinar sobre um sistema real
Veja a demo interativa e depois solicite uma avaliação guiada para a sua equipa.