您可能已经注意到,MS08-052公告中包含一个与以往不同的解决方案。这是因为在Windows 2000之后的所有操作系统中,gdiplus.dll都存储在名为Windows并行缓存(WinSxS)的机制中。
WinSxS缓存的目的是保留旧版本的程序集,以防应用程序需要特定版本而不愿使用新版本。它实现为%windir%下的一个名为winsxs的文件夹。在该文件夹中,您会找到WinSxS缓存管理的每个程序集的每个版本的子文件夹,每个文件夹中都包含该程序集的一个副本。当应用程序尝试加载由WinSxS缓存管理的DLL时,Windows会检查该应用程序是否有一个清单(manifest),指定它想要哪个版本的DLL。如果该信息不存在,应用程序将获得该DLL的默认版本。
您的系统上可能现在就有多个版本的gdiplus.dll。这就是为什么我们的解决方案中包含一个步骤,限制对%windir%\winsxs中所有名为gdiplus.dll的文件的访问:
|
|
这样,无论应用程序请求哪个版本,它都将无法加载该DLL,从而与易受攻击的代码隔离。
安装更新后,您显然不希望任何应用程序能够加载仍存在于WinSxS缓存中的旧版本。这就是为什么更新包含一个WinSxS策略规则,该规则指示Windows忽略对早于更新版本的gdiplus.dll的请求,并向这些应用程序提供更新后的版本。这是WinSxS缓存的一个功能,专为这种情况设计。
- Kevin Brown, SVRD Blogger 发布内容“按原样”提供,不提供任何担保,也不授予任何权利。