OAuth 授权的陷阱 - "允许登录"背后发生了什么

本文约需 13 分钟阅读

每次点击"使用 Google 登录"或"使用 Facebook 继续"时,你都在授予应用程序访问个人数据的权限 - 通常远超你的想象。OAuth 2.0 是这些便捷登录按钮背后的协议,其设计初衷是在不共享密码的情况下委托有限访问权限。 然而在实践中,许多应用程序请求过度权限,如读取所有联系人或以你的名义发送邮件。 更糟糕的是,攻击者已将合法的 OAuth 授权界面本身武器化:Proofpoint 2024 年研究发现, OAuth 钓鱼攻击同比增长 40%,微软报告称基于 OAuth 的攻击占 Microsoft 365 企业入侵的 22%。本文深入剖析 OAuth 授权流程的工作原理、真正的危险所在, 以及你可以采取的具体保护措施。

OAuth 2.0 的工作原理 - 授权流程的基本结构

要理解 OAuth 2.0,首先需要明确"认证"和"授权"的区别。认证 (Authentication) 是确认"你是谁"的过程,授权 (Authorization) 是决定"允许你做什么"的过程。OAuth 2.0 是授权协议,本身不处理认证 (在其上添加认证的是 OpenID Connect)。换句话说,"使用 Google 登录"按钮严格来说是"授权 Google 访问你的信息"按钮。

Authorization Code Flow - 最安全的标准流程

Authorization Code Flow 是为服务器端应用设计的最安全流程。当用户在授权服务器 (Google 或 Facebook) 登录并批准权限后,授权服务器向应用返回"授权码"。应用通过服务器间通信将此授权码交换为"访问令牌"。关键在于访问令牌不会直接暴露给浏览器。授权码只能使用一次,有效期仅几分钟,即使被截获风险也有限。此外,结合 PKCE (Proof Key for Code Exchange) 可以防止授权码劫持攻击。

Implicit Flow - 为什么被弃用

Implicit Flow 最初是为基于浏览器的 SPA (单页应用) 设计的流程。它不经过授权码,授权服务器直接将访问令牌作为 URL 片段 (#access_token=...) 返回给浏览器。这种设计有致命缺陷:访问令牌始终存在通过浏览器历史记录、引用头或浏览器扩展泄露的风险。在 OAuth 2.1 草案规范中,Implicit Flow 已被正式弃用,即使是 SPA 也推荐使用 Authorization Code Flow + PKCE。尽管如此,一些遗留应用仍在使用 Implicit Flow,成为令牌泄露的温床。

"允许登录"的背后 - 过度权限请求的实态

OAuth 授权界面显示称为"作用域"的权限列表。问题在于许多用户不阅读此界面就点击"允许"。根据 Google 的内部研究 (2023 年公开),只有 12% 的用户查看了 OAuth 授权界面上的作用域详情。其余 88% 在未确认显示权限的情况下就批准了。

让我们看看过度权限请求的典型例子。有些简单的日历集成应用会请求"读取联系人"、"发送邮件"、"列出 Drive 文件"等权限。虽然应用功能只需要日历读取权限,但开发者为了数据收集目的添加了不必要的作用域。Astrix Security 2024 年的分析发现,连接到 Google Workspace 的第三方应用中有 35% 请求了其实际功能不需要的权限。特别危险的是"发送邮件"权限。如果拥有此权限的应用被入侵,攻击者可以从你的邮箱地址发送钓鱼邮件。由于收件人看到的是来自合法邮箱地址的邮件,成功率远高于普通钓鱼。

OAuth 钓鱼攻击 - 当合法授权界面成为武器

传统钓鱼攻击通过 创建虚假登录页面窃取凭证。OAuth 钓鱼要复杂得多:它使用 Google、Microsoft 或 Facebook 的真实授权界面。攻击者注册一个名称看似合法的恶意应用 (如"安全更新工具"或"文档查看器 Pro"), 然后向受害者发送指向真实 OAuth 授权页面的链接。由于 URL 指向 accounts.google.com 或 login.microsoftonline.com - 实际的认证服务器 - 即使是安全意识强的用户也可能不会起疑。 一旦受害者点击"允许",攻击者就会收到一个访问令牌,获得恶意应用请求的所有权限。 没有密码被盗,没有涉及钓鱼页面, 传统的反钓鱼工具无法检测到它,因为整个流程使用的是合法基础设施。

OAuth 钓鱼特别危险的原因在于它完全绕过了多因素认证 (MFA)。在传统钓鱼中,即使密码被盗,MFA 也是一道屏障。但在 OAuth 钓鱼中,受害者自己完成了合法的认证流程,通过了 MFA,然后授予访问权限 - 因此 MFA 完全无法防御。Proofpoint 2024 年报告指出,OAuth 钓鱼的成功率是传统钓鱼的 3 倍以上。

令牌泄露的风险 - 访问令牌落入第三方手中会发生什么

访问令牌是"数字备用钥匙"。与密码不同,任何持有令牌的人都可以行使与之关联的权限。令牌泄露的途径有多种。使用 Implicit Flow 的应用中,令牌会通过浏览器历史记录或引用头泄露。移动应用中,令牌可能从设备日志文件或剪贴板泄露。也有报告称第三方 JavaScript 库恶意将令牌传输到外部。

令牌泄露的影响取决于授予的作用域。具有只读邮件访问权限的令牌允许攻击者读取你的所有邮件 - 可能暴露密码重置链接、财务报表和私人通信。具有 Drive 访问权限的令牌让攻击者下载你的所有文档。 具有联系人访问权限的令牌暴露你的整个社交网络,用于进一步的社会工程攻击。 与被盗密码不同,被泄露的令牌无法通过更改密码来缓解。令牌在过期或被明确撤销之前一直有效。 这就是为什么定期审计已连接应用对数字身份保护至关重要。

权限盘点 - 你应该立即检查的关联应用管理界面

通过 OAuth 授予的权限可以从各平台的管理界面查看和撤销。按照以下步骤立即清理不必要的关联应用。

  • Google:myaccount.google.com →"安全性"→"第三方应用和服务"。查看授予每个应用的作用域,删除未使用的应用或权限过度的应用的访问权限。特别注意具有"发送邮件"、"编辑联系人"或"访问所有 Drive 文件"权限的应用。
  • Facebook:设置 →"应用和网站"。从活跃应用列表中查看授予每个应用的权限。重新评估具有"好友列表"、"发布帖子"或"读取消息"权限的应用是否真正必要。
  • X (原 Twitter):设置 →"安全和账户访问"→"应用和会话"→"已连接的应用"。确认每个应用是只读还是读写访问,撤销具有写入权限的不必要应用。
  • Microsoft:account.microsoft.com →"隐私"→"应用和服务"。查看连接到 Microsoft 365 的应用,重点审查可以访问组织数据的应用。

这种盘点不应该是一次性的,建议每 3 个月定期进行。OAuth 安全相关书籍 (Amazon)也可供参考。

保护自己免受 OAuth 风险的具体措施

在理解 OAuth 风险的基础上,实践以下对策。即使没有技术知识,这些都可以从今天开始。

  1. 点击"允许"前仔细阅读授权界面。检查具体请求了哪些权限。如果一个简单的应用请求邮件发送或联系人编辑权限,请拒绝并寻找替代方案。保护你的隐私设置从这个习惯开始
  2. 每 3 个月在上述管理界面盘点关联应用。撤销未使用应用的访问权限,并确认保留的应用权限是否最小化
  3. 对通过邮件或消息应用收到的 OAuth 授权请求保持警惕。合法服务很少直接发送授权界面链接。如果收到此类链接,请通过浏览器直接导航到该服务,而不是点击链接。这是防御社会工程的关键
  4. 使用专用的密码管理器并在所有账户上启用双因素认证。即使 OAuth 令牌被泄露,强大的账户安全也能限制影响范围
  5. 在可用的情况下考虑使用通行密钥。通行密钥完全消除了密码层,减少了 OAuth 钓鱼利用的攻击面

常见问题

使用 OAuth 登录时,应用会收到我的密码吗?
不会,OAuth 最大的优点是不会将密码传递给应用。应用收到的是访问令牌 - 一个临时密钥 - 而不是你的实际密码。但是,有了访问令牌,应用可以在授予权限的范围内访问你的数据,因此需要谨慎判断允许哪些权限。
多因素认证能防止 OAuth 钓鱼吗?
遗憾的是,OAuth 钓鱼完全绕过多因素认证 (MFA)。在传统钓鱼中,即使密码被盗 MFA 也是屏障,但在 OAuth 钓鱼中,受害者自己完成了包括 MFA 在内的合法认证流程后才授予访问权限,因此 MFA 无法防御。对策包括仔细查看授权界面的权限、对邮件中的 OAuth 链接保持警惕、定期盘点关联应用。
一旦授予的 OAuth 权限可以撤销吗?
是的,可以随时撤销。Google 可以在 myaccount.google.com 的"安全性"→"第三方应用和服务"管理,Facebook 在设置的"应用和网站"管理,X 在设置的"已连接的应用"管理。撤销后,该应用的访问令牌立即失效,后续数据访问被阻止。建议每 3 个月定期盘点。

相关术语