O ` b 64 ` extensão imagens inlines referenciadas por ` ` como base 64 dados URIs. Ao resolver o caminho `src`, ele junta- o ao `base_path` configurado com `os.path.normpath` e abre o resultado diretamente, sem verificar se o caminho resolvido permanece dentro do `base_path`. Um `src` contendo sequências `../`, ou um caminho absoluto, lê, portanto, um arquivo fora de `base_path`, desde que esse arquivo tenha uma extensão de imagem permitida (`.png`, `.jpg`, `.jpeg`, `.gif`, `.svg`). A base 64 do arquivo é então incorporado na saída renderizada, divulgando o seu conteúdo. Este é um caminho de código separado dos problemas transversais `snippets` (GHSA-jh) 85 - wwv 9 - 24 HV, GHSA- 62 q 4 - 447 f-wv 8 H). Ele vive em `pymdownx/b 64.py` e não tem nenhuma restrição de caminho de qualquer tipo. Confirmado no ` 10.21.3 ` instalado a partir do PyPI. Em `pymdownx/ b 64.py`, função `repl_path` (em torno de linhas 68 para 90 no `main`:.

```python if is_absolute: file_name = os.path.normpath(path) # src absoluto: base_path ignorado inteiramente: file_name = os.path.normpath(os.path.join(base_path, path)) # src relativo: '../' escapa base_path se os.path.exists(file_name): ext = os.path.splitext(file_name)[ 1 ].lower() para b 64 _ext nos tipos de arquivo: se ext em b 64 _ext: com open(file_name, "rb") como f: # aberto sem verificação de contenção... ``` Não há `startswith(base_path)`, nenhuma comparação `os.path. realpath` e nenhuma rejeição de `...'. Ambos os ramos são alcançáveis a partir de um `src' controlado pelo atacante. Reproduzida contra uma extensão `pymdown' não modificada. 10.21.3 ` do PyPI. O script cria um diretório `base_path` e um nível PNG acima dele, então renderiza o Markdown cuja imagem `src` aponta fora de `base_path`, e confirma que os bytes do arquivo externo aparecem na base 64 - codificado na saída.

Base de importação de ```python 64, os, fechar, tempfile, marcar. root = tempfile.mkdtemp() base_path = os.path.join(root, "docs"); os. makedirs(base_path) fora = os.path.join(root, "secret"); os. makedirs(outside) png = base 64.b 64 decodificar( "iVBORw 0 KGgoAAAANSUhEUgAAAAAAAAABCAQAAAC 1 HAWCAAAAC 0 lEQVR 42 MNK" "+M 9 QDwADhgGAWjR 9 awAAAABJRU 5 ErkJggg==" ) com open(os.path.join(outside, "secret.png"), "wb") como f: f.write(png) md = markdown.Markdown( extensions=["pymdownx.b 64 "], extension_configs={"pymdownx.b 64 ": {"base_path": base_path}, ) html = md.convert(' ').

afirmar base 64.b 64 encode( png).decode() em html, "não vazou" print("LEAKED:", html) ```` A base 64 de um arquivo fora de `base_path` está presente na saída. O ramo do caminho absoluto se comporta da mesma forma: um `src` absoluto contorna `base_path` inteiramente via `os.path.normpath(path)`. Ambos foram confirmados vazamentos. Um aplicativo que torna o Markdown não confiável com `pymdownx.b 64 ` habilitado expõe o conteúdo dos arquivos de extensão de imagem no servidor, ou qualquer caminho que o processo possa ler, a quem controla o Markdown e quem visualiza a saída. O alcance é limitado pela verificação da extensão da imagem, por isso é um arquivo alvo lido em vez de lido arbitrário, mas ainda revela conteúdos de arquivos que nunca foram destinados a ser expostos.

Resolver o caminho real e exigir que ele permaneça dentro de `base_path` antes de abrir: ```python file_name = os.path.realpath(os.path.join(base_path, caminho)) base_real = os.path.realpath(base_path) se file_name!= base_real e não file_name.startswith(base_real + os.sep): retorna m.group( 0 ) # deixar a etiqueta intacta; não leia fora do caminho base_ ``.

A mesma verificação de contenção deve aplicar- se ao ramo do caminho absoluto em vez de confiar em um `src' absoluto. Usando `realpath` em vez de `abspath` também fecha o gap relacionado com o link- seguindo no manipulador de fragmentos. Registro de aconselhamento: GHSA- 9 xwg- 3 r 6 f- jcx 2. Identificadores relacionados: CVE- 2026 - 61632.

Tempo: GitHub Advisory Database publicou este registro em 2026 - 07 - 24 T 16: 18: 33.000 Z e lista a sua última modificação como 2026 - 07 - 24 T 16: 18: 33.000 Z. Gravidade: MODERAR. Dados de pontuação publicados: CVSS_V 3: CVSS: 3.1 /AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N.

Software afetado e informações de versão: extensão de pymdown do pacote PyPI — ECOSYSTEM: introduzido 0, corrigido 11.0.0. Classificação e evidência: identificadores de fraqueza CWE- 22. O registro contém 4 suporte de referências nestes tipos: WEB, PACKAGE.