如何防范OAuth认证漏洞

为了防范OAuth认证漏洞,OAuth提供商和客户端应用都必须对关键的输入实施健壮的验证,特别是redirect_uri参数。在OAuth规范中很少有内置的保护,因此要靠开发人员自己来使OAuth流尽可能安全。

值得注意的是,漏洞可能出现在客户端应用和OAuth服务本身。即使你自己的实现坚如磐石,最终仍然依赖于另一端同样健壮的应用。

对于OAuth服务提供商

  • 要求客户端应用注册一个有效的redirect_uris白名单。尽可能使用严格的逐字节比较来验证任何传入请求中的URI。只允许完全和精确的匹配,而不是使用pattern匹配。这可以防止攻击者访问白名单域上的其他页面。

  • 强制使用state参数。它的值也应该与用户的会话绑定,包括一些不可猜测的、特定于会话的数据,如包含会话cookie的哈希值。这有助于保护用户免受类似CSRF的攻击。也使得攻击者更难使用任何被盗的授权码。

  • 在资源服务器上,确保你验证了访问令牌是颁发给提出请求的同一个client_id。还应该检查被请求的作用域,以确保这与最初授权token的作用域一致。

对于OAuth客户端应用

  • 在实现OAuth之前,请确保你完全理解它的工作原理。许多漏洞都是由于缺乏对每个阶段究竟发生了什么,以及如何利用这些漏洞的理解而引起的。

  • 使用state参数,即使它不是强制性要求的。

  • 不仅向/authorization端点发送redirect_uri参数,还要向/token端点发送。

  • 在开发移动或本机桌面OAuth客户端应用时,通常无法保持client_secret私有。在这些情况下,PKCERFC 7636)机制可用于提供额外的保护,已防止访问code被拦截或泄漏。

  • 如果你使用OpenID Connect id_token,请确保它是根据JSON Web Signature、JSON Web Encryption和OpenID规范正确验证的。

  • 对授权码要小心,当加载外部图像、脚本或CSS内容时,它们可能会通过Referer头泄露。同样重要的是,不要将它们包含在动态生成的JavaScript文件中,因为它们可能会通过<script>标签从外部域执行。

Last updated