2 pontos por GN⁺ 2025-05-25 | 1 comentários | Compartilhar no WhatsApp
  • Em uma auditoria do ksmbd, a implementação do servidor SMB3 no kernel Linux, foi encontrada a vulnerabilidade remota de use-after-free CVE-2025-37899 usando apenas a API o3 da OpenAI, sem framework de agentes, scaffolding ou outras ferramentas
  • A falha ocorre porque, durante o processamento do comando SMB logoff, o sess->user já liberado pode continuar sendo acessado por outra thread, algo que só fica visível ao considerar conexões simultâneas e o estado de compartilhamento de sessão
  • Em um benchmark baseado na CVE-2025-37778, encontrada manualmente, o o3 identificou a vulnerabilidade em 8 de 100 execuções; o Claude Sonnet 3.7 conseguiu 3 vezes, e o Claude Sonnet 3.5, nenhuma
  • Na condição ampliada de 12k LoC / 100k tokens de entrada, cobrindo todos os handlers de comandos SMB e o código de tratamento de conexão, a taxa de detecção da vulnerabilidade já conhecida caiu para 1 em 100, mas nesse mesmo conjunto apareceu a nova CVE-2025-37899
  • Ainda há muitos falsos positivos e saídas sem utilidade, mas a probabilidade de obter uma resposta correta aumentou a ponto de valer a pena revisão e validação humana em pesquisa real de vulnerabilidades

Experimento que encontrou uma vulnerabilidade no ksmbd com o o3

  • O alvo da auditoria foi o ksmbd, que implementa compartilhamento de arquivos via protocolo SMB3 no espaço de kernel do Linux
  • O modelo o3 da OpenAI foi usado via o3 API, sem scaffolding adicional, framework de agentes ou outras ferramentas
  • A vulnerabilidade encontrada foi a CVE-2025-37899, e a correção está no commit do kernel Linux
  • O problema central é um use-after-free no handler do comando SMB logoff, em que um objeto sem contagem de referência é liberado enquanto continua acessível por outra thread
  • Para encontrar essa vulnerabilidade, é preciso entender ao mesmo tempo as conexões simultâneas com o servidor e os objetos compartilhados em certas situações
  • A avaliação inclui a observação de que este parece ser o primeiro caso publicamente discutido em que um LLM encontrou uma vulnerabilidade com essas características

Vulnerabilidade de referência CVE-2025-37778

  • Primeiro, a CVE-2025-37778, encontrada manualmente, foi usada como benchmark para avaliar o desempenho do o3
  • Essa vulnerabilidade é um use-after-free que ocorre ao processar a requisição session setup de um cliente remoto no caminho de autenticação Kerberos
  • krb5_authenticate libera sess->user quando sess->state == SMB2_SESSION_VALID
  • Em seguida, o código depende da suposição de que ksmbd_krb5_authenticate vai reinicializar com um novo valor válido ou, após retornar -EINVAL, que sess->user não será mais usado
  • Na prática, é possível fazer com que ksmbd_krb5_authenticate não reinicialize sess->user, e sess->user ainda pode ser acessado mesmo quando krb5_authenticate retorna -EINVAL

Configuração do benchmark e prompt

  • A CVE-2025-37778 foi usada como benchmark porque fica na superfície de ataque remota e exige avaliar ao mesmo tempo a condição sess->state == SMB2_SESSION_VALID, o caminho sem reinicialização e o caminho de acesso após a liberação
  • O código mínimo necessário para explicar o caminho da vulnerabilidade foi calculado em cerca de 3.3k LoC
  • A entrada do experimento incluiu o handler do comando session setup e as funções chamadas por ele até profundidade de chamada 3
  • Também foram incluídos o recebimento de pacotes, o parsing da requisição, a seleção do handler do comando e o código de limpeza da conexão após a conclusão do handler, reduzindo suposições sobre como as estruturas de dados são inicializadas
  • A entrada final tinha cerca de 3.3k LoC / 27k tokens, e o arquivo analisado foi publicado como session_setup_code.prompt
  • O prompt incluía as seguintes condições
    • Instrução para procurar vulnerabilidades de use-after-free
    • Contexto de alto nível sobre o papel, a arquitetura e o modelo de ameaça do ksmbd
    • Forte orientação para preferir não reportar a reportar falso positivo
  • O arquivo completo do prompt está no repositório o3_finds_cve-2025-37899
  • A execução usou a ferramenta llm de Simon Willison

Resultados do benchmark da CVE-2025-37778

  • O harness do experimento executou a mesma consulta 100 vezes e salvou os resultados
  • O o3 encontrou a CVE-2025-37778 em 8 de 100 execuções
  • Em 66 de 100 casos, concluiu que não havia bug, gerando falso negativo
  • Os 28 restantes foram falsos positivos
  • O resultado comparativo foi o seguinte
    • Claude Sonnet 3.7: 3 descobertas em 100 execuções
    • Claude Sonnet 3.5: 0 descobertas em 100 execuções
  • Nesse benchmark, o o3 mostrou um resultado 2 a 3 vezes melhor que o Claude Sonnet 3.7
  • Relatórios de exemplo foram publicados como resultado do o3 e resultado do Sonnet 3.7
  • A saída do o3, pela estrutura e foco, se parece com um relatório de bug resumido escrito por humano, embora às vezes curta demais e menos clara
  • A saída do Sonnet 3.7 apareceu mais próxima de um fluxo de raciocínio ou log de trabalho

Experimento ampliado para todos os handlers de comando

  • No experimento seguinte, foi fornecido ao o3 não só o handler de session setup, mas o código de todos os handlers de comandos SMB
  • Os handlers estão em smb2pdu.c, e o arquivo tem cerca de 9k LoC
  • Somando todos os handlers, o código de configuração e limpeza de conexão e a rotina de dispatch dos handlers, o total ficou em cerca de 12k LoC / 100k tokens de entrada
  • Nessa condição, o experimento também foi executado 100 vezes
  • O o3 encontrou a vulnerabilidade já conhecida de autenticação Kerberos CVE-2025-37778 apenas 1 vez em 100, mostrando degradação clara de desempenho com o aumento do número de tokens de entrada
  • No mesmo conjunto de resultados, apareceu um relatório da nova vulnerabilidade até então desconhecida, a CVE-2025-37899

Caminho vulnerável da CVE-2025-37899

  • A nova vulnerabilidade também está relacionada à liberação de sess->user, mas desta vez ocorre no handler de session logoff
  • smb2_session_logoff funciona na seguinte ordem
    • Chama ksmbd_close_session_fds(work)
    • Chama ksmbd_conn_wait_idle(conn)
    • Define o estado da sessão como SMB2_SESSION_EXPIRED
    • Se sess->user existir, libera com ksmbd_free_user(sess->user) e define sess->user = NULL
  • O cenário de vulnerabilidade descrito no relatório do o3 é o seguinte
    • Em SMB 3.0 ou superior, o segundo transporte é vinculado a uma sessão existente e conn->binding == true
    • A Worker-A processa uma requisição comum, como WRITE, em outra conexão C2
    • smb2_check_user_session() salva em work->sess o ponteiro existente para struct ksmbd_session e incrementa a contagem de referência da sessão, mas não mantém uma referência separada para sess->user
    • A Worker-B processa um SMB2 LOGOFF da mesma sessão na primeira conexão C1 e executa smb2_session_logoff()
    • ksmbd_conn_wait_idle(conn) espera apenas as requisições em execução naquela conexão, não as requisições de outras conexões que usam a mesma sessão
    • A Worker-A continua executando e pode fazer acessos como user_guest(sess->user), ksmbd_compare_user(sess->user, …) e sess->user->uid
  • Dependendo do timing, isso pode virar um use-after-free apontando para um objeto slab já liberado ou, se a leitura acontecer após sess->user = NULL, um NULL dereference com potencial de DoS

Correção incorreta e o valor dos resultados do o3

  • A primeira correção proposta para a CVE-2025-37778 consistia em adicionar sess->user = NULL após ksmbd_free_user(sess->user)
  • Depois de ler o relatório da CVE-2025-37899, ficou claro que essa correção era insuficiente
  • O handler de logoff já faz sess->user = NULL, mas ainda assim permanece vulnerável, porque o protocolo SMB permite vincular duas conexões diferentes à mesma sessão
  • No caminho de autenticação Kerberos, outra thread também pode acessar sess->user na curta janela entre a liberação e a atribuição de NULL
  • Alguns relatórios do o3 cometeram o mesmo erro, mas outros conseguiram perceber que, por causa da possibilidade de session binding, apenas sess->user = NULL não basta
  • Uma limitação é que, pela alta proporção de true positives em relação a false positives, não é certo que todos os relatórios tenham sido revisados com o cuidado necessário

Posição prática na pesquisa de vulnerabilidades

  • Em criatividade, flexibilidade e generalidade, LLMs estão mais próximos de auditores humanos de código do que de técnicas tradicionais de análise de programas
  • Como comparação, são citados symbolic execution, abstract interpretation e fuzzing
  • Desde o GPT-4 já existia a possibilidade de usar LLMs em pesquisa de vulnerabilidades, mas os resultados em problemas reais ainda ficavam abaixo do esperado
  • O o3 funciona de forma suficientemente útil em raciocínio sobre código, perguntas e respostas, programação e resolução de problemas para elevar o desempenho de pesquisadores reais de vulnerabilidades
  • Ainda está longe de ser perfeito e pode gerar resultados sem sentido que frustram o usuário
  • O que mudou é a avaliação de que, pela primeira vez, a probabilidade de obter uma resposta correta ficou alta o bastante para justificar aplicar isso a problemas reais

1 comentários

 
GN⁺ 2025-05-25
Comentários do Hacker News
  • É um detalhe pequeno, mas a forma como o autor organiza o projeto parece útil. Ele cria arquivos .prompt separados para o prompt do sistema, informações de contexto e instruções auxiliares [1], e os executa com llm
    Isso mostra que um bom uso de LLMs, assim como outras ferramentas de engenharia, exige um pensamento de engenharia sistemático, centrado em especificações cuidadosas e que equilibra bem as restrições de projeto
    [1] https://github.com/SeanHeelan/o3_finds_cve-2025-37899

    • É curioso interpretar assim, porque o próprio autor admite que justamente essa parte foi feita no feeling

      In fact my entire system prompt is speculative so consider it equivalent to me saying a prayer, rather than anything resembling science or engineering

    • Não sei como seria possível fazer benchmark dessas metodologias tão diferentes
      Tudo parece encantamento baseado em intuição. Frases como “você é um especialista em encontrar vulnerabilidades”, “relate apenas vulnerabilidades reais, sem falsos positivos”, ou formas de organizar com tags HTML falsas porque o modelo parece gostar disso. Não vejo onde está a engenharia aqui
    • É interessante ver a tentativa de aplicar princípios de engenharia a um sistema essencialmente instável e imprevisível para obter uma sensação de controle
      Esses prompts deveriam ser chamados de dicas, não de instruções. Todos os LLMs atuais ignoram o prompt quando ele entra em conflito com seu único objetivo superior: produzir uma resposta, seja ela verdadeira ou não
    • O fato curioso é que, se você pergunta a um LLM sobre boas práticas de estruturação de prompts, ele dá dicas nessa direção
      Pedir a um LLM para ajudar a escrever prompts também é surpreendentemente eficaz. Todos os meus fragmentos de prompt também foram projetados com ajuda de LLMs
      Pessoalmente, deixo tudo em arquivos org-mode e copio e colo em conversas do ChatGPT quando preciso. Prefiro interações mais “em forma de debate”, mas a abordagem é a mesma
    • No fim, o ponto central é organização: https://taoofmac.com/space/blog/2025/05/13/2230
  • O texto diz que a relação sinal-ruído é de cerca de 1:50. O autor conhece muito bem essa base de código, então está numa boa posição para separar o sinal do ruído
    O avanço real virá de automatizar essa parte, então pretendo continuar acompanhando

    • Ao longo de alguns anos, criei alguns exercícios de entrevista para fazer em casa, pensados para serem curtos e fáceis para desenvolvedores experientes, mas difíceis para quem não conhece a linguagem. Todos eram versões mínimas de problemas que resolvi no trabalho real
      Sempre que surge um novo LLM de fronteira, excetuando modelos que usam a entrada como dados de treinamento, rodo esses exercícios de entrevista. Fiquei surpreso ao ver que a taxa de respostas que funcionam na primeira tentativa continua consistentemente em torno de 1:10, e muitas vezes é preciso cutucar por mais de 10 rodadas para o modelo encontrar o próprio erro
      Por isso, essa relação sinal-ruído em um tema mais obscuro me parece plausível
    • Estou criando um sistema que aumenta bastante a relação sinal-ruído na detecção de bugs e, ao mesmo tempo, venho fazendo benchmarks rigorosos dos agentes de software conhecidos em geral
      Os resultados variaram bastante, e vou divulgar tudo em uma apresentação de conferência em breve, então podem ficar animados. Isso deve mostrar bem o estado atual da área
      Edit: a formulação estava confusa
    • Pensei recentemente que talvez fosse possível fazer algo como fine-tuning com todas as alterações git do Linux kernel, listas de discussão etc.
      Um LLM desses talvez fosse uma versão sintética de alguém que trabalhou por anos na base de código e aprendeu todo tipo de particularidade
      Dá para colocar muita coisa em contexto longo, mas algumas bases de código já têm 200 mil tokens só de código, então não sei
    • Automatizar essa parte parece simples. Em geral, um LLM que tem capacidade semântica X para executar uma tarefa tem uma capacidade maior que X de identificar qual é a melhor entre N respostas para a mesma tarefa
      Isso vale especialmente em um esquema de torneio binário, como o RAInk que apareceu aqui algumas semanas atrás, e também há formas de usar consenso entre LLMs diferentes. Fiquei surpreso por não usarem o Gemini 2.5 PRO aqui; pela minha experiência, ele é o LLM mais forte para esse tipo de tarefa
    • 1:50 é uma excelente taxa de detecção para procurar agulha no palheiro
  • A parte mais interessante e importante deste texto foi que o autor rodou a busca por vulnerabilidades 100 vezes para cada modelo
    É muito mais computação do que eu pretendia usar na maioria dos problemas que tentei resolver com modelos de linguagem grandes, mas talvez seja o caso de simplesmente continuar rodando o modelo

    • Percebi que não escrevi isso no texto, mas, caso alguém tenha curiosidade, executar a versão de 100 mil tokens 100 vezes custou cerca de US$ 116
    • Zero-days podem ser vendidos por muito dinheiro, e também podem render em bug bounties. O custo dos LLMs é uma gota no balde em comparação
      Não sei como será o mundo da cibersegurança quando o custo de inferência chegar perto de zero, mas será um espaço muito diferente do atual
    • Basta ter bastante dinheiro~
    • “100 vezes por modelo” significa um volume considerável de consumo de energia. O feito de encontrar a vulnerabilidade mais comum em uma base de código em C também parece menos impressionante
      Acaba ficando mais próximo de celebrar luxo e desperdício. Mesmo diante da mudança climática global, continuamos queimando recursos em coisas triviais como se estivéssemos nos anos 1950
  • Ou ele teve muita sorte, ou, como eu suspeitava, o Gemini 2.5 PRO parece encontrar essa vulnerabilidade com mais facilidade. A taxa de sucesso foi alta, então bastou rodar algumas vezes o prompt a seguir: https://gist.github.com/antirez/8b76cd9abf29f1902d46b2aed3cd...

  • Recentemente, esse padrão vem se repetindo
    Quando há um problema com uma definição clara e uma função de avaliação, faz-se com que o LLM reduza o espaço de soluções. LLMs são muito fortes em reconstrução de padrões e podem funcionar bem se a resposta seguir um padrão parecido com algo já conhecido
    Neste caso, o problema é um tipo específico de vulnerabilidade de segurança, e o avaliador é um especialista. A escala é diferente, mas, em espírito, isso se parece com tentativas recentes de usar LLMs em otimização genética
    “Mathematical discoveries from program search with large language models” também é uma leitura interessante, e lembro que já apareceu no HN algum tempo atrás
    https://www.nature.com/articles/s41586-023-06924-6
    Ainda assim, pessoalmente acho um pouco forçado concluir, com base apenas nesse experimento, que LLMs raciocinam sobre código

  • Espero que isso seja real, e que não seja a mesma coisa que continua acontecendo com o curl
    [1] https://daniel.haxx.se/blog/2024/01/02/the-i-in-llm-stands-f...

  • Não tenho certeza sobre a alegação de que esta é a primeira vulnerabilidade descoberta por LLM. Por exemplo, o OSS-Fuzz [0] encontrou algumas por fuzzing, e o Big Sleep também encontrou usando uma abordagem com agentes [1]
    [0] https://security.googleblog.com/2024/11/leveling-up-fuzzing-...
    [1] https://googleprojectzero.blogspot.com/2024/10/from-naptime-...

    • Com certeza não é a primeira vulnerabilidade descoberta por LLM =) Talvez eu devesse ter escrito de forma mais clara
      O que eu disse no texto foi: “Para entender a vulnerabilidade, é preciso raciocinar sobre conexões simultâneas ao servidor e sobre como vários objetos são compartilhados em determinadas situações. O o3 entendeu isso e encontrou o ponto em que um objeto específico, que não tinha contagem de referências, era liberado enquanto ainda permanecia acessível por outra thread. Até onde sei, esta é a primeira discussão pública sobre um LLM encontrar uma vulnerabilidade dessa natureza”
      O que eu queria dizer é que, até onde sei, esta é a primeira documentação pública de um LLM encontrando esse tipo de bug: um bug originado de uma quantidade não trivial de código e de acesso simultâneo a recursos compartilhados. Pelo menos para mim, é um marco interessante no avanço dos LLMs
  • Considerando o valor de descobrir zero-days, se fosse possível encontrá-los de forma confiável com apenas algumas centenas de chamadas de API, praticamente todas as agências de inteligência do mundo despejariam dinheiro nisso
    Ainda mais se fosse possível ajustar finamente o modelo com muitos exemplos, e não acho que lugares como a OpenAI fariam esse tipo de coisa via API pública

    • Sim. Por causa da engenharia em torno do controle de saída, isto é, da censura, e dos termos de uso, surge um incentivo para induzir o modelo a encontrar possíveis bugs, mas não permitir o resultado
      Para agências governamentais ou outras organizações, obviamente essas restrições não são um problema. Elas se aplicam apenas a todos os demais. Por isso, as pessoas acabarão usando outros modelos e agentes sem essas limitações
      É seguro presumir que há muitas vulnerabilidades espalhadas por softwares importantes. Agora conseguimos encontrá-las. Vai começar uma situação em que a teoria dos jogos de corrida armamentista se aplica à segurança de computadores e ao hacking. Provavelmente isso chegará antes do que se espera
  • Sei que alguns desenvolvedores do kernel “validaram” esse bug, mas fico curioso se alguém de fato criou e testou uma prova de conceito
    É uma parte tão central do processo, mas a prova de conceito está completamente ausente. Sem uma prova de conceito, não dá para saber que problemas podem aparecer no meio do caminho e, portanto, não dá para julgar a explorabilidade ou o impacto. Pelo menos o autor não chamou isso de execução remota de código sem validação
    Mas e se houver uma peça do quebra-cabeça que o autor e os desenvolvedores deixaram passar, ou que presumiram que o o3 tivesse tratado, mas que na verdade estava fora do contexto do o3, e isso invalidar a vulnerabilidade em si?
    Não estou dizendo que exista algo assim, nem que eu vá gastar tempo fazendo o trabalho do autor por ele. Só que este relatório não está totalmente validado e, considerando que pode se tornar um post influente na área de pesquisa de vulnerabilidades com LLMs, isso me parece um precedente perigoso
    Pessoalmente, acho que deveríamos aplicar PoC || GTFO com mais rigor do que nunca a qualquer relatório de vulnerabilidade gerado por modelo
    A visão de que o o3 é muito melhor que modelos anteriores ou outros modelos atuais continua válida, e a metodologia também é interessante. Entendo o desejo e a necessidade de escrever dessa forma para fazer as pessoas prestarem atenção em algo específico. Esse é o problema do clickbait. Mas, por favor, precisamos fazer melhor. É preciso criar uma prova de conceito e verificar as afirmações, não ser preguiçoso. Se você está escrevendo um post que pode influenciar a forma como pesquisadores de vulnerabilidades conduzem suas pesquisas, deve incentivar validação, não suposições teóricas. Caso contrário, em vez de aprofundar o entendimento dos sistemas com relatórios verificáveis e comprovados, relatos falsos porém plausíveis acabarão espalhando ignorância

    • Sou o autor. Sim, criei uma prova de conceito. Sim, provoquei um relatório do KASAN e um crash
    • Gostaria de perguntar se o que você quer é uma prova de conceito que provoque um crash por use-after-free, ou se só ficaria satisfeito com uma prova de conceito completa de execução remota de código
  • Há um pequeno trecho maravilhoso que captura perfeitamente como costuma ser a maioria das minhas sessões de desenvolvimento de prompts

    Tentei orientá-lo com firmeza para que não reportasse falsos positivos e para que preferisse não reportar nenhum bug a reportar falsos positivos. Não tenho ideia se isso ajuda, mas gostaria que ajudasse, então aqui estamos. Na verdade, todo o meu prompt de sistema é especulativo, já que não executei um número suficiente de avaliações para determinar se ele ajuda ou atrapalha; portanto, considere isso equivalente a eu fazer uma oração, em vez de algo que se pareça com ciência ou engenharia. Assim que eu tiver executado essas avaliações, aviso vocês.