Featured image of post 谨慎使用新兴开源软件

谨慎使用新兴开源软件

开源软件可能成为服务器的阿特留斯之踵

语速

最近我在 dify/langchain 上翻车了,得出这个结论。

追溯

大概7个月前,我部署了开源的 dify 到服务器,通过官方的 docker compose 启动了实例。但是最近,由于 Dify 代码节点的沙箱逃逸漏洞(CVE-2025-3466),被 webshell 提权,植入了门罗币挖矿程序。

好在,这次被提权之后,入侵者做的事情不多,并且入侵的是 docker container,损失可控。

CVE-2025-3466 详情

CVE编号: CVE-2025-3466 发布日期: 2025年7月7日 CVSS评分: 9.8 (严重) 影响版本: langgenius/dify 1.1.0 - 1.1.2 修复版本: 1.1.3

漏洞描述: Dify 的代码节点(code node)存在沙箱逃逸漏洞,允许攻击者通过覆盖全局 JavaScript 函数(如 parseInt)来绕过沙箱安全限制,从而以完整 root 权限执行任意代码。

攻击流程:

  1. 攻击者在代码节点的输入中构造恶意 payload
  2. 恶意代码在沙箱限制实施前覆盖全局 JavaScript 函数
  3. 利用被覆盖的函数绕过安全检查
  4. 执行任意命令,获取容器完整控制权
  5. 植入 webshell 后门和门罗币挖矿程序

影响范围:

  • 未经授权访问 secret keys 和 API keys
  • 访问内部网络服务器
  • 在 dify.ai 系统内横向移动
  • 完全接管服务器控制权

相关链接:

从这个角度看,保护服务器安全,几个关键的因素不可少。

个人服务器安全

从安全角度来说,个人服务器有几个事情是一定要做的。第一个事情就是尽可能不要使用密码。例如 ssh 密码。

ssh 密码

必须禁用密码登录。ssh 密码破解起来相对容易,如果密码简单,或者用户自行修改密码,使用了简单的密码,那么服务器就会被入侵。

如果使用 Debian/Linux,那么关闭密码登录和关闭 root 登录是必须的:

使用的软件越少,攻击者的攻击面就越窄。一旦你的服务器上只暴露了 nginx,和 80 端口,22 端口(ssh)都没开,那么攻击者能攻击的面就只有 nginx 相关的内容。

使用 rootless docker

使用容器技术相当于在云服务商的基础上进一步做虚拟化。

使用 rootless docker 可以进一步限制容器的权限,即使容器被攻破,攻击者也无法直接获得宿主机的 root 权限。这是最后一道防线。

限制容器的网络访问

大多数服务并不需要无限制的外网访问权限。合理配置容器的网络策略,限制不必要的网络访问,可以大大降低攻击面。

例如,很多服务只需要访问数据库或者内部服务,根本不需要访问外网。如果容器没有外网访问权限,即使被攻破,攻击者也无法下载挖矿程序或者 C2 服务器进行通信。

如何谨慎使用开源软件

这次事件让我反思,在使用新兴开源软件时需要注意以下几点:

选择成熟的项目

查看项目的 star 数、commit 频率、issue 处理情况。如果一个项目:

  • Star 数很少(少于几百)
  • 最近几个月没有更新
  • 大量未解决的 issue

那么使用这个项目的风险就很高。

审查依赖关系

开源软件往往依赖大量的第三方库。像这次事件中的 Dify 就存在严重的代码节点沙箱逃逸漏洞。在部署前,最好能够:

  1. 查看项目的依赖树
  2. 检查是否有已知漏洞
  3. 定期更新依赖

定期更新和安全扫描

  • 定期检查 CVE 数据库
  • 使用工具如 snyktrivy 进行依赖漏洞扫描
  • 及时更新到修复了漏洞的版本

限制权限

即使你信任某个开源软件,也应该给它最小的权限:

  • 不要给容器 privileged 权限
  • 限制容器的资源使用(CPU、内存)
  • 使用只读文件系统(如果可能)
  • 不要把宿主机的敏感目录挂载到容器中

监控和告警

安全是一个持续的过程,不能仅仅依靠预防。建立完善的监控和告警机制至关重要:

  • 监控系统资源使用情况(CPU、内存、磁盘IO异常可能表明有挖矿程序)
  • 监控网络流量(异常的出站连接)
  • 监控进程列表(异常的进程)
  • 设置日志告警(例如失败的登录尝试)

总结

开源软件为我们提供了巨大的便利,但也带来了安全风险。这次事件虽然损失不大,但给了我一个重要的教训:

不要盲目信任任何软件,尤其是新兴的开源项目。在使用前要多做调查,在使用时要给最小权限,在使用后要持续监控和更新。

服务器安全不是一劳永逸的,而是需要持续关注和维护的。