挖洞经验 | 跨站Websocket Hijacking漏洞导致的Facebook账号劫持
字数 1528 2025-08-18 11:39:23

跨站WebSocket Hijacking漏洞分析与防御指南

漏洞概述

跨站WebSocket Hijacking (CSWSH)是一种安全漏洞,允许攻击者通过恶意构造的WebSocket连接劫持用户的会话。在Facebook的案例中,该漏洞存在于一个测试阶段的新应用中,可能导致用户账号被完全劫持。

漏洞环境

  • 受影响系统:Facebook新推出的测试应用(托管在facebook.com子域名下)
  • 测试范围:仅限于受邀安全人员测试的预发布环境
  • 漏洞奖励:Facebook支付了$12,500的漏洞赏金

漏洞根本原因

  1. 不安全的Origin验证

    • 应用允许本地IP地址(如0.0.0.1/8或192.168.1.1/8)作为有效的Origin主机头
    • 缺乏严格的同源策略(SOP)和跨域资源共享(CORS)限制
  2. 混合认证机制

    • 设计上应使用随机数进行安全登录验证
    • 实际实现中错误地使用了Facebook全局Cookie进行身份验证
    • 随机数在登录页面生成,在后续WebSocket消息中验证

攻击原理

  1. 会话劫持

    • 攻击者与受害者处于同一本地网络
    • 通过构造恶意Origin头建立WebSocket连接
    • 利用WebSocket不受SOP/CORS限制的特性
  2. 攻击媒介

    • DNS欺骗(Spoofing)
    • 点对点发送恶意链接
    • 通过恶意APP启动无权限限制的HTTP服务

详细攻击步骤

1. 信息收集阶段

  • 访问目标应用(REDACTED.facebook.com)
  • 保存包含WebSocket通信处理的JavaScript文件
  • 分析加密的WebSocket通信和编码的JavaScript逻辑

2. 攻击准备阶段

  • 修改收集的JavaScript文件(植入攻击payload)
  • 启动本地HTTP服务托管恶意文件

3. 攻击执行阶段

  • 向同一网络内的受害者发送恶意链接(deep-link形式)
  • 受害者访问链接后:
    • 脚本与REDACTED.facebook.com建立WebSocket连接
    • 利用用户的Cookie信息通过身份验证
    • 受害者看到自己"成功登录"Facebook
    • 后台执行攻击payload(如添加攻击者控制的邮箱/手机号)

4. 攻击确认

  • 攻击payload在受害者登录后发送特定WebSocket消息
  • 实现对受害者Facebook账户的完全控制
  • 测试确认在Android设备上有效(iOS未测试)

防御措施

1. 严格的Origin验证

  • 实现精确的Origin白名单机制
  • 禁止接受本地IP地址作为有效Origin
  • 验证完整的域名匹配而非部分匹配

2. 认证机制一致性

  • 确保所有认证路径使用相同机制(随机数或Cookie,但不能混合)
  • 实现明确的认证流程文档和代码审查

3. WebSocket安全增强

// 服务器端WebSocket连接验证示例
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });

wss.on('connection', (ws, req) => {
  // 严格的Origin检查
  const origin = req.headers.origin;
  if (!isAllowedOrigin(origin)) {
    ws.close();
    return;
  }
  
  // 使用独立的CSRF令牌
  const csrfToken = req.headers['x-csrf-token'];
  if (!validateCSRFToken(csrfToken)) {
    ws.close();
    return;
  }
  
  // 其他业务逻辑...
});

4. 其他防御措施

  • 实现WebSocket连接的CSRF令牌保护
  • 对敏感操作要求二次认证
  • 限制WebSocket连接的功能范围
  • 记录和监控异常的WebSocket连接尝试

漏洞处理时间线

  1. 2019.12.10:漏洞初次报告
  2. 2019.12.10:Facebook确认漏洞有效性
  3. 2019.12.17:Facebook完成漏洞修复
  4. 2020.1.2:发放$12,500漏洞赏金

总结

跨站WebSocket Hijacking是一种严重的安全威胁,特别是在混合认证机制和不严格的Origin验证条件下。开发人员应当:

  1. 对所有WebSocket连接实施严格的Origin验证
  2. 避免混合使用不同的认证机制
  3. 对敏感操作实施额外的保护措施
  4. 在预发布阶段进行充分的安全测试

通过实施这些措施,可以有效防止类似CSWSH漏洞的利用,保护用户账户安全。

跨站WebSocket Hijacking漏洞分析与防御指南 漏洞概述 跨站WebSocket Hijacking (CSWSH)是一种安全漏洞,允许攻击者通过恶意构造的WebSocket连接劫持用户的会话。在Facebook的案例中,该漏洞存在于一个测试阶段的新应用中,可能导致用户账号被完全劫持。 漏洞环境 受影响系统 :Facebook新推出的测试应用(托管在facebook.com子域名下) 测试范围 :仅限于受邀安全人员测试的预发布环境 漏洞奖励 :Facebook支付了$12,500的漏洞赏金 漏洞根本原因 不安全的Origin验证 : 应用允许本地IP地址(如0.0.0.1/8或192.168.1.1/8)作为有效的Origin主机头 缺乏严格的同源策略(SOP)和跨域资源共享(CORS)限制 混合认证机制 : 设计上应使用随机数进行安全登录验证 实际实现中错误地使用了Facebook全局Cookie进行身份验证 随机数在登录页面生成,在后续WebSocket消息中验证 攻击原理 会话劫持 : 攻击者与受害者处于同一本地网络 通过构造恶意Origin头建立WebSocket连接 利用WebSocket不受SOP/CORS限制的特性 攻击媒介 : DNS欺骗(Spoofing) 点对点发送恶意链接 通过恶意APP启动无权限限制的HTTP服务 详细攻击步骤 1. 信息收集阶段 访问目标应用(REDACTED.facebook.com) 保存包含WebSocket通信处理的JavaScript文件 分析加密的WebSocket通信和编码的JavaScript逻辑 2. 攻击准备阶段 修改收集的JavaScript文件(植入攻击payload) 启动本地HTTP服务托管恶意文件 3. 攻击执行阶段 向同一网络内的受害者发送恶意链接(deep-link形式) 受害者访问链接后: 脚本与REDACTED.facebook.com建立WebSocket连接 利用用户的Cookie信息通过身份验证 受害者看到自己"成功登录"Facebook 后台执行攻击payload(如添加攻击者控制的邮箱/手机号) 4. 攻击确认 攻击payload在受害者登录后发送特定WebSocket消息 实现对受害者Facebook账户的完全控制 测试确认在Android设备上有效(iOS未测试) 防御措施 1. 严格的Origin验证 实现精确的Origin白名单机制 禁止接受本地IP地址作为有效Origin 验证完整的域名匹配而非部分匹配 2. 认证机制一致性 确保所有认证路径使用相同机制(随机数或Cookie,但不能混合) 实现明确的认证流程文档和代码审查 3. WebSocket安全增强 4. 其他防御措施 实现WebSocket连接的CSRF令牌保护 对敏感操作要求二次认证 限制WebSocket连接的功能范围 记录和监控异常的WebSocket连接尝试 漏洞处理时间线 2019.12.10 :漏洞初次报告 2019.12.10 :Facebook确认漏洞有效性 2019.12.17 :Facebook完成漏洞修复 2020.1.2 :发放$12,500漏洞赏金 总结 跨站WebSocket Hijacking是一种严重的安全威胁,特别是在混合认证机制和不严格的Origin验证条件下。开发人员应当: 对所有WebSocket连接实施严格的Origin验证 避免混合使用不同的认证机制 对敏感操作实施额外的保护措施 在预发布阶段进行充分的安全测试 通过实施这些措施,可以有效防止类似CSWSH漏洞的利用,保护用户账户安全。