You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从客户端防护.NET命名管道通信免受DLL注入攻击?

解决方案:抵御命名管道通信中的DLL注入攻击

问题背景

我们基于.NET Framework的C#应用包含非特权客户端与特权服务两部分,二者通过命名管道通信:客户端需执行高权限任务时向服务发送JSON格式指令,服务可执行复制文件至Program Files、安装MSI、运行.reg注册表文件等高权限操作。目前已采取两项安全措施:

  • 配置PipeSecurity对象,代码如下:
PipeSecurity pipeSecurity = new PipeSecurity();
var id = new SecurityIdentifier(WellKnownSidType.AuthenticatedUserSid, null);

// Allow read and write access to the pipe from different user sessions
pipeSecurity.SetAccessRule(new PipeAccessRule(id, PipeAccessRights.ReadWrite, AccessControlType.Allow));
            
// Grant Service user instance full control.
pipeSecurity.AddAccessRule(new PipeAccessRule(System.Security.Principal.WindowsIdentity.GetCurrent().User, PipeAccessRights.FullControl, AccessControlType.Allow));
  • 校验连接客户端进程的路径,仅允许白名单路径的进程连接。

但存在DLL注入攻击风险:恶意DLL注入客户端进程后,连接命名管道时进程路径与合法客户端一致,会绕过服务端校验,进而发送恶意指令实现权限提升。

核心解决方案

1. 校验客户端进程完整性(而非仅路径)

仅校验进程路径无法抵御注入,需从程序本身的合法性入手:

  • 数字签名校验:通过System.Security.Cryptography.X509Certificates相关API,获取客户端进程的签名证书,验证其是否为己方签发、未过期且未被吊销。
  • 主模块哈希校验:预存合法客户端程序的SHA256哈希值,服务端获取客户端进程主模块的文件哈希,与预存值对比,确保程序本体未被篡改。

2. 基于进程令牌的深度校验

获取客户端的用户令牌,验证多重维度的合法性:

  • 完整性级别校验:非特权客户端通常运行在中等完整性级别,若注入后的进程被篡改权限,可通过令牌确认其完整性级别符合预期。
  • 会话身份校验:验证客户端进程的会话来源,避免跨会话的恶意利用(如高权限会话注入低权限客户端)。
  • 用户组校验:确认连接的客户端属于预设的合法用户组,排除伪造身份的恶意进程。

3. 指令级签名校验

给客户端发送的JSON指令添加数字签名机制:

  • 客户端使用混淆保护的内置密钥对指令签名,服务端预存对应公钥,接收指令后先验证签名再执行。
  • 密钥需通过代码混淆、加密存储等方式保护,降低被逆向提取的风险,即使客户端是非特权进程,也能大幅提升指令的不可伪造性。

4. 升级IPC方式:使用WCF NetNamedPipeBinding

若保留命名管道通信,可改用WCF的NetNamedPipeBinding,它内置安全机制:

  • 开启SecurityMode.Transport,启用Windows身份验证与通信加密,确保传输过程的保密性与完整性。
  • 配置服务授权规则,仅允许特定用户或组访问,结合进程身份校验进一步加固安全。

对初步设想的补充

  • 微软命名管道安全文档聚焦于ACL配置,无法直接解决DLL注入后的进程身份伪造问题,需结合进程完整性校验与指令签名共同作用。
  • 非对称加密的密钥存储问题,可通过TPM硬件加密或客户端启动时动态生成临时密钥+服务端初始握手验证缓解,但实现复杂度较高,需权衡开发成本与安全需求。

内容的提问来源于stack exchange,提问作者Abdur Rahman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 14:43:26