Sumário `TurnServer.ReceberUdpAsync` coloca seu `captura (Excepção)` SÓLTO o loop `while` receive, e `Start()` lança o loop fogo e esquecimento sem supervisão ou reinicio. Um único datagrama UDP pré- authentificação cujo primeiro byte do cabeçalho STUN está em ` 0 x 80 – 0 xFF` faz com que `STUNHeader.ParseSTUNHeader` lance `ApplicationException`, que se desenrola para além do loop e termina com ele. O relé TURN UDP está então morto para TODOS os clientes até que o processo seja reiniciado. ## Causa Raiz `src/ SIPSorcery/net/TURN/TurnServer.cs`: - `ReceberUdpAsync` (: 555 - 577 ): o 'try' interno (: 562 - 567 ) enrola apenas `_udpSocket.RecebeAsync()`; `HandleUdpDatagram(result.Buffer, result.RemoteEndPoint)` (: 569 ) está dentro do corpo "while" mas fora dessa tentativa interna. O genérico `capture (Exception ex)` (: 573 ) é lexicamente fora do ` while `. - ` Start()` faz `_ = ReceberUdpAsync(); ' (: 381 ) — fogo e esquecimento, sem reiniciar. - "HandleUdpDatagram` (: 579 ) chama `STUNMessage.ParseSTUNMessage( dados, dados. Longitude)` (: 600 ) para qualquer datagrama de dados não- ChannelData; ` ParseSTUNMessage ' (STUNMessage. cs: 94 ) não tem tentativa/ captura.
Impacto `ApplicationException` propaga-se fora do `while`, é pego em: 573, logado e o método retorna. `_ running ' permanece verdadeiro, mas nada re- invoca ` ReceiveUdpAsync` → Relê UDP de TURN permanentemente indisponível para todos os clientes (todo o servidor DoS). Pre- autenticação: STUN analisa antes de qualquer verificação de alocação/credencial do TURN. ## Prova do conceito Enviar um datagrama UDP para a porta TURN (por omissão) 3478 ) com o primeiro byte ` 0 x 80 ` (por exemplo, ` 80 00 00 00 `). ` 0 x 80 & 0 xC 0 = 0 x 80 ≠ 0 x 40 ` → não ChannelData → `ParseSTUNMessage` → `ParseSTUNHeader` executa `if ((Array[startIndex] & 0 xC 0 )!= 0 ) lançar novo aplicativo(...)` (STUNHeader.cs: 169 - 172 ); ` 0 x 80 & 0 xC 0 = 0 x 80 ≠ 0 ` → lança.
Cadeia de ataque 1. Entrada: um datagrama UDP para a porta TURN, primeiro byte ` 0 x 80 – 0 xFF`. Guarda: O ramo ChannelData requer `(dados[ 0 ] & 0 xC 0 ) == 0 x 40 ` (: 583 ). Convénio: ` 0 x 80 & 0 xC 0 = 0 x 80 ≠ 0 x 40 ` → cai para `ParseSTUNMessage` (: 600 ). 2. Lavar: `StunMessage.ParseSTunMessage` → `StunHeader.ParseSTUNHeader` (StunHeader. cs: 169 - 172 ) lança `ApplicationException '. Guard: nenhum antes do lançamento; ` ParseSTUNMessage ' não tem tentativa/ captura. Convénio: ` 0 x 80 & 0 xC 0 = 0 x 80 ≠ 0 ` → lança. 3. Impacto: a exceção descontrai-se depois do `while` em `catcha(Exception)` em: 573 → o método logado → retorna → saídas do loop. Guarda: nenhum — nenhum reinicio (`Start()`: 381 fogo e esquecimento). Convés: N/ A. TURN UDP relé morto para todos os clientes até o reinicio do processo. ## Evidência de Bypass - Estrutura de Loop/ Cathock: captura no TurnServer.cs: 573 está fora do ` enquanto ' em: 559; `HandleUdpDatagram` em: 569 está fora da tentativa interna (: 562 - 567 ) - Descuidado `ParseSTUNMessage' em: 600; jogar no STUNHeader. cs: 169 - 172 - Começa com fogo e esquecimento em: 381 sem reiniciar em `Start()`. - `TurnServerConfig.ListenAddress` é padrão para `IPAddress.Loopback` (: 42 ), mas um servidor TURN funcional deve ligar um endereço rotável para servir clientes, para que as implantações reais sejam expostas. A configuração não predefinida estreita a população vulnerável, não a dificuldade de ataque → AC:L.
Versão afetada `nuget:SIPSorcery <= 10.0.13 ` (Componente TurnServer presente desde então 10.0.5; verificado na etiqueta de lançamento v 10.0.13 e CEPEL). ## Dedup NÃO é uma duplicada do GHSA- 28 gm-jrmw-xx 93 (CVE- 2026 - 54632 ), que cobre o socket RTP/ICE do cliente (`UdpReceiver`/`RTPChannel`). `TurnServer` é um RFC enviado distinto 5766 componente do servidor com seu próprio loop e localização de correção.
Sugestão de Envolver o 'HandleUdpDatagram' em um teste/log- e-continuar por-dadograma INSIDE o `em tempo' (compaginando a intenção de drop- and-continuar de corrigir bdb 76 cb), e/ ou adicionar supervisão/reinicialização do loop. --- Reportado por **zx (Jace)** — GitHub: @manus-use. Registro de aconselhamento: GHSA-pfvm-w 89 x- 94 - Sim. Não há nenhum identificador adicional listado.
Tempo: GitHub Advisory Database publicou este registro em 2026 - 08 - 12 T 19: 31: 48.000 Z e lista a sua última modificação como 2026 - 08 - 12 T 19: 31: 48.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.
Informações sobre software e versão afetadas: NuGet pacote SIPSorcery — ECOSISTEM: introduzido 10.0.5, corrigido 10.0.14.
Classificação e evidência: identificadores de fraqueza CWE- 248, CWE- 755. O registro contém 3 suporte de referências nestes tipos: WEB, PACKAGE.