O carregador de arquivos executa `unquote()` no caminho do arquivo APÓS a verificação de segurança `abspath() + startswith()`. Um atacante pode usar sequências de percurso transversales codificadas por porcentagem (`% 2 e% 2 e` para `...`) que passam a verificação de segurança como nomes literais de diretórios, mas são então decodificados para sequências transversais reais `...`. linhas `thumbor/loaders/file_loader.py` 28 - 49: ```python async def load(context, path): file_path = join( context.config.FILE_LOADER_ROOT_PATH.rstrip("/), path.lstrip("/") ) file_path = abspath(file_path) inside_root_path = file_path.startswith( # Verifique segurança abspath(context.config.FILE_LOADER_ROOT_PATH) ) result = LoaderResult() se não inside_root_path: result.er.erroor = LoaderResult.ERROR_NOT_FOUND result.successo = Falso resultado de retorno se não existe(file_path): file_path = unquote(file_path) # unquote APRÈS verificação!
se exist(file_path) e isfile(file_path): com open(file_path, "rb") como fonte_file:... ```. Os filtros de marca de água e moldura passam seus parâmetros URL diretamente para o carregador sem reencodificação (ao contrário do fluxo principal da imagem URL que aplica `quote()` na linha `image.py` 37 ). ````bash # Leia /etc/passwd via caminho de filtro de marca de água através #% 252 e é duplo- codificado: Tornado decodifica para% 2 e, filtro passa para arquivo_carregador, # arquivo_carregador desconto descodifica% 2 e para. curl ' host: 8888 / inseguro/filtro: marca de água(% 252 e% 252 e/% 252 e% 252 e/% 252 e% 252 e/% 252 e% 252 e/etc/passwd, 0,0,100 )/alguma-imagem- valida.jpg ' ```.
Fluxo: 1. `% 252 e% 252 e` chega ao Tornado, decodificado para `% 2 e% 2 e` 2. Filtro de marca de água passa `% 2 e% 2 e/% 2 e% 2 e/.../etc/passwd` para o carregador de arquivos 3. ` Join( ROOT, '% 2 e% 2 e/...')` = ` ROOT/% 2 e% 2 e/...` 4. `abspath()` vê `% 2 e% 2 e` como nome literal de dir (sem pontos a resolver) 5. `começa com (ROOT)` = Verdadeiro (verificação de passagens) 6. ` exists()` retorna Falso (literal `% 2 e% 2 e` dir não existe) 7. ` unquote()` converte `% 2 e% 2 e` para `..` 8. OS resolve `..` → lê arquivos fora do ROOT - `LOADER = thumber.loaders.file_loader` (ou `file_loader_http_fallback`) - `ALLOW_UNSAFE_URL = True` (este é o padrão) - filtros de marca de água/frame são ativados por padrão (em BUILTIN_FILTERS).
Arquivo arbitrário lido no servidor do polegar. Quando o arquivo é um formato de imagem válido, seu conteúdo é devolvido na resposta sobreposta como uma marca de água. Pode ser usado para ler arquivos de configuração, segredos, chaves privadas, etc. Registro de aconselhamento: GHSA- cj 54 - hpcc- gj 6 h. Identificadores relacionados: CVE- 2026 - 53502.
Tempo: GitHub Advisory Database publicou este registro em 2026 - 07 - 31 T 19: 03: 54.000 Z e lista a sua última modificação como 2026 - 07 - 31 T 19: 03: 54.000 Z. Severidade: ALTAMENTE. Dados de pontuação publicados: CVSS_V 4: CVSS: 4.0 /AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/África do Sul:N.
Informações sobre software e versão afetadas: PyPI package thumber — ECOSYSTEM: introduzido 0, corrigido 7.8.0. Classificação e evidência: identificadores de fraqueza CWE- 22. O registro contém 4 suporte de referências nestes tipos: WEB, PACKAGE.