Windows 热补丁冲突:谁动了我的代码?
If somebody tries to hot-patch an already-hot-patched function
最近我调研了热补丁机制,发现它的设计初衷仅允许 Windows Update 这一方进行修补。如果某个函数已经被热补丁覆盖,而其他人试图再次修补,系统会直接判定出错。对于 Windows Server 和 Windows 11 Enterprise 而言,热补丁空间是受控的,只有授权代码才能使用。但如果有人未经授权进行了 detour 或其他形式的补丁,热补丁代码会检测到这种“ rogue patching”,并宣布该文件无法热补丁,最终导致系统必须重启。更糟糕的是,这里存在竞态条件:预扫描可能显示一切正常,但扫描完成后,函数可能被他人修改,导致补丁程序卡在半途,既无法继续也无法回滚。这种状态就像在火区停车,一切看似平静,直到消防车到来,却发现路被堵死,后果不堪设想。
一个使用了热补丁空间的应用程序,就像是在火区停车,一切看似平静,直到消防车到来,却发现路被堵死。
HN 评论区
23- drdexebtjl
将挂钩函数(hooking functions)视为微软眼中的“流氓行为”,或是你“未经授权”的操作,这种说法很有意思,毕竟微软自己就提供了 detours 库,而且以前从未这样定性过。
此外,这段解释还漏了一点:挂钩通常是针对单个进程、在用户空间应用的。当你为了应用补丁而写入动态库的代码页时,这些页面会从共享页通过写时复制(CoW)机制复制出来。
Windows 更新的工作机制类似吗?还是说它会以某种方式修改原始的共享页,从而影响所有进程?单个进程中的挂钩操作会导致整个系统的热补丁功能失效吗?
- jonhohle
在上一份工作中,我编写了一个 Docker 构建流程,用于在单体 Docker 镜像之上对单个 Java 类文件进行补丁修复。这并非运行时补丁,但它允许在紧急情况下快速部署仅几 KB 大小的单个层。
有趣的是,它也有类似的限制,并在构建时进行检查:不能是公开的 ABI 变更,且一次只能应用一个补丁。
- fsfod
Windows 的并行 DLL 加载机制同样具有防御性:如果发现某些 NT DLL 函数被挂钩,它就会针对该进程禁用自身。https://stackoverflow.com/questions/42789199/why-there-are-t...