V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
deepbytes
V2EX  ›  信息安全

昨晚亲历 qix 开发者账号泄露导致 NPM 超大规模投毒事件

  •  1
     
  •   deepbytes · 21 小时 34 分钟前 · 7034 次点击

    NPM 仓库中多个周下载量超千万的热门组件被投毒,这些组件均为 qix 开发者发布,可能由于其凭证泄漏导致账号被窃取。

    昨晚睡前就在 x 上看到各种信息了:

    受影响投毒组件被植入恶意的混淆代码 index.js 文件,该恶意代码会劫持浏览器钱包(如 MetaMask )和网络请求( fetch 和 XMLHttpRequest ),拦截 ETH 、BTC 、SOL 、TRX 等加密货币交易,通过替换目标地址将资金转移至攻击者钱包(如 0xFc4a4858bafef54D1b1d7697bfb5c52F4c166976 )

    混淆后的恶意代码 index.js:

    攻击非常有针对性,是针对 web3 相关用户的大规模攻击.这个 javascript payload 不复杂,使用了 obfuscator.io 或者类似的工具。

    这个开发者账号泄密的原因是因为被钓鱼邮件迷惑了,点击了邮件里面的链接,但未验证链接属于正确的官方发布的地址。


    目前 VirusTotal 仍无法检测异常。


    自检:

    
    brew install rg
    
    rg -uu --max-columns=80 --glob '*.js' _0x112fa8 
    
    

    参考 hacker news: https://www.aikido.dev/blog/npm-debug-and-chalk-packages-compromised


    提醒,以后这种邮件里面的 login ,如果有 pasaword 管理工具,可以自动对比域名,不对的域名不会显示自动填充的下拉框的! v 友还有啥 tips ,都可以提一下,这些依赖用的人太多了!

    第 1 条附言  ·  20 小时 40 分钟前
    https://jdstaerk.substack.com/p/we-just-found-malicious-code-in-the

    这是一个更加详尽的事件追踪,有兴趣的可以关注。有技术的佬,你们的目标是星辰大海!
    第 2 条附言  ·  19 小时 57 分钟前
    转自 x@ohyishi
    npm 维护者 qix 被精准社工,点了伪造的 2fa 重置邮件导致权限泄露。攻击者随后用他的账号发了带后门的新版本,中招的包括 chalk 、debug 这种顶级基础库。

    这次攻击影响面很大。

    首先隐蔽性强。前半段保留正常功能,不会立即报错。payload 做了混淆,静态审计也很难发现。黑客甚至 hook 了 fetch 、XMLHttpRequest 、ethereum.request ,连调试工具都能被骗。

    其次攻击效果很致命。地址替换不是随便乱换,而是用 levenshtein 距离算出最接近的攻击者地址,用户肉眼几乎分辨不出。它还专门适配了 dex 路由器,大部分 swap 都可能被劫持;返回的还是伪造的成功响应,开发者和用户都会以为交易没问题,其实资金早被转走了。
    要不是硬件钱包在最后一跳能二次确认,很多人可能根本不知道钱是怎么没的。

    ——
    这里就看出,硬件钱包的兜底安全保障了,准备入手一个,有佬推荐么
    57 条回复    2025-09-10 02:56:42 +08:00
    kitty7030
        1
    kitty7030  
       21 小时 18 分钟前
    浏览器钱包 这么容易被劫持吗
    kyokaka
        2
    kyokaka  
       21 小时 14 分钟前
    针对开发者的钓鱼和水坑攻击效率太高了
    Mithril
        3
    Mithril  
       21 小时 8 分钟前   ❤️ 1
    @kyokaka 主要是 NPM ,或者说 JS 的包依赖关系过于复杂,导致这种供应链攻击防不胜防。

    前端生态就是这样,依赖树越复杂,某个节点被干掉的概率就越高,你换什么包管理都没办法。
    ybz
        4
    ybz  
       21 小时 7 分钟前
    这种投毒相当于人家直接在你程序里面写代码了,再加上 js 方法属性随便替换的,劫持可太容易了。
    stinkytofux
        5
    stinkytofux  
       21 小时 5 分钟前   ❤️ 1
    @kitty7030 #1 浏览器插件是我比较担心的地方, 我不确定是不是真的能被劫持, 尤其是 Bitwarden 插件, 上面记录的不仅仅有密码, 还有我的各种命根子.
    belin520
        6
    belin520  
       21 小时 2 分钟前
    扫码登录
    lisongeee
        7
    lisongeee  
       21 小时 2 分钟前   ❤️ 1
    《这个开发者账号泄密的原因是因为被钓鱼邮件迷惑了,点击了邮件里面的链接》

    点进链接也没事,肯定是点击链接之后再输入了密码之类
    deepbytes
        8
    deepbytes  
    OP
       20 小时 56 分钟前
    @lisongeee 主要还是安全意识的问题,不要有侥幸心理
    deepbytes
        9
    deepbytes  
    OP
       20 小时 48 分钟前
    @kyokaka 企业管理开源组件也是任重道远
    crocoBaby
        10
    crocoBaby  
       20 小时 41 分钟前
    又学到一个财务自由小技巧
    Meteora626
        11
    Meteora626  
       20 小时 39 分钟前
    @kitty7030 我的小狐狸钱包啥都没干,电脑上都没助记词 0 。3eth 不知道咋就没了
    jaff
        12
    jaff  
       20 小时 37 分钟前
    使用 JS 生态来开发原生应用就是个笑话啊,这应该不是第一次了。
    MyBules
        13
    MyBules  
       20 小时 31 分钟前   ❤️ 1
    这个攻击手段,像我之前遇到的粘贴板病毒,也是替换目标钱包地址。https://joessem.com/archives/paste-virus.html
    deepbytes
        14
    deepbytes  
    OP
       20 小时 27 分钟前   ❤️ 1
    @MyBules !我也遇到过,导致后面每次操作都怀疑会不会有其他的 0day 存在,都谨慎一些,对比确认后再点转账按钮!
    这就是人教人教不会,事教人一次就行
    levelworm
        15
    levelworm  
       20 小时 22 分钟前   ❤️ 1
    @deepbytes #14
    这些小玩意很有意思啊,顿时觉得学习 Windows 系统编程有动力了!
    newaccount
        16
    newaccount  
       20 小时 19 分钟前   ❤️ 2
    想把这转给公司的傻逼经理们看看
    时不时想让人解决钓鱼邮件的问题
    我特么要是能解决的了还在这受你这份憋屈气!
    deepbytes
        17
    deepbytes  
    OP
       20 小时 18 分钟前 via iPhone
    Stay safe:
    ✓ Verify recipient/amount on wallet screen
    ✓ Check if addresses change after pasting
    ✓ Review recent transactions
    ✓ Use hardware wallets for high-value ops
    以上,共勉! web3 迷雾重重,佬们护好钱袋子!
    dcsuibian
        18
    dcsuibian  
       20 小时 16 分钟前   ❤️ 2
    所以说 npm 实在是垃圾中的垃圾
    看看谁都踩一脚的 Java 。Maven 的设计实在是好了不止一个次元。maven central 发布包要审核,不能 unpublish 已有的包,gav 命名空间隔离,也不搞什么没用的语义化版本控制。
    真搞不懂前端怎么抄都不会抄
    deplives
        19
    deplives  
       20 小时 15 分钟前
    前端真有意思,要么 npm 上传武林外传,要么 npm 投毒
    darksword21
        20
    darksword21  
    PRO
       19 小时 47 分钟前
    前端真有意思,要么 npm 上传武林外传,要么 npm 投毒
    billlee
        21
    billlee  
       19 小时 35 分钟前
    没理解你说的硬件钱包是怎么兜底这个问题的?既然产生了肉眼几乎分辨不了的地址,那硬件钱包就算专门弄个屏幕显示出来交易信息,用户也还是会批准啊?
    deepbytes
        22
    deepbytes  
    OP
       19 小时 19 分钟前 via iPhone
    @billlee 由于地址很长,可以重点核对地址的开头 4-6 位和结尾 4-6 位。这次攻击虽然能生成视觉上相似的地址,但在逐字符比对下,差异是绝对存在的…

    硬件钱包,它在被恶意控制的电脑环境之外,提供了一个可信的“信息安全岛”。它给了用户一个机会,在资产离手前的最后一刻,看到这笔交易未经篡改的交易信息。

    anyway ,信任硬件钱包,不信任浏览器网页的显示、插件的显示。最终点击前,自己在硬件钱包确认,😑,终究还得提高安全意识
    wzy44944
        23
    wzy44944  
       19 小时 2 分钟前
    好奇这个开发者是如何自证清白的?毕竟这种攻击要提前做大量准备,而且攻击范围有限,只能攻击开发者,要是没有人被成功钓鱼,前期准备就都没用了,代价很大。
    Ghostisbored
        24
    Ghostisbored  
       18 小时 55 分钟前
    我怎么觉得每年 npm 都会有投毒事件 还不能有效避免
    softlight
        25
    softlight  
       18 小时 53 分钟前
    这种攻击时直接访问网站就会被劫持么
    latifrons
        26
    latifrons  
       18 小时 52 分钟前   ❤️ 2
    还是 Go 的包管理好,全源代码透明,没有人看不懂的东西在当中作梗。
    guoooo00oohao
        27
    guoooo00oohao  
       18 小时 50 分钟前
    赞同前面人的观点,js 真的可读性不好。包含好自己的资产,远离浏览器钱包生态。
    deepbytes
        28
    deepbytes  
    OP
       18 小时 46 分钟前
    @wzy44944 可以了解下这个开发者,不过也有 XZ Utils 后门事件 (2024 年),还有经典的 event-stream 恶意代码事件 (2018 年)先例
    deepbytes
        29
    deepbytes  
    OP
       18 小时 43 分钟前
    @softlight 访问用了这些依赖的网站就会被劫持,但你的资金损失是仅在你使用浏览器的插件进行交易时才发生
    jiangzm
        30
    jiangzm  
       18 小时 30 分钟前
    npm 经常出这种投毒就是因为依赖关系复杂和碎片化, 要解决这个问题首先官方或者联盟提供基础库,另外给 NPM 包加信任标签,这样就能减少间接引用不信任的包。
    BaiLinfeng
        31
    BaiLinfeng  
       17 小时 54 分钟前
    啥叫浏览器钱包哦
    Seck
        32
    Seck  
       17 小时 41 分钟前 via Android
    @jiangzm 是的,我记得好像发生好几次了,NPM 投毒,而且套路好像都一样!
    aloxaf
        33
    aloxaf  
       17 小时 25 分钟前
    @billlee 硬件钱包至少还有机会,但不用硬件钱包的话,由于前端已经被劫持了,你完全没有机会发现问题。

    而且我不相信真的能达到「肉眼不可分辨」的地步,顶天碰撞了前后几位。
    zazzaz
        34
    zazzaz  
       17 小时 13 分钟前
    没必要神化硬件钱包,现在讨论的这个攻击场景硬件钱包哪怕是指纹识别也是防不住的。

    唯一有用的方式是上链请求发出之前人工仔细检查合约地址的每一个字是不是一致,但一次两次还行,多了肯定会偷懒的
    coolcoffee
        35
    coolcoffee  
       17 小时 4 分钟前
    太恐怖了,现在 1password 的界面也是 electron 写的,如果哪天也被这个供应链攻击那就丸辣。
    deepbytes
        36
    deepbytes  
    OP
       17 小时 3 分钟前
    @zazzaz 说的对。
    人,才是最大的漏洞🤡----> 安全意识的重要性
    deepbytes
        37
    deepbytes  
    OP
       16 小时 53 分钟前
    @coolcoffee 佬多虑了,这种级别的大公司,更新都是有严格控制的,electron 也有最佳安全实践,理论上的可能性不等于现实中的高概率。正是因为他们知道自己是最高价值的目标,所以他们投入了业界最高级别的资源和流程来确保这条攻击路径被层层设防、几乎无法走通。
    AkinoKaedeChan
        38
    AkinoKaedeChan  
       16 小时 47 分钟前   ❤️ 1
    Safepal 有个注册花 5 USDC 送硬件钱包的,属于能用级别,就是那个服务要 KYC 。
    bigtear
        39
    bigtear  
       16 小时 44 分钟前
    @stinkytofux bitwarden 浏览器插件应该是解锁插件动态解密的,没有保存明文,设置一个短一点的自动锁定时间就行了
    bigtear
        40
    bigtear  
       16 小时 42 分钟前
    @stinkytofux 至于如果是官方版本被源码级别劫持,那谁都没办法
    stinkytofux
        41
    stinkytofux  
       16 小时 42 分钟前
    @bigtear #39 锁定超级麻烦, 用的时候还要解锁, 我一般都是重启浏览器才锁定. 平时一直解锁.
    bigtear
        42
    bigtear  
       16 小时 41 分钟前
    @stinkytofux #41 pin 啊,我一直设定的一个 pin 码解锁,还挺方便的,毕竟安全点
    wobuhuicode
        43
    wobuhuicode  
       16 小时 35 分钟前
    硬件钱包之前就出过事故了,你以为在里面安全生成的私钥,早就给人记录好的。
    deepbytes
        44
    deepbytes  
    OP
       16 小时 23 分钟前 via iPhone
    @wobuhuicode 佬,有更好的办法么?
    yurenfeijing
        45
    yurenfeijing  
       15 小时 43 分钟前
    @deepbytes #29 除非是浏览器的插件用了这些被投毒的依赖,不然只访问网页,怎么可能读到插件钱包的数据呢。插件能劫持网页的接口,反过来如果网页被投毒了,没法检测插件的接口吧
    nkidgm
        46
    nkidgm  
       15 小时 12 分钟前   ❤️ 1
    @deepbytes 开源钱包,把经典版本的源码下载下来,自己编译
    deepbytes
        47
    deepbytes  
    OP
       15 小时 10 分钟前
    @yurenfeijing 可以了解一下 window.ethereum 对象。
    ---
    理解这个攻击场景的原理:
    1 、攻击者没有攻破浏览器的沙箱,也没有读取插件钱包的任何内部数据。
    2 、只是在网页自己的地盘上,利用了网页与钱包之间必须存在的、公开的通信接口,进行了一次中间人攻击。它污染的是即将发送给钱包的数据,而不是钱包本身。
    3 、网页被投毒后,它不是去“检测”插件,而是去“欺骗”插件。它给插件提供的是伪造的交易请求,而插件本身无法分辨这份请求在到达它之前是否已经被篡改过
    duuu
        48
    duuu  
       15 小时 5 分钟前
    意思是交易的时候,把钱包要转账的地址改成了黑客的地址是吗?
    如果我是普通的前端开发者,是不是就不会受影响?
    kerryeva
        49
    kerryeva  
       14 小时 10 分钟前
    trezor ?我用了五六年了,第一带版本
    fr13ncl5
        50
    fr13ncl5  
       13 小时 57 分钟前   ❤️ 1
    @MyBules 我也遇见过,还分析了一下查涉及到的各个币地址流水发现靠这个都赚了七八十万
    sampeng
        51
    sampeng  
       13 小时 48 分钟前 via iPhone
    每年固定节目也是没谁了
    hongweiliuruige
        52
    hongweiliuruige  
       13 小时 29 分钟前
    npm lock 文件轻易不要动,升级版本仔细审查,合并冲突认真检查! 然而很少有人或者团队做到,包括很多大公司,无脑升级。。
    latifrons
        53
    latifrons  
       13 小时 5 分钟前   ❤️ 2
    从来没相信过硬件钱包,谁知道里面有什么神奇的 5G 芯片呢。况且就算显示了交易信息,很多基于智能合约的交易内容人根本看不懂,硬件钱包最多也只能解析几种最常见的 ERC20 函数签名( transfer,transferFrom ),对于 DeFi 应用根本防不住。
    所以目前看还是找一台不联网的老安卓手机装一个 AirGap Vault ,自建硬件钱包比较靠谱。
    DefoliationM
        54
    DefoliationM  
       10 小时 46 分钟前 via Android
    @stinkytofux 指纹解锁很方便,碰一下就行了。
    lhwj1988
        55
    lhwj1988  
       7 小时 32 分钟前
    所以当你进入一个网页后,如果域名对不上,那干嘛还要输入账号密码?
    UnluckyNinja
        56
    UnluckyNinja  
       6 小时 40 分钟前
    当某个网站在未先由你交互,主动发来一封邮件:
    - 如果是消息推送,例如新闻、博文、安全事故报告等:OK ,可以点击链接,开启“只读模式”,只看不输入任何内容,不进行任何风险操作
    - 请求用户更新密保 2FA 等,任何需要输入的情况:不要从邮件链接进入相关服务,而是从你的收藏夹或手动输入/浏览器联想进入官方网站或 SNS 帐号,验证官方推送是否确有其事,再继续操作。
    galenzhao
        57
    galenzhao  
       4 小时 13 分钟前
    用硬件 key 登录,避免账号密码问题。。。。
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1176 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 23:10 · PVG 07:10 · LAX 16:10 · JFK 19:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.