在过去几个月里,一款恶意 NPM 软件包就这么不着痕迹地潜伏在成千上万个正规依赖项之中。它看起来人畜无害,甚至运行起来和官方承诺的功能一模一样。而恰恰是这种极具欺骗性的“靠谱”外表,让它变得极其危险。
安全研究人员最近揪出了一款恶意 NPM 软件包。它在前端伪装成一个好用的 WhatsApp 网页版 API 开源库,暗地里却在疯狂蚕食开发者环境中的敏感数据。在神不知鬼不觉之中,它已经把用户的 WhatsApp 聊天记录、登录凭证以及联系人列表偷偷打包运走,期间没有触发任何明显的系统警报。
这个名为
lotusbail 的软件包,在表面上找不到任何破绽或可疑行径。事实上,它直接套壳了一个货真价实的 WhatsApp 客户端核心库,日常调用完全符合正常依赖项的逻辑。在安全团队 Koi Security 顺藤摸瓜将其曝光之前,它的下载量已经悄然突破了
56,000 次。这意味着,它早就成了很多开发者在配置项目时,看都不看就会顺手塞进依赖清单里的那种常规工具。
正是这种低调的成功,让它在 NPM 官方仓库里安稳地躺了将近半年之久。因为它的代码确实能帮开发者办成事,从而完美避开了那些通常会引发代码审计或强制下架的异常警告。
更让人感到后背发凉的是,这起隐私窃取事件的幕后黑手在工程设计上极其缜密。被盗信息在被送往域外之前,都经过了极其复杂的加密和混淆处理。
换句话说,对于已经中招的项目而言,仅仅执行一次简单的
npm uninstall,根本无法抹去它留下的隐患。
乍看之下,
lotusbail 似乎只是某个现有开源工具的一个常见分支。它是直接基于
@whiskeysockets/baileys 构建的,后者是一个在开发者圈子里颇具声望、广受信任的 WhatsApp WebSocket 通信库。一旦在本地部署完毕,所有业务运转都流畅得让人挑不出毛病——消息发送得十分顺畅、接收完全没有延迟,没有任何能让人联想到恶意软件的蛛丝马迹。
这种符合预期的表现,成了它最好的隐身衣。
然而,当研究人员撕开代码的伪装进行深度审计时,才发现这个库根本不是在老老实实地转发请求。它把自己变成了一个透明的“中间人”,直接横插在了整个通信链路的中央。底层的 WhatsApp 客户端被包裹在一个隐蔽的代理层内部,这个代理层像一面镜子,毫无遗漏地复刻了流经它的一切数据——包括关键的身份验证步骤和日常的聊天流量。
当用户尝试扫码登录时,这个代理层会立马截获会话密钥和认证令牌;当一条条消息在应用内部流转时,它们在半路就被克隆、记录并存入了等待导出的缓存区。从开发者的视角来看,业务没有出现任何报错;而从攻击者的视角来看,所有有价值的隐私数据已经悉数落袋。 八哥电影网
为了防止被网络安全设备拦截,数据偷渡的手段也经过了精雕细琢。攻击者没有采用大喇喇的明文传输,而是把偷来的信息进行了二次加工。通过将自定义的 RSA 加密算法与大范围的代码混淆技术相结合,这股外流的数据流量完美地混进了日常正规的网络请求之中,让传统的流量监控手段瞬间抓瞎。
安全团队还指出,甚至连接收脏数据的目标服务器都被藏得很深。它没有直接把 IP 地址或域名大大方方地写在源码里,而是将其塞进了加密的配置文件和压缩后的数据载荷中。通过 Unicode 字符变形、数据压缩、编码转换以及多层嵌套加密,整套幕后基础设施在面对常规的浅层代码审查时,几乎可以做到完美隐形。
不得不承认,这绝不是什么粗制滥造的恶作剧脚本。这是一场精心策划、专门为了在光天化日之下藏身而打造的供应链渗透。
这起事件真正拉开与其他常规恶意软件差距的地方,不在于它偷了多少数据,而在于 哪怕它被发现了,攻击者依然有办法在受害者的账户里赖着不走。
根据 Koi Security 的深度报告,
lotusbail 并不完全依赖于这个 NPM 包在本地的留存来维持访问权限。相反,它钻了 WhatsApp 官方为了方便用户而设计的一个核心功能的空子:
多设备联动(Multi-device Linking)。在日常使用中,用户可以通过一个简短的配对码,把自己的账号关联到电脑或平板等其他设备上。而这个恶意软件包,在暗地里粗暴地滥用了这个流程。
在它的核心代码深处,硬编码了一段自动配对的暗号。只要你的项目跑起来,它就会在后台自动把一台由攻击者控制的远程设备,注册成为受害者 WhatsApp 账号的“受信设备”。从这一秒开始,攻击者就彻底摆脱了对受害者本地开发环境的依赖。
此后,即便开发者察觉到了异样,把这个 NPM 包彻底删掉,甚至把整个本地项目翻箱倒柜地清理干净,实质性的伤害也已经造成了。攻击者的设备早就作为“合法分身”完成了绑定,并拿到了长期有效的官方授权。想要收回这个权限,唯一的办法是用户必须掏出手机,打开 WhatsApp 的设置界面,手动去核对并强行踢掉那台陌生的关联设备。
这种极难被察觉的持久化潜伏,给了幕后黑手长期窥探的上帝视角。在初始的开发环境风波过去几周甚至几个月后,他们依然可以好整以暇地阅读你的私密对话、拉取你的完整联系人名单、下载你传输的各种机密文件,甚至还能冒充受害者的身份去给别人发消息。 天堂电影网
对于企业而言,这个工程细节直接把一个原本普通的供应链安全事件,升级成了一场严重的合规灾难。威胁并没有随着代码的卸载而终结,除非受影响的账户在平台层面上被执行了定点清洗,否则漏洞就一直形同虚设。
这起事件给我们上了一堂非常沉重的安全课:那些我们平时深信不疑的“安全常识”,面对这种降维打击时几乎全线失灵。
开源社区的星标数量、下载量数据、发布时间的长短,甚至基础的静态代码扫描,在这场风波里全数哑火。原因简单得有些残酷——因为它的代码确实能跑通业务。正如安全团队所言,真正的危险往往滋生在“能用”和“清白”之间的灰色地带。一个依赖包实现了它在 README 里承诺的功能,并不代表它 只做了承诺里的事情。当恶意的触角被严丝合缝地缝合在正规的功能行为之上时,浮于表面的常规检查根本提供不了多少保护。
这也意味着,过去那种“一键安装、终身信任”的粗放式开发习惯,在当下必须被无情地抛弃了。面对现代供应链层面的安全暗礁,我们急需将视线投向 运行时的行为监控(Runtime Behavior Monitoring),而不是仅仅盯着静态的代码快照。开发者和防守方必须把鹰一样的眼睛盯在软件包“跑起来之后”的一举一动上——尤其是当这个包恰好卡在身份验证、即时通讯或核心用户数据的必经之路上时。
此外,代码里的一些技术反常现象也应该引起我们足够的警惕。比如,一个简简单单的辅助工具库,底层却莫名其妙地塞进了一大堆没有必要的密码学组件、完全自研的加密实现、极其反常的代码混淆,或者是攻击性极强的反调试技术。这些反常的肌肉线条虽然不能和“搞破坏”直接画等号,但绝对值得你拉响警报、把代码翻个底朝天。
更让人有些无奈的是,直到相关的安全报告已经满天飞的今天,这个包依然在 NPM 官方仓库里公开挂着,甚至在前几天还施施然地发布了一个更新版本。尽管 NPM 早在 2020 年就已经被 GitHub 收入麾下,但截至目前,官方似乎还没有给出雷厉风行的公开回应,来说明究竟何时会对这个毒瘤执行全网下架。
大环境如此,开发者只能展开自救。这起事件把一个事实赤裸裸地摆在了所有人面前:社区里那些口耳相传的“信任背书”已经开始贬值了。想要让自己的项目足够干净,未来的依赖管理就必须引入长期的行为审计、收紧不必要的权限边界,并且时刻保持一种合理的怀疑——哪怕对方是一个看起来非常火爆、有几万人都在用的明星开源包。尤其是当它正掐着你和用户隐私之间的咽喉要道时。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/414414/viewspace-3172411/ ,如需转载,请注明出处,否则将追究法律责任。