A configuração `ALLOWED_SOURCES` é destinada a restringir quais hosts o carregador HTTP do Thumbor podem obter imagens. Os itens de string simples nessa lista (a maioria esmagadora das configurações do mundo real e documentadas) são passados diretamente para ` re. match()` sem escapar. Como `.` é um comodinho de regex, cada ponto de um nome de domínio se torna um vetor de bypass: `s.glbimg.com` silenciosamente corresponde a `sXglbimgYcom`, `sAglbimg.com` e a qualquer outro nome de hospedeiro que difere apenas em uma posição de ponto. Isto prejudica a defesa primária da SSRF que `ALLOWED_SOURCES ́ é pretendida fornecer. ## Componente afetado. `thumbor/loaders/http_loader.py` — `validate()` ````python importa re de thumb.config importar Config de thumb.context importar Contexto de thumb.loader importar http_loader como carregador.
config = Config() config.ALLOWED_SOURCES = ["s.glbimg.com"] # configuração típica do usuário ctx = Contexto(Nenhum, configuração, Nenhuma) # Estes devem ser bloqueados — ambos retornam Verdadeiro devido ao ponto impresso (loader.validate(ctx, " # Verdadeiro ← bypass print(loader.validate(ctx, " # Origem legítima — corretamente permitida print(loader.validate(ctx, " # Verdadeiro ← correto ```.
`thumbor/loaders/http_loader.py` (antes de corrigir). ````python para o padrão em context.config.ALLOWED_SOURCES: se isinstance(pattern, Pattern): match = url outloose: pattern = f"^{pattern}$" # <-- pontos não escapados, atuem como como como um comodín de regex match = res.hostname se re. match(pattern, match): retorna Verdadeiro ```. Um atacante que pode influenciar o URL de fonte de imagens passado para o Thumbor pode obter imagens de host arbitrários, evitando a lista de permissões `ALLOWED_SOURCES`. - `ALLOWED_SOURCES` contém pelo menos uma entrada em string simples (o caso comum; todos os exemplos oficiais de documentação usam strings simples). - O atacante pode fornecer ou influenciar a URL da imagem — true sempre que `ALLOW_UNSAFE_URL = True` (o padrão), ou quando o aplicativo encaminha a entrada do usuário para um objetivo URL assinado.
Aplicar `re.escape()` aos padrões de linha simples antes de compilar, para que cada caractere seja igualado literalmente: ````python outlome: pattern = f"^{re.escape(pattern)}$" # pontos e outros meta- caracteres são agora correspondência literal = res.hostname ``` Esta é uma adição de uma chamada sem alteração de quebra para configurações corretamente escritas. Os usuários que precisam de um comportamento de expressão regular real devem fornecer um padrão compilado (`re. compile(r"s\.glbimg\.com"), que já é manejado pelo ramo existente `isistance(pattern, Pattern)' e não está afetado por esta mudança.
O docstring `ALLOWED_SOURCES` em `config.py` também foi atualizado para documentar explicitamente o comportamento de dois modos. Registro de aconselhamento: GHSA- 6 x 26 - 6 r 6 f- m 537. Identificadores relacionados: CVE- 2026 - 53500. Tempo: GitHub Advisory Database publicou este registro em 2026 - 07 - 31 T 18: 36: 03.000 Z e lista a sua última modificação como 2026 - 07 - 31 T 18: 36: 03.000 Z.
Severidade: ALTAMENTE. Dados de pontuação publicados: CVSS_V 3: CVSS: 3.1 /AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:L. 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- 1333. O registro contém 4 suporte de referências nestes tipos: WEB, PACKAGE.