在 Windows 中,默认禁用本地内核调试。为什么?

In Windows, local kernel debugging is disabled by default. Why?

我正在使用 Windows10.

首次安装 Windows 时,默认禁用本地内核调试 (windbg -kl)。要启用它,您必须 运行 bcdedit -debug on 并重新启动。 (不过,据我所知,即使禁用本地内核调试,Sysinternals LiveKd 似乎也能正常工作。)

为什么默认禁用本地内核调试?始终启用它有什么缺点吗?

如评论中所述,默认情况下禁用内核调试,因为它允许(即使在 64 位 Windows 上)加载未真正签名(自签名)的内核驱动程序。 (并禁用 PatchGuard 等)

关于“管理员仍然住在用户区”的评论当然是胡说八道。评论者应该继续阅读 Raymond Chen 关于“being on the other side of this airtight hatchway”的帖子。请允许我用他的话:

I think you know how this story ends. If you have administrator privileges, then you are already on the other side of the airtight hatchway. That you can use administrator privileges to pwn the machine is not interesting, because by virtue of being an administrator you already pwn the machine.

There is formally a distinction between Administrator and SYSTEM, seeing as they are some things which are ACL'd so that SYSTEM can do them and not arbitrary adminitrators, but that distinction is formal and not practical. An administrator who wanted to get some code running as SYSTEM could install a service that runs as SYSTEM. Or use Debug Privilege to take over a process (say, a service) running as SYSTEM. Or simply open a command prompt as SYSTEM and go to town. No need to go through the complex operation Q to get SYSTEM access.

如果将 SYSTEM 替换为内核模式驱动程序,则第一句成立。

您在删除的评论中说得对,管理员可以加载驱动程序,但在 x64 上必须对其进行签名。

能够加载未签名的驱动程序为您节省的不是 75 美元或填写在线表格,而是提供可证明的身份。内核模式代码签名证书与域验证的 SSL 证书不同。

请注意,Microsoft 打算 要求内核模式驱动程序经过 WHQL 认证(或使用“证明签名”,据说仅适用于非服务器 SKU),这需要提交Microsoft 的驱动程序,并使用 EV 证书开设 Windows 硬件开发人员帐户。嘿!那是怎么回事?这是勾结CA让我们为证书多付钱的阴谋吗?可能是。也许他们想确定您的身份并将验证委托给 CA(假设 EV 做了它应该做的事)。

安全方面,这并没有建立真正的安全边界,而是一种温和的缓解措施。但还有其他考虑因素:Microsoft 不希望软件发行商安装会导致 Windows 崩溃的糟糕驱动程序;而且,如果他们碰巧这样做了,Microsoft 想知道是谁编写了这些驱动程序。这就是证明签名背后的基本原理。

如果您可以轻松地启用内核调试,您可以打赌一些二流的 ISV 会编写糟糕的驱动程序,而不会费心测试或签署它,并且会使用这种 hack 来安装它。 (事实上​​ ,我知道 今天 不那么糟糕的 ISV 签署了他们的驱动程序但不对它们进行 WHQL 认证,并在没有任何提示的情况下使用 hack 安装它们。这是一个真正的东西。)

当然,同一个糟糕的 ISV 可以在其安装程序(运行提升)中启用内核调试,并可以在下次重启后加载其驱动程序。但是桌面上有一条烦人的消息说您 运行 处于测试签名模式以保护您免受这种情况的影响。当然,同样糟糕的 ISV 可以破解并隐藏消息,但在这一点上,只获取证书可能更容易。这不会阻止任何事情,但它通过让它足够烦人来提供缓解措施,这样他们就不会打扰了。

如果您想知道为什么启用内核调试会使您进入测试签名模式,答案是:因为这是通常的预期场景。即使在内核调试时,您也可以更改注册表值以要求生产签名,但这是例外情况。对于常见场景,默认值是正确的。你有 LiveKD。微软没有理由竭尽全力去处理实际上并没有发生的情况。他们已经有足够的问题了。比如修复 Microsoft Edge 中的所有崩溃问题。