CVE-2025-69217coturn是一个免费开源的TURN和STUN服务器实现。该漏洞存在于4.6.2r5至4.7.0-r4版本中,由于重构后对nonce和端口随机化的随机数生成器实现存在严重缺陷。漏洞主要体现在两个方面:一是使用了libc的random()函数而非OpenSSL的RAND_bytes()来生成随机数(Windows平台除外);二是随机数生成器的状态可以通过少量请求被完全重构。攻击者通过发送约50个连续的未认证分配请求,即可完全预测当前的随机数生成器状态,从而预测下一个nonce值。这使得攻击者能够在不知道原始nonce的情况下伪造IP地址进行认证。在IoT等共享凭证场景中,攻击者可以利用此漏洞发送认证消息而无需接收响应。此外,由于端口随机化依赖于伪随机种子,攻击者可以精确重构分配的端口号,预测下一个中继端口,从而实施更精准的攻击。
该漏洞的核心问题在于coturn使用了可预测的随机数生成器。libc的random()函数是一个线性同余生成器(LCG),其状态空间有限且可通过输出逆向推导。具体攻击过程如下:攻击者首先发送约50个未认证的分配请求(Allocate Request),每个请求会触发服务器生成新的nonce值。由于这些nonce是由random()函数生成的,攻击者可以收集这些nonce值并逆向计算随机数生成器的当前状态。一旦获得生成器的内部状态,攻击者就可以预测未来任意数量的nonce值。随后,攻击者利用预测的nonce伪造携带任意源IP地址的认证请求。由于端口随机化同样依赖于相同的伪随机种子,攻击者还能精确预测下一个中继端口号。这种攻击在TURN协议中尤为危险,因为TURN服务器通常部署在NAT穿越场景中,IP地址验证是主要的访问控制机制。漏洞的修复需要将random()替换为密码学安全的随机数生成器,如OpenSSL的RAND_bytes()。