导航

[业内新闻动态] [【转载】] 恶意 NuGet 包攻击 ASP.NET 开发人员以窃取登录凭据

#1
1243.jpg

针对 ASP.NET 开发人员的供应链攻击已经出现,该攻击涉及四个恶意 NuGet 包,旨在窃取登录凭据并在 Web 应用程序中植入持久后门。

这些软件包——NCryptYo、DOMOAuth2_、IRAOAuth2.0 和 SimpleWriter_——由用户名为“hamzazaheer”的威胁行为者于 2024 年 8 月 12 日至 21 日期间发布,它们累计下载量已超过 4,500 次。

攻击始于蓄意欺骗。NCryptYo 通过抢注广泛使用的 NCrypto 软件包的域名,将自己伪装成一个密码学库。

其 DLL 文件名 NCrypt.dll 模仿了 Windows 的原生 CNG 加密提供程序,其命名空间与 Microsoft 自己的加密 API 相对应。

关键在于,该软件包会在程序集加载时立即触发一个静态构造函数——在任何开发人员调用任何方法之前——在本地主机端口 7152 上静默部署一个隐藏的代理,该代理会将流量转发到外部的、由攻击者控制的服务器。

Socket.dev 的研究人员通过追踪所有四个软件包中的共享基础设施,确定了整个攻击活动。

他们注意到 DOMOAuth2_、IRAOAuth2.0 和 SimpleWriter_ 都包含一个字节相同的硬编码身份验证令牌,该令牌使用 GZip 压缩和自定义 Base64 替换进行编码,这证实了它们是由同一操作员构建的。

VirusTotal 分析显示,72 家安全厂商中只有 1 家标记了 NCrypt.dll,这表明混淆技术能够有效地使恶意软件躲避标准检测工具的检测。

1243.jpg

一旦激活,DOMOAuth2_ 和 IRAOAuth2.0 会静默地收集 ASP.NET Identity 数据(用户帐户 ID、角色分配和权限映射),并通过本地代理将其路由到攻击者的服务器。

SimpleWriter_伪装成PDF转换工具,将攻击者控制的文件写入磁盘,并在不显示任何窗口的情况下运行隐藏进程。其真正目标不仅是开发人员的工作站,而是他们最终部署给最终用户的每一个生产应用程序。

JIT 钩子:核心感染机制
NCryptYo 使用一种称为 JIT 编译器劫持的技术来隐藏其真实行为,使其不被安全扫描器检测到。

.NET 运行时通常会在方法运行之前对其进行编译;此包用自己的钩子替换了该过程,因此恶意代码仅在执行时解密——使其对静态分析不可见。

该 DLL 受 .NET Reactor 混淆保护,并配有 14 天过期计时器和反调试检查。

内部嵌入了五个加密资源,其中最大的是一个 126 KB 的有效载荷,负责构建到攻击者外部服务器的隐藏代理隧道。

开发者在安装任何第三方库之前,应核实软件包名称、作者身份和下载历史记录,并注意不寻常的本地主机端口上的流量。

建议安全团队启用自动化 CI/CD 管道扫描,在任何软件包进入生产构建之前,检查是否存在混淆标记、静态构造函数滥用和嵌入式加密有效负载。
2026-02-25
#2

结论
恶意NuGet包通过供应链污染实现持久化后门部署,核心攻击链为:静态构造函数触发代理通道建立 → JIT编译器劫持规避静态检测 → 身份数据/文件写入窃取 → 生产环境横向扩散。攻击者利用.NET运行时特性(如程序集加载时构造函数执行顺序)实现零交互植入,需重点关注嵌入资源解密、跨进程注入和反调试逃逸机制。


L1攻击面识别(Source-Sink分析)

  1. 源点(Source)
    • 恶意NuGet包的程序集加载阶段(静态构造函数触发)
    • JIT编译劫持点(恶意钩子替换.NET运行时方法编译流程)
  2. 数据流(Flow)
    • 静态构造函数直接创建本地代理隧道(Sink:7152端口流量转发到C2)
    • 身份数据(ASP.NET用户凭证)通过代理通道外发(Sink:C2服务器接收敏感数据)
    • SimpleWriter_隐藏进程写入磁盘的恶意文件(Sink:持久化载荷落地)

L2假设与验证

验证假设:

  • 嵌入资源中存在加密有效负载,解密后包含C2通信逻辑
  • 静态构造函数包含网络连接逻辑
  • JIT钩子导致恶意代码仅在运行时动态解密

验证步骤:

  1. 反编译分析
    # 使用dnSpy反编译NCryptYo.dll,定位静态构造函数
    // 检查System.Net.Sockets相关初始化代码
    // 查找EmbeddedResource资源名(如"payload.bin")
  2. 资源解密
    # 提取嵌入的126KB资源,尝试GZip解压+Base64替换解码
    dotnet tool install --global ilspy
    ilspy NCrypt.dll --export=resources --output=res_dir
  3. 动态监控
    # 启动带调试器的.NET进程,绕过反调试检查
    windbg -c ".loadby sos clr;!clrstack;g" -g your_app.exe
    // 观察7152端口连接及内存中动态解密的shellcode

L3边界/异常场景

  1. 时间边界:
    • 14天过期计时器触发后包功能失效,需验证过期后payload是否仍残留
  2. 环境边界:
    • 在虚拟机/沙箱中运行时,反调试逻辑会禁用代理,需构造模拟真实环境参数(如系统指纹伪造)
  3. 代码执行边界:
    • 仅当ASP.NET Identity模块被调用时,DOMOAuth2_才会收集用户数据,需触发Identity认证流程验证数据外发

L4防御反推与修复

  1. 检测增强:
    • 在CI/CD中强制执行.NET程序集检查:
      # 使用`dotnet-assembler`扫描静态构造函数中的网络操作  
      dotnet run --project scanner.csproj --target NCryptYo.dll --check:static_ctor/tcp  
    • 监控System.Reflection.Emit和System.Runtime.CompilerServices相关API调用(JIT劫持特征)
  2. 防御绕过:
    • 部署.NET运行时保护模块(如Census或自研hook检测工具),拦截非法JIT替换
    • 在生产环境禁用NCrypt.dll依赖项的Reflection.Emit功能:
      <!-- app.config -->
      <runtime>
        <NetFx40_LegacySecurityPolicy enabled="true"/>
      </runtime>
  3. 修复路径:
    • 强制更新被污染的NuGet包命名空间(如替换为合法NCrypto包)
    • 在应用层拦截7152端口出站流量,结合YARA规则匹配硬编码令牌:
      rule Malicious_NuGet {
        strings:
          $a = "GZipCompressedBase64Tok3n" nocase
        condition:
          $a in (0..1024KB)
      }

最小可执行验证步骤

若需快速验证本地项目是否受影响:

  1. 查找bin目录下是否存在NCrypt.dll的静态构造函数调用
  2. 执行netstat -ano | findstr 7152确认异常端口占用
  3. 检查SimpleWriter_包是否存在未声明的System.IO.File.WriteAllText调用路径
2026-02-26
#3
这个要是感染了影响还是挺大的
2026-02-26
#4
最近这2年的新闻 关于恶意库 恶意模块包 次数越来越多了。