威胁情报:NOFX AI 自动交易漏洞分析

  • slowmist
  • 发布于 2025-11-18 19:54
  • 阅读 14

NOFX AI 是一个开源的加密货币期货自动交易系统,存在安全漏洞。旧版本存在“零认证”漏洞,新版本虽然需要JWT,但默认密钥是硬编码的,攻击者可以利用该密钥获取交易所API密钥和私钥。SlowMist安全团队与Binance和OKX合作,已通知受影响用户并撤销了密钥。

背景

随着由大型AI模型驱动的真实世界交易竞赛持续升温,越来越多的加密社区和开发者正在尝试使用AI驱动的自动化交易,并且大量的开源解决方案正在被迅速采用。然而,这些项目中的许多项目都存在着重大的安全风险。

NOFX AI 是一个构建在 DeepSeek/Qwen AI 上的开源加密货币期货自动化交易系统,支持币安、Hyperliquid 和 Aster DEX 等交易所。SlowMist 安全团队收到了来自 @Endlessss20 的初步举报,他怀疑该系统可能会泄露交易所 API 密钥和其他敏感信息,因此启动了对该项目的安全分析。

开源仓库: https://github.com/NoFxAiOS/nofx

漏洞原因分析

经过 SlowMist 安全团队的深入调查,发现 NOFX AI 在不同的提交版本中存在两个主要的身份验证问题。

“零认证” 漏洞版本

在 2025 年 10 月 31 日,提交 517d0caf6fb091235e56c27889170b53a16e4e6b(包含在 origin/main 和 origin/dev 等分支中)引入了一个“默认管理员模式”。在此次提交中,默认启用管理员模式,并且中间件允许所有请求通过而无需验证。

在 config.json.example:1–24 和数据库迁移脚本中,admin_mode 被设置为 true。读取配置后,main.go:42–63 直接调用 auth.SetAdminMode(true)。

https://github.com/NoFxAiOS/nofx/blob/517d0caf6fb091235e56c27889170b53a16e4e6b/config.json.example

https://github.com/NoFxAiOS/nofx/blob/517d0caf6fb091235e56c27889170b53a16e4e6b/config/database.go#L214

https://github.com/NoFxAiOS/nofx/blob/517d0caf6fb091235e56c27889170b53a16e4e6b/main.go#L42-63

更关键的是,如 api/server.go#L799 所示,只要 auth.IsAdminMode() 返回 true,中间件将立即退出,完全绕过对 Authorization 头的检查。

https://github.com/NoFxAiOS/nofx/blob/517d0caf6fb091235e56c27889170b53a16e4e6b/api/server.go#L799

因此,在此次提交和更早的版本中,只要部署保持默认的管理员模式启用,任何人都可以直接访问 /api/exchanges 并获取所有交易所 API 密钥和私钥。

在这种模式下,所有受身份验证保护的 API 端点(包括 /api/exchanges)都以管理员权限执行。这意味着任何人都可以简单地向 API 发送一个公开的 GET 请求,并检索存储在数据库中的 ExchangeConfig 的完整内容。

ExchangeConfig 字段包括 api_key、secret_key、hyperliquid_wallet_addr 和 aster_private_key — 所有这些都是交易所的登录凭据或私钥。换句话说,在默认管理员模式启用的情况下,任何人都可以直接访问 /api/exchanges 并获取所有交易所 API 密钥和私钥。此提交实际上是通过一个公开可访问的、免登录的 GET 端点暴露了所有交易所凭据。

需要授权的版本

在 2025 年 11 月 5 日的提交 be768d91a3969b39741623c9507f3119e583eb16(PR #540: 在管理员模式下启用管理员密码)中,开发者移除了之前的逻辑,即系统会在检测到 admin_mode 时自动授予访问权限,而无需验证 Authorization 头。

重要的是要注意,此提交目前仅存在于 dev 分支系列中(包括本地 dev 分支和 origin/dev)。origin/main 分支不包含此提交。

authMiddleware 被重写为 api/server.go:1471–1511 中看到的形式,其中需要一个 Authorization: Bearer <token> 头才能访问受保护的路由。如果头部格式不正确或 JWT 验证失败,系统将立即返回 401 响应。

https://github.com/NoFxAiOS/nofx/blob/be768d91a3969b39741623c9507f3119e583eb16/api/server.go#L1471

相同的提交还引入了 /api/admin-login 端点,要求部署者设置环境变量 NOFX_ADMIN_PASSWORD。换句话说,管理员模式不再是“无需登录即可自动启用”。

如果 admin_mode 仍然设置为 true,main.go:203–226 将检查 NOFX_ADMIN_PASSWORD 环境变量,并在未设置该变量时调用 log.Fatalf 立即终止该进程。配置完成后,管理员必须通过将此密码提交到新的 /api/admin-login 端点来获取 JWT。如果在未设置密码的情况下启动服务,则将在初始化期间强制终止。

然而,此更改仅仅是将系统从“完全没有身份验证”升级到“需要 JWT”,仍然无法解决两个核心问题。

首先,config.json.example:1–27 仍然硬编码了 jwt_secret,并且 main.go:203–214 在缺少环境变量时继续回退到此公开已知的字符串。

        jwtSecret = []byte(viper.GetString("jwt_secret"))
        if string(jwtSecret) == "" {
            jwtSecret = []byte("THIS_IS_A_PLACEHOLDER_JWT_SECRET_CHANGE_ME")
            log.Println("jwt_secret is not set, using default jwt_secret. please change it in production environment.")
        }

如果开发者直接使用示例配置文件,则默认密钥将被激活,从而产生安全风险。此外,该项目的默认部署脚本 start.sh 会在检测到缺少设置时复制示例配置文件,这进一步导致默认密钥在生产中使用。

其次,/api/exchanges 仍然以原始 JSON 格式直接返回敏感字段 — 例如 api_key、secret_key 和 Aster 私钥。

因此,尽管此版本需要 Authorization 才能访问 /api/exchanges,但攻击者仍然可以使用默认密钥生成有效的 JWT,或者通过默认登录界面获取Token。有了该Token,攻击者就可以读取所有存储的密钥。

硬编码的 JWT 问题在当前版本中仍然存在

截至目前(2025 年 11 月 13 日左右),dev 分支的 HEAD 是提交 b2e4be91523dc606be8708ec6602fecbbb0c20ea(PR #546: “Feature/faq”)。在 SlowMist 安全团队检出此提交并验证了实现后,确认了以下问题:

  • authMiddleware 仍然如 api/server.go:1471–1511 所示实现,仍然需要 Bearer Token。
  • /api/exchanges 继续直接返回完整的 ExchangeConfig (api/server.go:1009–1021)。
  • config.json.example:1–27 和 main.go:198–226 仍然硬编码 admin_mode=true 和默认的 jwt_secret。

因此,只要操作员不手动更改 jwt_secret 并禁用管理员模式,攻击者仍然可以使用公开已知的密钥生成有效的、固定的 JWT,然后访问 /api/exchanges 以获取所有交易所 API 密钥和私钥。

换句话说,2025–11–05 引入的修复只是将漏洞从零认证更改为使用默认密钥进行身份验证。根本问题仍然未解决。

影响

根据该程序的特性,我们在整个互联网上进行的调查发现了超过 1,000 个可公开访问的该系统部署,这些部署已经私有化并暴露在开放的互联网上。

SlowMist 安全团队意识到攻击可能随时发生。我们立即评估了所有可能的安全措施,并最终决定联系币安和 OKX 安全团队。SlowMist、币安和 OKX 共同成立了一个联合安全工作组。SlowMist 提供了情报和影响评估,而币安和 OKX 安全团队则独立进行了交叉验证。使用获得的 API 密钥,他们从系统级别追溯到识别受影响的用户,通知他们安全风险,并确保他们及时更换了 API 密钥、secret key 和其他凭据。这防止了潜在的通过刷量交易攻击造成的损失,并保护了用户资产。

截至 11 月 17 日,所有受影响的 CEX 用户都已收到通知,并且其受损的密钥已被撤销。用户资产现在处于安全状态。

对于少数 Aster 和 Hyperliquid 用户,SlowMist 和币安已尝试主动联系。但是,由于这些地址属于去中心化钱包用户,我们无法直接联系他们。如果你正在 Aster 或 Hyperliquid 上使用自动化交易系统,请尽快检查并减轻相关风险。

同时,我们将向 NOFX AI 团队传达此漏洞的详细信息,并提供补救建议,以帮助他们增强系统安全性。

总结与建议

AI 驱动的量化项目目前非常受欢迎,但大多数开源实现仍处于早期阶段。在部署此类新兴开源系统时,必须进行彻底的代码安全审计,并加强风险控制措施,以防止财务损失。

根据以上分析,尽管 NOFX 项目已经进行了尝试性的修复,但核心问题仍然未解决。任何在提交 517d0caf 或更早版本(origin/main 当前仍处于此版本)上部署的 NOFX 都在“无需授权”的状态下运行。这些部署必须立即升级或手动禁用管理员模式。

即使升级到 be768d9 或当前 HEAD,如果继续使用默认的 jwt_secret,攻击者仍然可以通过创建固定的 Authorization 头来获取密钥。为了完全修复此漏洞,必须实施以下措施:

  1. 随机化 JWT 密钥:如果 jwt_secret 与启动时的模板匹配,则拒绝运行。建议将密钥存储在安全存储或密钥管理系统中。

  2. 禁用默认管理员模式:只有在明确配置时才应允许管理员模式,并且必须需要强密码加上 OTP。当不处于管理员模式时,应禁用 /api/admin-login 端点。

  3. 最小化 /api/exchanges 响应:默认情况下,只应返回非敏感字段,例如启用状态或测试网标志。导出 API 密钥或私钥必须需要一个单独的接口,并进行二次验证,并且服务器应屏蔽或加密敏感字段。

在开发团队实施这些修复之前,任何暴露在公共互联网上的部署都应被视为高风险。特别是,origin/main 仍然处于提交 517d0c(“零认证”)的状态,因此维护人员必须立即同步到最新代码,并严格执行自定义密钥和接口加固策略。

致谢

再次感谢 @Endlessss20 提供的情报来源!

关于 SlowMist

SlowMist 是一家专注于区块链安全的情报公司,成立于 2018 年 1 月。该公司由一个拥有超过十年网络安全经验的团队发起,旨在成为全球性的力量。我们的目标是使区块链生态系统对每个人都尽可能安全。我们现在是一家著名的国际区块链安全公司,曾与 HashKey Exchange、OSL、MEEX、BGE、BTCBOX、Bitget、BHEX.SG、OKX、Binance、HTX、Amber Group、Crypto.com 等多家知名项目合作。

SlowMist 提供各种服务,包括但不限于安全审计、威胁信息、防御部署、安全顾问和其他安全相关服务。我们还提供 AML(反洗钱)软件、MistEye(安全监控)、SlowMist Hacked(加密黑客档案)、FireWall.x(智能合约防火墙)和其他 SaaS 产品。我们与国内外公司建立了合作伙伴关系,如 Akamai、BitDefender、RC²、TianJi Partners、IPIP 等。我们在加密货币犯罪调查方面的大量工作已被国际组织和政府机构引用,包括联合国安全理事会和联合国毒品和犯罪问题办公室。

通过提供为各个项目定制的全面安全解决方案,我们可以识别风险并防止它们发生。我们的团队能够发现并发布多个高风险区块链安全漏洞。通过这样做,我们可以传播意识并提高区块链生态系统中的安全标准。

  • 原文链接: slowmist.medium.com/thre...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
slowmist
slowmist
江湖只有他的大名,没有他的介绍。