Um arquivo de modelo de 65 bytes pode interromper abruptamente o popular mecanismo de inferência Llama CPP. O payload minúsculo aciona uma divisão por zero dentro do parser, produzindo um crash SIGFPE.

Por que o crash é importante

O que deu errado

O parser lê os metadados do modelo em estruturas C++ e verifica se cada dimensão do tensor é “não negativa”. O zero satisfaz essa condição, portanto, a verificação passa. A linha de código seguinte utiliza então a dimensão como divisor em um cálculo que assume que o valor é positivo. Quando a dimensão é zero, a divisão lança uma exceção de ponto flutuante (SIGFPE) e encerra o programa.

A validação cobriu apenas metade da invariante necessária: ela bloqueou valores negativos, mas ignorou o zero, que é igualmente inseguro para a aritmética subsequente.

O que os desenvolvedores devem fazer

  • Trate arquivos de modelo como binários. Carregar um modelo faz o parsing de bytes brutos em estruturas de memória, um limite clássico onde dados não verificados podem derrubar o processo ou algo pior.
  • Evite verificações parciais. Uma condição que cobre apenas parte da invariante necessária gera uma falsa sensação de segurança. Aqui, “não negativo” foi insuficiente; o código precisava de “positivo”.
  • Questione suposições após cada verificação. Quando um teste de limites aparece, verifique se o código seguinte não depende de uma propriedade mais rigorosa.
  • Utilize ferramentas de fuzzing. O autor descobriu o bug ao executar o libFuzzer com AddressSanitizer, que muta entradas e sinaliza operações ilegais, como a divisão por zero.

Como a correção foi aplicada

A correção adiciona uma guarda que pula o cálculo de overflow quando uma dimensão é igual a zero. Esse pequeno condicional preserva o suporte para tensores legítimos de tamanho zero — usados em algumas variantes de modelos para recursos opcionais — ao mesmo tempo que elimina o caminho do crash.

Conclusão: Um único arquivo de 65 bytes pode desativar um mecanismo de inferência amplamente implantado; a validação minuciosa e o fuzzing sistemático mantêm os carregadores de modelos seguros.

Fonte: https://dev.to/harrisonsec/your-model-file-is-untrusted-input-1eap