
Esta ferramenta calcula o complexo histograma Huffman canônico para CVE-2023-4863.
Esta ferramenta calcula um histograma Huffman canônico complicado, capaz de acionar uma escrita fora dos limites (OOB) na biblioteca libwebp vulnerável (ou seja, libwebp <= 1.3.1). Esta vulnerabilidade é conhecida como CVE-2023-4863 ou CVE-2023-41064. Podemos transbordar a tabela Huffman pré-alocada em no máximo 132 entradas.
A lógica é que a libwebp assume que o histograma Huffman contido em cada imagem webp está bem formatado. Isto é, a árvore de decodificação deve ser uma árvore completa. Com essa suposição, o grupo libwebp aproveitou a ferramenta enough para estimar o tamanho máximo de memória necessário para construir a tabela Huffman de decodificação (uma estrutura poderosa para decodificar códigos Huffman canônicos rapidamente). No entanto, hackers conseguem construir uma árvore incompleta para ultrapassar esse limite de memória e, assim, transbordar a memória pré-alocada.
Esta ferramenta de hackeamento foi criada ajustando a ferramenta enough com suporte a árvores incompletas.
Compile o código usando o comando abaixo:
gcc -o NotEnough ./main.c
Para uma tabela Huffman com 40 símbolos, tabela raiz de 8 bits e profundidade máxima de 15, o número máximo de entradas da tabela é 410. No entanto, ao construir uma árvore incompleta, o número de entradas da tabela pode chegar a 542. Execute o comando abaixo:
./NotEnough 40 8 15
Um exemplo dessas árvores é mostrado abaixo:
Observe que podamos os ramos sem folhas por brevidade.
Em seguida, você pode usar a ferramenta craft para construir uma imagem webp eficaz e transbordar a ferramenta dwebp (versão <= 1.3.1). Altere o histograma do código Huffman code_lengths_counts[4] para {0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 5, 9, 17, 1, 1, 3} conforme necessário e reconstrua a ferramenta:
vim craft.c # Altere o histograma do código Huffman conforme necessário, ou seja, cerca da linha 495.
gcc -o craft craft.c
./craft -o bad_542.webp
Por favor, consulte o blog do @benhawkes para entender melhor o CVE-2023-4863.