「我们以为调了杀毒接口就安全了,结果病毒文件大摇大摆穿了过去。」一位后端工程师的吐槽,揭开了Node.js生态里一个沉默的漏洞。
坑在哪:流式传输的盲区
![]()
ClamAV是开源杀毒的事实标准,Node.js开发者常用clamdjs这类封装库。问题出在大多数人直接传文件路径——ClamAV扫描的是本地磁盘文件,但现代应用多是流式上传:用户传文件→内存缓存→转存云端。路径传过去,扫的是临时文件或空句柄,真正的病毒 payload 早溜了。
![]()
为什么普遍中招
官方示例代码就是坑。npm下载量最高的几个ClamAV库,README里的demo清一色是fs.readFileSync + 传路径。开发者复制粘贴,上线即埋雷。更讽刺的是,单元测试能过——因为测试用的就是本地文件,和生产环境完全两码事。
正确姿势是什么
![]()
必须用流式扫描接口。ClamAV协议支持INSTREAM指令,直接把内存中的文件流传过去,不落地磁盘。但这对库的封装要求更高,需要手动处理TCP分片和响应解析,多数开发者嫌麻烦,或者根本不知道这个选项存在。
这个bug的残酷在于:安全功能看起来正常运行,日志里甚至有"扫描完成"的记录,实际上什么都没扫到。直到某天生产环境爆出木马,复盘时才发现接口返回的永远是"clean"。
Node.js生态的便利是把双刃剑——封装越彻底,底层细节越容易被忽略。当"能跑就行"成为默认心态,安全就成了薛定谔的猫。你的文件上传接口,真的扫了吗?
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.