PT-2026-34235 · Noir · Noir

CVE-2026-41197

·

Publicado

2026-04-21

·

Atualizado

2026-04-23

CVSS v4.0

9.3

Crítica

VetorAV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
Name of the Vulnerable Software and Affected Versions Noir versões anteriores a 1.0.0-beta.19
Description Programas Noir podem invocar funções externas através de chamadas estrangeiras. Ao compilar para o bytecode Brillig, o compilador processa instruções SSA em BrilligBlock::compile block(). Se for encontrada uma Instruction::Call com um alvo Value::ForeignFunction, ela invoca codegen call() em 'brillig call/code gen call.rs', que então despacha para convert ssa foreign call(). Antes de emitir o opcode da chamada estrangeira, o compilador utiliza allocate external call results() para pré-alocar memória para resultados de arrays. Para resultados Type::Array, ele delega para allocate foreign call result array() para a alocação recursiva de arrays aninhados no heap.
A estrutura BrilligArray utiliza um campo size para representar o tamanho semi-achatado, que é o número total de slots de memória que um array ocupa, incluindo múltiplos slots para tipos compostos como tuplas. Embora os arrays externos sejam tratados corretamente via define variable() e allocate value with type(), a função allocate foreign call result array() contém um erro. Ela utiliza o comprimento semântico (o número de elementos lógicos) em vez do tamanho semi-achatado ao processar arrays aninhados. Isso leva a uma subalocação para tipos de elementos compostos, fazendo com que chamadas estrangeiras que retornam arrays aninhados de tuplas ou outros tipos compostos corrompam o heap da VM Brillig.
Recommendations Atualizar para a versão 1.0.0-beta.19. Multiplicar o comprimento semântico pelo número de tipos de elementos ao alocar arrays aninhados, extraindo os tipos internos do padrão e substituindo o argumento nested size em allocate brillig array() por types.len() * nested size para calcular o tamanho semi-achatado. Alternativamente, reutilizar a função auxiliar compute array length() para a alocação de arrays aninhados a fim de manter a consistência com a alocação de arrays externos.

Exploit

Correção

Encontrou algum problema na descrição? Tem algo a acrescentar? Fique à vontade para nos escrever 👾

Enumeração de Fraquezas

Identificadores relacionados

CVE-2026-41197
GHSA-JJ7C-X25R-R8R3

Produtos afetados

Noir