Quando o Hoverfly está em execução no modo Diff, a função `AddDiff()` escreve para o mapa compartilhado `responsesDiff` sem nenhuma sincronização (sem mutex). Quando várias solicitações de proxy são processadas simultaneamente (o caso normal para qualquer proxy), o mapa concorrente escreve o detector de corridas integrado do Go que causa um `erro fatal: leitura e escrita de mapa concorrentes, matando imediatamente todo o processo de Hoverfly. Isto é trivialmente explorável ao enviar múltiplos pedidos simultâneos. ** 1. Acesso não sincronizado ao mapa em ` AddDiff()` (`core/ hoverfly_service.go: 417 - 421 `):** ``` go func (hf * Hoverfly) AddDiff(requestView v 2.SimpleRequestDefinitionView, diffReport v 2.DiffReport) { se len(diffReport.DiffEntries) > 0 { diffs:= hf.responsesDiff[requestView] // UNSYNCHRONIZAD LER hf.responsesDiff[requestView] = anex( diffs, diffReport) // UNSYNCHRONIZAD WRITE } } ```.
** 2. Esta função é chamada do processamento do modo Diff, que é executado simultaneamente por solicitação (`core/modes/diff_mode.go`):** Cada pedido de proxy entrante é tratado em sua própria goroutine pelo servidor `net/http` do Go. No modo Diff, cada solicitação chama `AddDiff()` após comparar as respostas simuladas e reais. Com múltiplos pedidos concorrentes, várias gorotinas escrevem simultaneamente no mesmo mapa. ** 3. O tempo de execução do Go detecta o acesso ao mapa concorrente e termina o processo:**.
Ao contrário das corridas de dados em valores simples (que produzem comportamentos indefinidos silenciosamente), a implementação do mapa do Go inclui uma verificação de acesso concomitante incorporada. Quando duas gorotinas acedem ao mesmo mapa e pelo menos uma está escrevendo, a execução chama ` fatal()` que é irrecuperável, não pode ser pego pelo ` recover()`. ** 4. Não existe proteção mutex no ` ResponsesDiff`:**. O campo é declarado como um `map[v') simples 2.SimplesRequestDefinitionView[]v 2.DiffReport` sem `sync.RWMutex` associado. Compare com `hf.state` que usa corretamente `sync.RWMutex` para o seu acesso ao mapa. - **Versão de hoverfly:** v 1.12.7 - ** Sistema de Operação:** macOS Darwin 25.4.0 - **Versão de Go:** 1.26.2 - **Configuração:** Hoverfly no modo Diff (` PUT / api/ v 2 /hoverfly/mode {"mode":"diff"}`).
**Passo 1: Iniciar o Hoverfly e definir o modo Diff**. ````bash./hoverfly & sono 2 # Defina o modo diff curl - X PUT 8888 /api/v 2 /hoverfly/modo \ -H "Tipo de conteúdo: aplicativo/json" \ -d '{"modo": "diff"}' # Carregue uma simulação para a comparação de diff curl - X PUT 8888 /api/v 2 /simulação \ -H "Tipo de conteúdo: aplicativo/json" \ -d '{ "dados": { "pares": [{ "petição": {"caminho": [{"matcher": "glob", "valor": "*"}]}, "resposta": {"estatus": 200, "corpo": "esperado"} }], "Açõesglobales": {"delays": [], "delaysLogNormal": []} }, "meta": {"schemaVersão": "v 5.2 "} }' ```.
**Passo 2: Enviar pedidos concorrentes para desencadear a corrida**. ```` Bash # Enviar 50 solicitações concorrentes, a condição de corrida ativa em segundos para i em $(seq 1 50 ); faça curl -s -x 8500 " & feito wait ``` **Passo 3: Observe o acidente**. ````Bash # Verifique se o processo ainda está executando o pgrep -f hoverfly ``` ** saída de choque no Hoverfly v 1.12.7:**. Erro fatal: leitura e gravação de mapas concorrentes.
goroutina 892 [correndo]: github.com/ SpectoLabs/ hoverfly/core.(* Hoverfly).Adicionar Diff(...) /core/ hoverfly_service.go: 419 gthub.com/SpectoLabs/hoverfly/core/modes.(* DiffMode). Processo(...) ``` O processo falha com ~ 50 Pedidos concorrentes. Na produção com tráfego real, ele se bloqueia quase imediatamente. - ** Negação completa de serviço:** O processo termina imediatamente e não pode ser recuperado sem reiniciar - ** Exploração trivial:** Qualquer atacante com acesso proxy pode desencadear isso enviando várias solicitações simultâneas - ** Nenhum acesso API de administrador é necessário:** Apenas o acesso à porta proxy é necessário para desencadear o crash - ** Desrecuperável:** `Erro fatal' em Go não pode ser capturado por `recover()` — o processo é incondicionalmente morto - ** Afeta todos os usuários do modo Diff:** Qualquer equipe usando o modo Diff para testes de comparação API é vulnerável.
Registro de aconselhamento: GHSA-qrh 4 - p 6 v 4 - MRFG. Identificadores relacionados: CVE- 2026 - 50013. Tempo: GitHub Advisory Database publicou este registro em 2026 - 07 - 14 T 18: 03: 10.000 Z e lista a sua última modificação como 2026 - 07 - 14 T 18: 03: 10.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:N/A:H.
Software afetado e informações de versão: Vá com o pacote github.com/SpectoLabs/hoverfly — ECOSISTEM: introduzido 0, corrigido 1.12.8. Classificação e evidência: identificadores de fraqueza CWE- 362, CWE- 820. O registro contém 4 suporte de referências nestes tipos: WEB, PACKAGE.