NuGet 包注册表中发现了一起复杂的供应链攻击,攻击者以 shanhai666 为别名发布了九个恶意包,旨在针对数据库应用程序和工业控制系统执行破坏性、延时触发的有效载荷。Socket 威胁研究团队识别了这些包,它们于 2023 年至 2024 年间发布,累计下载量达 9,488 次。
该攻击活动中的每个恶意包几乎都提供了其宣传的全部功能,将正常代码与隐藏的破坏代码混合。Socket 的分析显示,99% 的代码库是合法的,实现了存储库(Repository)、工作单元(Unit of Work)和 ORM 反射映射等知名企业级设计模式。
“这些合法功能有多重目的:通过包的实际效果建立信任;在代码审查中让审核者看到熟悉的模式和真实实现;提供实际价值以鼓励采用;将约 20 行的恶意有效载荷隐藏在数千行合法代码中;并延迟被发现的时间。”
其结果是,这些包看似专业、功能正常且可靠——直到它们突然自我销毁或悄悄破坏数据完整性。
该攻击活动的技术核心是扩展方法注入模式,攻击者利用 C# 扩展方法将恶意逻辑注入现有 API。
“恶意软件利用 C# 扩展方法,将恶意逻辑透明地注入到每一次数据库和 PLC 操作中,”Socket 解释道。“扩展方法允许开发者在不修改原始代码的情况下为现有类型添加新方法——这一强大的 C# 特性被威胁行为者武器化以实现拦截。”
所有恶意包中都添加了两个方法:用于数据库操作的 .Exec() 和用于 PLC 通信的 .BeginTran()。这些方法看似无害,但包含条件触发器,可根据特定日期和概率终止应用程序或损坏数据。
Socket 研究人员发现,大多数恶意包包含硬编码的触发日期——例如 2027 年 8 月 8 日和 2028 年 11 月 29 日——之后它们开始随机终止宿主进程。
“每次应用程序执行数据库查询或 PLC 操作时,这些扩展方法会自动执行……触发日期过后,恶意软件生成一个 1 到 100 之间的随机数。如果数字超过 80(即 20% 的概率),恶意软件会调用 Process.GetCurrentProcess().Kill(),立即终止整个应用程序。”
尽管 20% 的触发率看似较低,但 Socket 指出,每分钟执行数百次数据库调用的应用程序一旦满足日期条件,几乎会立即崩溃。对于高吞吐量系统,这意味着几秒钟内服务完全中断。
“每小时执行数百次查询的生产应用程序将在几秒钟内崩溃,”报告警告称。
“电子商务(100 次查询/分钟):约 3 秒 → 结账中断
医疗保健(50 次查询/分钟):约 6 秒 → 关键系统 outage
金融(500 次查询/分钟):<1 秒 → 平台完全故障
制造业(10 次操作/分钟,Sharp7Extend):约 30 秒 → 生产崩溃 + 80% 静默写入失败,危及安全系统”
最复杂的包 Sharp7Extend 专门针对工业自动化系统,模仿西门子 S7 可编程逻辑控制器(PLC)的合法 .NET 库。
“Sharp7Extend 包专门针对合法 Sharp7 库的用户……通过在受信任的 Sharp7 名称后附加‘Extend’,威胁行为者利用了搜索 Sharp7 扩展或增强功能的开发者。”
为隐藏恶意意图,Sharp7Extend 将真实的 Sharp7 库(版本 1.1.79)与其恶意代码捆绑在一起。这确保所有标准 PLC 通信在测试期间完全正常工作,而隐藏的扩展则悄悄准备发起攻击。
Socket 在 Sharp7Extend 中识别出两种破坏机制:
- 随机进程终止:在 2028 年 6 月 6 日之前,每次 PLC 连接时有 20% 的概率终止进程。
- 静默数据损坏:经过 30–90 分钟的宽限期后,该包开始导致 80% 的写入操作静默失败。
这种两阶段破坏使调试极其困难。初期崩溃看似随机,后续数据损坏则表现为“硬件故障”,使恶意软件能在生产环境中长期潜伏而不被发现。
为提高采用率,shanhai666 攻击者还在九个恶意包之外发布了三个合法包,以在 NuGet 上建立可信贡献者的历史记录。
“开发者研究作者时,会发现真实可用的包与恶意包并存,从而降低怀疑,”Socket 指出。“恶意包战略性地针对 .NET 应用中使用的三大数据库提供商——SQL Server、PostgreSQL、SQLite——以及工业控制系统。”
攻击者甚至伪造了 .nuspec 文件的作者字段,在不同包中显示不同名称,以此规避基于声誉的安全扫描。
Socket 已向 NuGet 报告了所有恶意包,NuGet 确认正在调查并着手移除。然而,截至 Socket 发布报告时,这些包仍在注册表中处于活跃状态。








发表评论
您还未登录,请先登录。
登录