Ao construir uma distribuição de fonte (`python -m build --sdist` / `setup.py sdist`), setuptools `FileList` aplica diretrizes `MANIFEST.in` (`excluir`, `global- excluir', `recursive- excluder`, `prune`) combinando um globo compilado com nomes de arquivos no disco **byte- por-byte, sem normalização Unicode**. Em sistemas de arquivos que preservam a normalização (nomeadamente macOS APFS e HFS+), um arquivo escrito no NFD e uma regra `MANIFEST. in` escrita no NFC referem- se ao mesmo arquivo, mas são distintos por byte, por isso a exclusão não corresponde silenciosamente. Um arquivo que o mantenedor pretendia excluir é então empacotado no `.tar.gz` e, se publicado, carregado para o público, imutável índice PyPI. Os nomes de arquivos em `FileList.files` vêm de `os.walk` (`setuptools/_distutils/filelist.py`, `_find_all_simple`), por isso, no APFS, um arquivo escrito NFD é oferecido ao matcher no NFD, enquanto o padrão `MANIFEST.in` carrega o formulário de editor do autor (tipicamente NFC). O caminho correspondente não realiza canonização: ```python # setuptools/command/egg_info.py (FileList.global_exclude) def global_exclude(self, pattern): match = translate_pattern(os.path.join('**', pattern)) # fnmatch.translate -> regex, sem NFC/NFD retornar self._remove_files(match.match) # byte-level regex sobre os nomes de caminhada brutos ```.
Uma regra escrita NFC (`café` = ` 63 61 66 c 3 a 9 `) não corresponde a um nome escrito no disco NFD (`café` = ` 63 61 66 65 cc 81 `), mesmo que o sistema de arquivos trate os dois como um arquivo. Existe um ajudante ` unicodedata.normalize('NFD',...)` em `setuptools/ unicode_utils.py` (`decompose()`), mas ele nunca é chamado ** no caminho de correspondência manifesto**, por isso nem o padrão nem o caminho avançado são normalizados antes de correspondência. A única normalização nesta área, `EggInfoCommand._manifest_normalize`, usa `filesys_decode` (bytes→str decodifica somente, sem NFC/NFD) e executa- se ao escrever `SOURCES.txt`, depois de a correspondência já ocorrer.
As exclusiones `MANIFEST.in` são as que os mantenedores de mecanismos documentados usam para manter segredos, configurações locais e fixings privados fora do sdist publicado. Um arquivo excluído não- ASCII pode ser publicado para o público, imutável índice PyPI apesar da regra — uma divulgação irreversível sem sinal visual (formularios NFC e NFD renderizar idêntico). A exposição depende do sistema de arquivos e é mais relevante no macOS APFS/HFS+, onde muitos mantenedores compilam e publicam. As regras Pure- ASCII não são afetadas. Com um projeto contendo `MANIFEST.in`. ``` global-incluindo *.txt *.json global-excluir secreta_café.txt # regra salvada NFC ```.
e um arquivo no disco `secret_café.txt` escrito no NFD, `python - m build -- sdist` embala o arquivo secreto no resultado `.tar.gz`, enquanto um arquivo de controle ASCII excluído pela mesma diretiva é corretamente abandonado — isolando o bypass para o padrão NFC vs. O nome NFD não corresponde. Reproduzida no macOS APFS com ferramentas de configuração 82.0.1. Normalize tanto o caminho avançado como cada padrão `MANIFEST.in` para uma única forma canônica antes de combinar, tanto em `setuptools/command/egg_info.py` (`FileList`) como no `setuptools/_distutils/filelist.py' fornecido. Para uma lista de exclusão, errar em excluir mais, e documentar que a correspondência do `MANIFEST.in` é insensível à normalização no macOS.
Reportado pelo Tomas Illuminati. Coordenado por meio do CERT/CC VU VINCE# 604762. Registro de aconselhamento: GHSA- h 35 f- 9 h 28 - mq 5 c. Identificadores relacionados: CVE- 2026 - 59890.
Tempo: GitHub Advisory Database publicou este registro em 2026 - 07 - 21 T 19: 09: 21.000 Z e lista a sua última modificação como 2026 - 07 - 21 T 19: 09: 21.000 Z. Gravidade: MODERAR. Dados de pontuação publicados: CVSS_V 3: CVSS: 3.1 /AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:L/A:N.
Informações sobre software e versão afetadas: ferramentas de configuração de pacotes PyPI — ECOSISTEM: introduzido 0, corrigido 83.0.0. Classificação e evidência: identificadores de fraqueza CWE- 176, CWE- 697. O registro contém 6 suporte de referências nestes tipos: WEB, AVISO, EMBALAGAMENTO.