# HMAC validation bypass via múltiplos chamados `.replace()` ao remover a assinatura de URL A validação do HMAC do ThumborÏs pode ser evitada devido ao uso do PythonÏs `.replace()` ao remover a assinatura da URL antes da validação. Como `.replace()` remove **todas as ocorrências** da substring, um atacante pode inserir a mesma assinatura várias vezes no URL e manipular o URL final usado para validação. Isto permite criar URLs onde a string validada difere do recurso real solicitado, habilitando o carregamento de imagens de domínios ou caminhos não desejados. Assinaturas de URLs de Thumbor usando **HMAC-SHA 1 ** para evitar abusos como carregar imagens externas arbitrárias ou invocar filtros sem autorização.
Durante a validação do pedido, o Thumbor remove a assinatura do URL do pedido antes de recalcular o HMAC. O código relevante: ```python url_signature = self.context.request.hash se url_signature: signer = self.context.modules.url_signer( self.context.server.security_key ). try: cited_hash = quote( self.context.request.hash) exceto KeyError: self._error( 400, f"Hish inválido: { self.context.request.hash} " devolve url_to_validate = url.replace( f"/ {self.context.request.hash}/", "" ).replace( f"/ {citado_hash}/", ""). Valid = signer.validate( unquote(url_signature).encode(), url_to_validate ) ``` O problema é que `. replace()` remove ** toda ocorrência** da substring na URL, não apenas a primeira.
Como a assinatura em si aparece no URL, um atacante pode **injetar cópias adicionais da assinatura** em outro lugar do caminho. Quando o Thumbor executa `.replace()`, estas ocorrências adicionais também são removidas, resultando em um `url_to_validate` diferente do que o pedido original. ``` /ddoyYVYUbDf 6 Po_dzOrBhCDrXLc=/ 300 x 200 /s 3.glbimg.com/v 1 /.../ imagem. jpg ``` Injetando o mesmo hash dentro do URL. ``` /ddoyYVYUbDf 6 Po_dzOrBhCDrXLc=/ 300 x 200 /s 3.glbimg.co/ddoyYVYUbDf 6 Po_dzOrBhCDrXLc=/m/v 1 /.../ imagem. jpg ``` Depois de `. replace()` remover todas as ocorrências do hash, o URL usado para validação difere do caminho de solicitação eficaz. Isto permite manipulação do hospedeiro ou caminho a montante.
É possível manipular mais devido ao **segundo `.replace()` para o hash codificado por URL (`% 3 D`)**, permitindo manipulação mais precisa do caminho. ``` /ddoyYVYUbDf 6 Po_dzOrBhCDrXLc=/ 300 x 200 /s 3.glbimg.com/ddoyYVYUbDf 6 Po/ddoyYVYUbDf 6 Po_dzOrBhCDrXLc% 3 D/ ddoyYVYUbDf 6 Po/v 1 /... ``` Este comportamento pode permitir que os atacantes. - Bypass HMAC URL validação - Carregar imagens de domínios arbitrários - Abusar de implantações de Thumbor como um proxy aberto / buscador de imagens - Restrições de domínios circunvent destinadas ao mecanismo de URL assinado.
Usar `.replace()` sem limitar o número de substituições ao remover a assinatura da URL. Uma vez que a assinatura faz parte do caminho de solicitação, usar uma substituição global permite que os atacantes coloquem ocorrências adicionais da mesma substring para influenciar a string validada. Remova apenas a primeira ocorrência da assinatura ou analise explicitamente os componentes URL em vez de executar a substituição global de string.
```python url.replace( f"/ {self.context.request.hash}/", "", 1 ) ```. Alternativamente, reconstrua o URL não assinado deterministicamente a partir dos componentes de solicitação analisados. Registro de aconselhamento: GHSA- mw 3 h- qjxj- 6 xg 9. Identificadores relacionados: CVE- 2026 - 53501. Tempo: GitHub Advisory Database publicou este registro em 2026 - 07 - 31 T 18: 51: 54.000 Z e lista a sua última modificação como 2026 - 07 - 31 T 18: 51: 54.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:N/I:H/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- 347. O registro contém 4 suporte de referências nestes tipos: WEB, PACKAGE.