「我们以为调了杀毒接口就安全了,结果病毒文件大摇大摆穿了过去。」一位后端工程师的吐槽,揭开了Node.js生态里一个沉默的漏洞。

坑在哪:流式传输的盲区

打开网易新闻 查看精彩图片

ClamAV是开源杀毒的事实标准,Node.js开发者常用clamdjs这类封装库。问题出在大多数人直接传文件路径——ClamAV扫描的是本地磁盘文件,但现代应用多是流式上传:用户传文件→内存缓存→转存云端。路径传过去,扫的是临时文件或空句柄,真正的病毒 payload 早溜了。

打开网易新闻 查看精彩图片

为什么普遍中招

官方示例代码就是坑。npm下载量最高的几个ClamAV库,README里的demo清一色是fs.readFileSync + 传路径。开发者复制粘贴,上线即埋雷。更讽刺的是,单元测试能过——因为测试用的就是本地文件,和生产环境完全两码事。

正确姿势是什么

打开网易新闻 查看精彩图片

必须用流式扫描接口。ClamAV协议支持INSTREAM指令,直接把内存中的文件流传过去,不落地磁盘。但这对库的封装要求更高,需要手动处理TCP分片和响应解析,多数开发者嫌麻烦,或者根本不知道这个选项存在。

这个bug的残酷在于:安全功能看起来正常运行,日志里甚至有"扫描完成"的记录,实际上什么都没扫到。直到某天生产环境爆出木马,复盘时才发现接口返回的永远是"clean"。

Node.js生态的便利是把双刃剑——封装越彻底,底层细节越容易被忽略。当"能跑就行"成为默认心态,安全就成了薛定谔的猫。你的文件上传接口,真的扫了吗?