
Análise técnica do CVE-2025-66628, um estouro de inteiro no parser TIM do ImageMagick que leva a leituras fora dos limites, com causa raiz, etapas de exploração e orientações de remediação.
| Atributo | Detalhes |
|---|
| ID do CVE | CVE-2025-66628 |
| Fornecedor | ImageMagick Studio LLC |
| Produto | ImageMagick |
| Versões Afetadas | < 7.1.2-10 |
| Versão Corrigida | 7.1.2-10 |
| Tipo de Vulnerabilidade | CWE-190 (Estouro de Inteiro) |
| Pontuação CVSS v3.1 | 7.5 (Alta) |
| Vetor CVSS | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N |
| Pesquisador | Sumit Shah |
Existe uma vulnerabilidade de estouro de inteiro na função ReadTIMImage em coders/tim.c do ImageMagick. Ao processar arquivos de imagem TIM (PlayStation) em sistemas de 32 bits, a multiplicação sem verificação dos valores de largura e altura controlados pelo usuário resulta em subalocação de memória, levando a leituras fora dos limites durante o processamento de pixels.
A lógica vulnerável reside em coders/tim.c:
/* coders/tim.c - TIM Image Parser */
// User-controlled input from TIM file header
width = ReadBlobLSBShort(image); // 2 bytes (0-65535)
height = ReadBlobLSBShort(image); // 2 bytes (0-65535)
// VULNERABLE: Integer overflow on 32-bit systems
image_size = 2 * width * height; // No overflow check
// Memory allocated with truncated size
pixels = (unsigned char *) AcquireQuantumMemory(image_size, sizeof(*pixels));
// Loop processes FULL dimensions, reading beyond buffer
for (y = 0; y < height; y++) {
for (x = 0; x < width; x++) {
pixel_index = (y * width + x) * 2;
pixels[pixel_index] = ReadBlobByte(image);
pixels[pixel_index + 1] = ReadBlobByte(image);
}
}
Em arquiteturas de 32 bits, size_t é limitado a 32 bits com valor máximo UINT_MAX = 4,294,967,295.
Quando largura e altura são ambas definidas para os valores máximos de 16 bits sem sinal:
width = 65535 (0xFFFF)
height = 65535 (0xFFFF)
Cálculo esperado:
2 × 65535 × 65535 = 8,589,869,050 bytes (~8.5 GB)
Resultado real (truncamento de 32 bits):
8,589,869,050 % 4,294,967,296 = 4,294,901,754
Resultado após truncamento: Buffer pequeno alocado
O estouro faz com que o alocador de memória reserve um buffer drasticamente menor do que o necessário, enquanto o laço de processamento ainda itera sobre a grade completa de pixels de 65535 × 65535, resultando em leituras fora dos limites.
Passo 1: O atacante cria um arquivo TIM com dimensões que causam o estouro
[Magic: 0x10]
[Type: 0x02]
[Width: 0xFFFF] # 65535
[Height: 0xFFFF] # 65535
[Pixel Data...]
Passo 2: A vítima processa o arquivo malicioso
convert malicious.tim output.png
Passo 3: Ocorre a leitura fora dos limites, levando a:
Sistemas de 32 bits onde size_t é de 32 bits. Sistemas de 64 bits não são afetados devido à largura inteira suficiente para representar o tamanho calculado sem estouro.
Divulgação de Informações (Principal): A memória heap do processo do ImageMagick pode ser lida durante o acesso fora dos limites. Essa memória pode conter:
Os dados vazados podem ser incorporados na imagem de saída convertida ou extraídos via análise de canal lateral.
Negação de Serviço (Secundário):
A leitura de regiões de memória não mapeadas dispara SIGSEGV, causando a terminação do processo do ImageMagick e interrupção do serviço em pipelines automatizados de processamento de imagens.
Detalhes técnicos são fornecidos para fins de validação. Nenhum código de exploração executável é distribuído.
convert, magick ou qualquer chamada à API do ImageMagick$ convert malicious.tim output.png
Segmentation fault (core dumped)
Ou conversão bem-sucedida com dados de heap vazados incorporados na saída.
$ convert malicious.tim output.png
convert: Memory allocation failed `malicious.tim' @ error/tim.c/ReadTIMImage/XXX.
Atualize o ImageMagick para a versão 7.1.2-10 ou posterior:
# Verify current version
convert --version
# Update using package manager
apt update && apt upgrade imagemagick # Debian/Ubuntu
yum update imagemagick # RHEL/CentOS
brew upgrade imagemagick # macOS
Implemente a verificação de estouro antes das operações aritméticas:
// Insecure
image_size = 2 * width * height;
// Secure
if (height != 0 && width > (SIZE_MAX / 2) / height) {
ThrowReaderException(ResourceLimitError, "MemoryAllocationFailed");
}
image_size = 2 * width * height;
Aplique validação de entrada e limites de sanidade nos valores das dimensões antes de realizar cálculos.
Esta vulnerabilidade foi identificada usando análise de variantes. Após a divulgação de um estouro de inteiro semelhante no decodificador BMP do ImageMagick, foi conduzida uma revisão sistemática dos parsers de formatos legados. A correspondência de padrões para cálculos de width * height sem verificação levou à identificação da mesma falha no parser TIM.
Os decodificadores de formatos de imagem legados (TIM, SGI, VIFF, etc.) representam alvos de alto valor devido a auditorias de segurança pouco frequentes e à dependência de aritmética C insegura.
Esta vulnerabilidade foi relatada privadamente aos mantenedores do ImageMagick via GitHub Security Advisories. A divulgação pública ocorreu somente após a disponibilidade do patch e a atribuição do CVE. Esta pesquisa foi conduzida eticamente sob os princípios de divulgação responsável.
SUMIT SHAH
Pesquisador: SUMIT SHAH