CVE Intelligence

Vulnerabilidades do Noir-lang Noir

🔔 Criar alerta RSS Verificador de versão

CVEs publicadas que afetam Noir-lang Noir: 1 registro(s), com versões afetadas e correções.

CVE-2026-41197 Crítica · 9.3 CWE-131 22/04/2026
Noir Brillig: subalocação de arrays aninhados em chamadas externas corrompe o heap
O Noir é uma Linguagem Específica de Domínio (DSL) para sistemas de prova SNARK, projetada para usar qualquer sistema de prova compatível com ACIR, e o Brillig é o bytecode que o ACIR usa para não determinismo. Programas Noir podem invocar funções externas por meio de chamadas externas (foreign calls). Ao compilar para bytecode Brillig, as instruções SSA são processadas bloco a bloco em BrilligBlock::compile_block(). Quando o compilador encontra uma Instruction::Call com alvo Value::ForeignFunction, ele invoca codegen_call() em brillig_call/code_gen_call.rs, que despacha para convert_ssa_foreign_call(). Antes de emitir a operação de chamada externa, o compilador deve pré-alocar memória para quaisquer resultados em array que a chamada vai retornar. Isso acontece por meio de allocate_external_call_results(), que itera sobre os tipos de resultado. Para resultados do tipo Type::Array, delega a allocate_foreign_call_result_array() para alocar recursivamente memória no heap para arrays aninhados. A struct BrilligArray é a representação interna de um array Noir no Brillig IR. Seu campo size representa o tamanho semi-achatado, o total de slots de memória que o array ocupa, levando em conta que tipos compostos como tuplas consomem vários slots por elemento. Esse tamanho é calculado por compute_array_length() em brillig_block_variables.rs. Para o array externo, allocate_external_call_results() usa corretamente define_variable(), que internamente chama allocate_value_with_type(). Essa função aplica a fórmula acima, produzindo o tamanho semi-achatado correto. Entretanto, para arrays aninhados, allocate_foreign_call_result_array() contém um bug. O padrão Type::Array(_, nested_size) descarta os tipos internos com _ e usa apenas nested_size, o comprimento semântico do array aninhado (o número de elementos lógicos), e não o tamanho semi-achatado. Para tipos de elemento simples isso funciona corretamente, mas para tipos de elemento compostos há subalocação. Chamadas externas que retornam arrays aninhados de tuplas ou outros tipos compostos corrompem o heap da VM Brillig. A versão 1.0.0-beta.19 corrige esse problema.