7.12. 开放式重定向
开放式重定向器是一个端点,它将用户的浏览器转发到从查询参数中获取的任意 URI。这种端点有时会被实现,例如,用于展示一条消息,然后将用户重定向到外部网站,或者将用户重定向回到他们本要访问的 URL,但中途被打断了,例如,登录提醒。
当授权服务器或客户端有一个开放式重定向器时,下面的攻击可能会发生。
7.12.1. 客户端作为开放式重定向器
客户端禁止暴露它的开放式重定向器。攻击者可能会利用开放式重定向器,生成指向客户端的 URL,并且利用这些 URL 渗透授权码,如 [I-D.ietf-oauth-security-topics] 第 4.1.1 节所述。另一种滥用开放式重定向器的情况是,生成了看似指向客户端的 URL。这可能会诱使用户相信该 URL,并且在浏览器中跟随该 URL。这可能会被滥用于钓鱼。
为了防止开放式重定向,客户端应该仅当目标 URL 在白名单内,或者请求的来源和完整性可以被认证时,才进行重定向。OWASP [owasp_redir] 描述了开放式重定向的对策。
7.12.2. 授权服务器作为开放式重定向器
就像客户端一样,攻击者可以试图利用授权服务器(特别是它的 URL)对用户的信任,实施钓鱼攻击。OAuth 授权服务器经常将用户重定向到其它网站(客户端),但必须用安全的方式实现。
第 4.1.2.1 节已经规定了,当 client_id 和 redirect_uri 的组合无效时,授权服务器禁止自动重定向用户代理,从而防止了开放式重定向。
然而,攻击者仍然可以利用正确注册的重定向 URI,实施钓鱼攻击。例如,攻击者可以通过客户端动态注册 [RFC7591],注册客户端,然后实施下列攻击之一:
- 故意发送错误的授权请求,例如,使用无效的范围值,然后引导授权服务器将用户代理重定向到攻击者的钓鱼网站。
- 故意发送合理的授权请求,但 client_id 和 redirect_uri 由攻击者控制。在用户经过认证后,授权服务器提示用户同意授权请求。如果用户注意到了请求有问题,授权服务器还是会将用户代理重定向到钓鱼网站。在这种情况下,不管用户怎么做,用户代理都会被重定向到钓鱼网站。
- 故意发送合理的静默授权请求(没有提示),但 client_id 和 redirect_uri 由攻击者控制。在这种情况下,授权服务器会自动将用户代理重定向到钓鱼网站。
授权服务器必须采取预防措施,防止这些威胁。授权服务器必须始终先认证用户;然后,除非是静默认证,在必要时提醒用户输入凭据;最后,再重定向用户。根据其风险评估策略,授权服务器需要决定它是否能信任重定向 URI。它可以考虑内部进行的 URI 分析,或者通过某些外部服务,评估 URI 背后内容的信誉和可信度,以及重定向 URI 和其它客户端数据的来源。
授权服务器应该仅在信任重定向 URI 时,才自动重定向用户代理。如果不信任 URI,那么授权服务器可以告知用户,让用户来做出正确决策。