lzma: unbounded dictionary-size allocation is a memory DoS (zipfile, tarfile, lzma.decompress)
Ninguém assumiu esta issue ainda.
- Linguagem predominante
- Python
- Estrelas
- 77.2k
- Forks
- 35.9k
- Métricas de merge de PRs
- Métricas de PR pendentes
Descrição
Bug: LZMA decompression accepts an attacker-controlled dictionary size with no bound, and liblzma allocates the full dictionary up front when a decompressor is created. A few bytes of input can therefore force a multi-gigabyte allocation (memory denial of service).
Attack surfaces (both reported by OSS-Fuzz, both public):
zipfilewith an LZMA-compressed member: the 5-byte LZMA properties header in the member data declares the dictionary. A 1088-byte zip whose member declares a ~2 GiB dictionary OOMs the process. https://issues.oss-fuzz.com/issues/495472861tarfile's compression-detection loop: a 13-byte input whose first byte is a valid LZMA-alone properties byte (0x66) and whose remaining bytes encode a ~4 GiB dictionary is tried as LZMA; liblzma allocates 4 GiB before failing. https://issues.oss-fuzz.com/issues/482161128
Also reachable directly: lzma.decompress() / LZMADecompressor(format=FORMAT_AUTO) on untrusted bytes, and LZMADecompressor(FORMAT_RAW, filters=[{"dict_size": ...}]).
Root cause: two gaps:
parse_filter_spec_lzma()accepts anydict_size(up to UINT32_MAX) for raw LZMA1/LZMA2 filter chains; liblzma allocates that dictionary at decompressor creation.LZMADecompressordefaultsmemlimittoUINT64_MAX, so the FORMAT_ALONE/FORMAT_AUTO paths (where the header is parsed inside liblzma) are also unbounded.
Proposed fix (PR to follow):
- Reject
dict_size > LZMA_DICT_SIZE_MAX(1.5 GiB, liblzma's own maximum) inparse_filter_spec_lzma()withLZMAError. - Default the decompressor
memlimittoLZMA_DICT_SIZE_MAXinstead ofUINT64_MAX(callers may still pass an explicitmemlimit).
No legitimate streams are affected: liblzma presets cap at 64 MiB dictionaries, and 1.5 GiB is liblzma's own maximum supported dictionary size.
Reported by OSS-Fuzz (ClusterFuzz). Reproducers attached to the issues above.
Linked PRs
- gh-155650
Guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Direção de pesquisa
Comece com parse_filter_spec_lzma() e LZMADecompressor e, em seguida, revise os caminhos de zipfile e tarfile descritos na issue. Use os reprodutores vinculados do OSS-Fuzz para verificar se dicionários superdimensionados não causam mais alocação ilimitada, enquanto os streams LZMA normais e o comportamento explícito de memlimit permanecem intactos.
Escrita pelo modelo de indexação a partir do texto da issue.
Avaliação
- Stack de tecnologia
- python
- Domínio
- security
- Tipo de issue
- Bug
- Dificuldade
- 4/5
- Tempo estimado
- 3-5 dias
- Status de atividade
- Estagnada
- Clareza
- Claramente especificada
- Facilidade para iniciantes
- 35/100