CVE-2026-41197 in noir
Sumário
de VulDB • 26/05/2026
Noir é uma Linguagem Específica de Domínio (DSL) para sistemas de prova SNARK, projetada para utilizar qualquer sistema de prova compatível com ACIR, e Brillig é o bytecode que o ACIR utiliza para lidar com não determinismo. Programas Noir podem invocar funções externas por meio de chamadas estrangeiras (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 um alvo `Value::ForeignFunction`, ele invoca `codegen_call()` em `brillig_call/code_gen_call.rs`, que encaminha a execução para `convert_ssa_foreign_call()`. Antes de emitir o opcode da chamada estrangeira, o compilador deve pré-alocar memória para quaisquer resultados em array que a chamada retornará. Isso ocorre por meio de `allocate_external_call_results()`, que itera sobre os tipos de resultado. Para resultados do tipo `Type::Array`, ele delega para `allocate_foreign_call_result_array()` para alocar recursivamente memória no heap para arrays aninhados. A estrutura `BrilligArray` é a representação interna de um array Noir no IR do Brillig. Seu campo `size` representa o tamanho semi-aplainado (semi-flattened), ou seja, o número total de slots de memória que o array ocupa, considerando que tipos compostos, como tuplas, consomem múltiplos slots por elemento. Esse tamanho é calculado por `compute_array_length()` em `brillig_block_variables.rs`. Para o array externo, `allocate_external_call_results()` utiliza corretamente `define_variable()`, que internamente chama `allocate_value_with_type()`. Esta função aplica a fórmula acima, produzindo o tamanho semi-aplainado correto. No entanto, 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 utiliza apenas `nested_size`, o comprimento semântico do array aninhado (o número de elementos lógicos), e não o tamanho semi-aplainado. Para tipos de elemento simples, isso funciona corretamente, mas para tipos de elemento compostos, ocorre uma subalocação. Chamadas estrangeiras 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 este problema.
If you want to get best quality of vulnerability data, you may have to visit VulDB.