CVE-2017-0199 修复
通过更改 .hta 文件的默认处理程序,消除 CVE-2017-0199 执行代码的能力。通过 OLE2 (COM 对象) 调用的文件的默认处理程序独立于本地系统的默认应用程序存储,只能通过注册表更改。
基本逻辑漏洞
这是该漏洞的一个实际示例,并且按照我的理解进行说明。并非所有情况都遵循此模式,我的评估可能不正确。下一节中提供的修复方法在我测试过的情况下确实有效。
- 托管在 Web 服务器上的 RTF 文档将恶意超文本应用程序 (HTA) 有效负载 'cat' 到其末尾。
- 托管服务器响应对该文件的 GET 请求,并在标头中声明该内容是一个 HTA 文件。
- Microsoft Word 运行一个 OLE2 对象,从 Web 服务器获取 RTF 文档。
- Microsoft Word 被迫验证文件类型,因为扩展名 .rtf 与内容类型 HTA 不匹配。
- Microsoft Word 从文件末尾检查可识别的数据结构,并将 HTA 数据结构与 HTA 内容类型匹配。
- Microsoft Word 自动更正文件类型,并将其传递给 HTA 文件的 COM 处理程序 (mshta.exe)。
- Mshta.exe 运行文件末尾的恶意超文本应用程序代码。
COM 处理程序与系统处理程序分别存储在注册表中,以防止文件类型验证过程中出错。
基本修复
- 在 RegEdit.exe 中导航到 HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{3050f4d8-98B5-11CF-BB82-00AA00BDCE0B}\DefaultIcon
- 打开 DefaultIcon 的高级权限
- 将所有者更改为 Administrators (组)
- 将当前用户帐户添加到安全主体列表,并分配 "完全控制" 权限
- 将 (Default) 键编辑为 C:\Windows\System32\notepad.exe,1
- 在 DefaultIcon 的高级权限中删除你的用户,并将 SYSTEM 重新分配为所有者
- 对 HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID{3050f4d8-98B5-11CF-BB82-00AA00BDCE0B}\LocalServer32 重复步骤 1 到 6,将 (Default) 键值更改为 C:\Windows\System32\notepad.exe
这将通过将通过 OLE2 调用的 .hta 对象的默认处理程序更改为 notepad,从而消除 CVE-2017-0199 执行代码的能力。这将适用于所有调用 .hta 文件的 OLE2 实例。这会导致 notepad 打开并引发错误,但代码不会执行。
原始注册表键
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{3050f4d8-98B5-11CF-BB82-00AA00BDCE0B}\DefaultIcon\(Default)
C:\Windows\SysWOW64\mshta.exe,1
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{3050f4d8-98B5-11CF-BB82-00AA00BDCE0B}\LocalServer32\(Default)
C:\Windows\SysWOW64\mshta.exe
编辑后的注册表键
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{3050f4d8-98B5-11CF-BB82-00AA00BDCE0B}\DefaultIcon\(Default)
C:\Windows\System32\notepad.exe,1
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{3050f4d8-98B5-11CF-BB82-00AA00BDCE0B}\LocalServer32\(Default)
C:\Windows\System32\notepad.exe
环境
- 1 台 Ubuntu 16.04.2 LTS 服务器,装有 LAMP 堆栈和 SSH 服务器
- 1 台 Windows 10 客户端,装有 Office 365 (2016)
参考资料
经验教训
- 不要直接编辑 HKCR。请编辑 HKCU 或 HKLM 中相应的键。
- 您可以在获取注册表键的所有权后,将其所有权交还给 SYSTEM 或其他主体。
- 不要乱动注册表。修改完成后,保持原样。
- Process Monitor 具有强大的右键过滤功能,可以减少噪音。
- Process Monitor 的查找功能可在所有字段中搜索字符串。
- pscp.exe (Putty) 是一个命令行 SSH 文件传输工具。
- Linux 仍然很麻烦。
结束语
对于由本缓解措施引起的任何损害或问题,或者由于 notepad 和一堆错误导致的用户困惑,我不承担任何责任。这是一个粗糙的修复,我不确定在生产环境中是否会引发更广泛的问题。一如既往,请根据您的特定环境和需求评估缓解措施。
稍后我会添加截图,展示此缓解措施实施前后的效果。此外,这可以通过脚本完成,但我在更改注册表键的权限时遇到困难,因此我会稍后处理。