CVE-2026-40194phpseclib是一个PHP安全通信库。在受影响版本中,phpseclib\Net\SSH2::get_binary_packet() 方法使用 PHP 的 != 运算符来比较接收到的 SSH 包 HMAC 与本地计算的 HMAC。由于 != 运算符在比较等长二进制字符串时会调用 memcmp(),该函数会在第一个不匹配的字节处短路,导致非常量时间的比较行为。攻击者可利用时序差异推断 HMAC,威胁通信机密性。
该漏洞源于 phpseclib\Net\SSH2::get_binary_packet() 函数在验证 SSH 包 HMAC 时使用了不安全的比较方式。代码直接使用了 PHP 的 != 运算符比较二进制字符串。在底层实现中,当比较两个等长字符串时,PHP 会调用 C 语言的 memcmp() 函数。memcmp() 采用“短路”逻辑,即一旦发现两个字节不相同,立即返回结果,而不继续比较后续字节。这意味着,比较所需的时间取决于数据匹配的长度。攻击者可以通过发送大量特制的 SSH 数据包,并精确测量服务器的响应时间,利用统计学方法分析时序差异。通过观察响应时间的微小变化,攻击者可以逐字节地爆破或验证 HMAC 的值。一旦掌握正确的 HMAC,攻击者可能伪造数据包或解密流量,从而窃取敏感信息。