在 Golang 密码学库中发现了一个严重的安全漏洞,被追踪为 CVE-2024-45337 (CVSS 9.1)。该漏洞源于对 ServerConfig.PublicKeyCallback 函数的滥用,可能导致应用程序和库中的授权绕过。
问题根源:
PublicKeyCallback 函数旨在允许服务器在 SSH 连接期间验证客户端提供的公钥的真实性。然而,文档明确指出,该回调函数并不保证用于身份验证的实际密钥。
当应用程序错误地依赖于提交给 PublicKeyCallback 的密钥顺序或内容来做出授权决定时,就会产生该漏洞。攻击者可以通过以下方式利用这一漏洞:
- 提交多个公钥: 攻击者可以发送一系列公钥,意图误导服务器。
- 使用不同的密钥进行验证: 即使服务器验证了特定的公钥,攻击者也可以使用完全不同的方法(如密码、键盘交互式)进行验证。
所提供的密钥与实际验证方法之间的这种错位可能会诱使易受攻击的应用程序授予未经授权的访问权限。
缓解措施:
- 升级至 golang.org/x/crypto v0.31.0 或更高版本: 该版本包含一个关键修复,可在成功的公钥身份验证过程中强制使用传递给 PublicKeyCallback 的最后一个密钥。
- 正确利用权限: 应用程序应利用身份验证回调中的权限字段来存储和检索与身份验证尝试相关的数据。避免根据外部状态或提交给 PublicKeyCallback 的密钥顺序做出授权决定。
- 审查第三方库: 如果使用与 golang.org/x/crypto 交互的第三方库,请仔细查看其文档和实现,以了解是否存在滥用 PublicKeyCallback 和权限字段的可能性。