DLL植入漏洞分类与微软安全响应指南

news/2025/9/20 19:15:51/文章来源:https://www.cnblogs.com/qife122/p/19102746

DLL植入漏洞的分类 | MSRC博客

本文章翻译自Security Research & Defense博客《Triaging a DLL planting vulnerability》(2018年4月4日美国时间发布)。

动态链接库(DLL)植入(二进制植入/劫持/预加载)问题往往每隔几年就会重新出现,而微软对此类报告的应对方式可能不够明确。本文旨在阐明DLL植入问题分类时的考量因素。

当应用程序未指定完整路径名而动态加载DLL时,Windows会按照《动态链接库搜索顺序》中描述的特定顺序,在明确定义的目录集合中查找DLL位置。默认SafeDllSearchMode使用的搜索顺序如下:

  1. 应用程序加载位置的目录
  2. 系统目录(通过GetSystemDirectory函数获取路径)
  3. 16位系统目录(无专用函数获取路径但仍会被搜索)
  4. Windows目录(通过GetWindowsDirectory函数获取路径)
  5. 当前工作目录(CWD)
  6. PATH环境变量列出的目录(但不包含App Paths注册表键指定的应用专属路径,该键在运行时不会用于DLL搜索)

默认DLL搜索顺序可通过多种选项修改,如先前博客《安全加载库》所述。

应用程序加载DLL时,若攻击者能将恶意DLL植入搜索顺序中的任一目录,且被植入的DLL未出现在攻击者无权限访问的更高优先级目录中,则构成DLL植入漏洞。例如,若加载foo.dll的应用程序在其目录、系统目录或Windows目录中均未找到该DLL,攻击者只需在当前工作目录植入foo.dll即可实现劫持。DLL植入漏洞对攻击者而言便捷且工作量小,由于DllMain()在加载时立即执行,代码执行极为容易。若应用程序允许加载未签名二进制,攻击者甚至无需绕过缓解措施。

根据恶意DLL植入位置的不同,漏洞主要分为三类:

  • 应用程序目录中的DLL植入
  • 当前工作目录(CWD)中的DLL植入
  • PATH目录中的DLL植入

这些分类决定了我们的响应方式。以下详细分析各类别的处理逻辑。

应用程序目录中的DLL植入

应用程序目录是应用程序存放非系统DLL依赖并视其为可信的位置。安装目录中的文件被推定为无恶意且可信,通常通过目录ACL进行安全控制。能替换安装目录二进制文件的用户被视为具备文件写入或覆盖权限。应用程序目录被视为代码目录,存储与应用程序代码相关的文件。若无权访问该目录的攻击者能在此覆盖DLL,则问题远不止简单的DLL替换/植入。

场景1:可信应用程序目录中的恶意二进制植入
正确安装的应用程序通常通过ACL保护其目录,此场景中修改目录内容需提升权限(通常是管理员权限)。例如,Microsoft Word安装于C:\Program Files (x86)\Microsoft Office\root\Office16,修改该目录需管理员权限。拥有管理员权限的受害者可能被诱导或将恶意DLL置于可信位置,但此类情况下攻击者可能进一步诱导受害者执行更危险操作。

场景2:不可信应用程序目录中的恶意二进制植入
此类场景包括:通过XCOPY等非安装器方式安装的应用程序、共享文件夹中的应用程序、从互联网下载的应用程序,或位于无ACL控制目录的独立可执行文件。例如,从互联网下载并在默认“下载”文件夹中运行的安装程序(含可再发行包、ClickOnce生成的setup.exe、IExpress生成的自解压存档等)。从不可信位置启动应用程序本身具有风险,受害者易被诱导在這些位置植入DLL。

应用程序目录的DLL植入问题被视为纵深防御问题,更新仅考虑未来版本。鉴于此类攻击所需的社交工程量及本质符合设计规范,MSRC将此类报告归类为“vNext(下一产品版本)”问题。受害者需被诱导将恶意DLL(恶意软件)存于可执行位置,且执行不良操作(如在恶意软件同目录运行安装程序)。未安装的应用程序无“可信安全目录/二进制”参考点(除非自建目录)。理想情况下,安装程序应创建具随机名称的临时目录(防止进一步DLL植入),展开二进制文件并安装应用程序。攻击者可能通过驱动式下载在受害者系统(如“下载”文件夹)放置恶意软件,但攻击本质仍是社交工程。

Windows 10 Creators Update新增了进程缓解措施“PreferSystem32”,可切换DLL搜索顺序中应用程序目录与system32的优先级,防止应用程序目录中恶意系统二进制被劫持。此措施适用于进程创建可控的场景。

当前工作目录(CWD)中的DLL植入

应用程序通常将启动源目录视为CWD,基于默认文件关联启动时亦然。例如,点击共享文件夹中的D:\temp\file.abc文件时,D:\temp会成为.abc文件关联应用程序的CWD。

托管于远程共享文件夹(尤其是WebDAV共享)的场景更易受CWD的DLL植入攻击。攻击者可将恶意DLL与文件共存,通过社交工程诱导受害者打开文件,使恶意DLL被目标应用程序加载。

场景3:CWD中的恶意二进制植入
若前三个可信位置未找到DLL,应用程序会从不可信CWD搜索该DLL。例如,受害者尝试从\\server1\share2\打开.doc文件启动Microsoft Word时,若Word无法从可信位置找到依赖的DLL(如oart.dll),则会从CWD(即\\server1\share2\)加载该文件。该共享文件夹为不可信位置,攻击者可轻易植入恶意oart.dll。

触发点:\\server1\share2\openme.doc
应用程序:C:\Program Files (x86)\Microsoft Office\root\Office16\Winword.exe
应用程序目录:C:\Program Files (x86)\Microsoft Office\root\Office16\
CWD:\\server1\share2\
恶意DLL:\\server1\share2\OART.DLL

CWD的DLL植入问题被视为严重级问题,微软会发布安全更新。以往修复的大部分DLL植入问题属此类,部分列于安全公告2269637。有人可能疑问:为何微软应用程序会加载不存在于其目录、系统目录或Windows目录的DLL?原因包括可选组件、不同OS版本、多架构附带不同二进制集合,且应用程序有时无法在加载前有效检查/验证。

PATH目录中的DLL植入

DLL搜索顺序的最后位置是PATH目录。PATH目录是各类应用程序为提升用户体验而添加的目录集合。

PATH环境变量中的目录始终受管理员权限控制,普通用户无法修改其内容。若PATH包含任意用户可写目录,则属严重问题(远超单一DLL加载实例),我们会按严重级处理。但若仅涉及DLL植入,由于无法借此突破安全边界,被视为低安全性问题。因此,PATH目录的DLL植入问题标记为“无需修复”。

结论

以上说明应能澄清微软如何对报告的DLL植入问题分类,以及何种情况需发布安全更新。以下简指南列出通过安全发布(降级修复)修复与不修复的内容:

微软作为安全修复处理的内容

  • CWD场景:关联应用程序从不可信CWD加载DLL。

微软考虑在下一产品发布时处理的内容

  • 应用程序目录场景:基于产品开发组对显式/隐式加载的判断。显式加载可调整,隐式加载(依赖DLL)因路径不可控而完全符合设计规范。

微软不处理的内容(非漏洞)

  • PATH目录场景:PATH中所有目录均需管理员权限,故无法被利用。

—–
Antonio Galvan, MSRC
Swamy Shivaganga Nagaraju, MSRC漏洞与缓解措施团队
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
公众号二维码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/908511.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

4980:拯救行动

题目 总时间限制: 1000ms 内存限制: 65536kB 描述 公主被恶人抓走,被关押在牢房的某个地方。牢房用N*M (N, M <= 200)的矩阵来表示。矩阵中的每项可以代表道路(@)、墙壁(#)、和守卫(x)。 英勇的骑士(r)决定…

java03-wxj

好的,我们来逐一详细解答这些问题。1. 什么样的方法应该用static修饰?不用static修饰的方法往往具有什么特性? 应该使用 static 修饰的方法:工具方法(Utility Methods): 执行一个与任何特定对象实例无关的通用任…

题解:P13969 [VKOSHP 2024] Exchange and Deletion

题面: 我们考虑从图论意义计数,把 swap 改成连边,由于交换完前面的点直接被删了,所以只保留从后向前的连边。 那么最后连到 \(n-k\) 前的点的数值等于链头,而 \(n-k\) 后的点和链上非链头的点实际上都被删了。手玩…

基于MATLAB的车牌识别系统 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

市场交易反心理特征之二:忽视热点切换的苗头

案例:2017年8月18日,万科A。2017年8月18日,万科A 万科A小波段延续万科A一个波段完成​情况描述:从第一次触及无穷成本线止跌后大资金进入开始,连续2-3次出现买点,都能选出。但是都直接鼠标滑过,没有过脑子,显然…

Linux服务器上安装配置GitLab的步骤

在Linux服务器上安装GitLab是一个涉及多个步骤的过程。以下是详细的步骤,遵从GitLab官方推荐的做法以确保系统的稳定性和性能。 服务器要求和前提条件:一台运行支持的Linux操作系统的服务器,建议使用CentOS 7。 至少…

贪心算法应用:投资组合再平衡问题详解 - 实践

贪心算法应用:投资组合再平衡问题详解 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &q…

MCP:Trae中集成Playwright 实现网页自动化测试

Trae IDE 可以通过智能问答的形式补齐代码,纠正程序中的错误,根据用户的自然语言,实现AI自动编程。近期使用了一下Trae,发现很强大。我把一个有前后端的项目导入Trae IDE,当时还有一些报错,但是很快在Trae 的提示…

C语言中的字符、字符串及内存操作函数详细讲解

在C语言中,字符和字符串的处理是基本且重要的概念。字符在C中通常由 char类型表示,而字符串则是以 null终止的字符数组。内存操作函数则提供了基本的内存处理能力,如复制、设置、比较等内存块。 字符操作 字符使用 …

06、訊息收集

1、使用nmap探测magedu.com开放的端口号和服务指纹 2、使用指纹识别工具探测magedu.com采用的建站模板 3、搜集magedu.com的子域名有哪些

AI 智能体与 Coze 工作流实践:小红书对标账号采集 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

在Linux中设定账户密码的安全性策略

在Linux环境下,确保账户密码的安全性是保护系统安全的重要环节。要设置强健的密码策略,需要从多个层面制定规则,这些包括密码复杂性、长度、有效期限、历史记录限制和尝试次数限制等方面。 密码复杂性设定和管理:密…

对比六种JavaScript全文搜索库 fuse.js 、 lunr 、 flexsearch 、 minisearch 、 search-index 、 js-sea

以下是针对六种JavaScript全文搜索库的对比分析,综合功能特性、性能表现及适用场景: 核心特性对比‌Fuse.js‌‌算法‌:基于Bitap算法的模糊搜索,支持拼写容错和多种匹配模式(前缀、后缀、逻辑组合等)7。 ‌配置…

精选 4 款基于 .NET 开源、功能强大的 Windows 系统优化工具,助力轻松提升 Windows 系统性能与使用体验!

前言 今天大姚给大家推荐 4 款基于 .NET 开源、功能强大的 Windows 系统优化工具,希望可以帮助你轻松提升 Windows 系统性能与使用体验。 Optimizer Optimizer 是一款基于 .NET 开源(GPL-3.0 license)、功能强大的 …

从零开始: c#纯代码实现完整Json解析器的全过程及注释与自定义格式的支持实现

从零开始: c#纯代码实现完整Json解析器的全过程及注释与自定义格式的支持实现大家好!我们要深入探讨一个非常常用的技术:JSON反序列化。别小看这个技术,它可是现代编程中不可或缺的一部。JSON解析不仅仅是简单的数据…

MySQL 32 为什么还有kill不掉的语句?

MySQL有两个kill命令:kill query+线程id,表示终止该线程正在执行的语句;kill (connection)+线程id,表示断开这个线程的连接,如果线程有语句正在执行,会先停止正在执行的语句。有时候可能会遇到:使用了kill,却没…

Axure RP 9 Mac 交互原型设计 - 实践

Axure RP 9 Mac 交互原型设计 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monac…

Ceph IO流程分段上传(1)——InitMultipart - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

第9章 Prompt提示词设计 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

详解Spring Boot DevTools - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …