为何发生Zerologon漏洞?软件实例不当

在今年9月,有研究人员披露了Zerologon漏洞,引发关注,这是微软在8月的修补,是关于Windows Netlogon远程协议的漏洞。

其实,微软当时已经指出,此漏洞的CVSS 3.0风险达到满分10分,并表示与域名控制器(Domain Controller)有关,不过,随着研究人员的披露,指出该漏洞可让黑客轻易掌控AD域名,并解释漏洞成因,不仅再次引发外界对此漏洞的重视,同时,相关的修补说明与警示也不断成为新闻焦点。

这个已经使用多年的协议到底有何问题?我们根据首度披露这项漏洞的安全公司Secura的安全报告,同时也请台湾安全企业奥义智能协助,深入说明这次漏洞的细节、根因与利用方式。

漏洞在Netlogon认证握手过程

关于这次Netlogon远程协议漏洞的成因,我们先从协议运行原理开始说起。

简单来说,Windows Netlogon远程协议是一个RPC(Remote Procedure Call)接口,作用于AD域名控制器与Windows域名中计算机之间。举例来说,以NTLM协议将用户登录服务器,就是它的功能之一,其他还包括让域名内的计算机,以及域名控制器,可以相互验证身份,特别是还可更新域名中计算机的密码。

从原理来看,依据Windows Netlogon远程协议,当用户端(已加入域名的计算机)连至服务器端(域名控制器)时,必须先经过认证握手(Authentication handshake)的过程。在此阶段中,第一步骤是由用户端开始,会先发送一个Client Challenge,然后第二步骤是服务器端也发送回一个Server Challenge,此时,将通过一个密钥衍生函数KDF(Key Derivation Function),以便相互确认彼此,并产生后续通信都可用于验证的Session Key。

第三步骤,同时也就是这次漏洞发生的地方。在用户端通知产生Session Key时,该Session Key将包含secret与Challenge,secret是账号密码,并会将前述的Client Challenge加密,当发送至服务器端时,加密的结果就会被放入NetrServerAuthentication3的credential参数中,提供给Server进行确认。

一般而言,也就是在没有漏洞的情况下,攻击者在此场景中,由于不知道密码,就无法计算出Session Key,也无法成功算出Client Credential。但是,攻击者若是不知道Session Key,却有办法计算出Client Credential,等于成功绕过这里的身份验证。

从软件开发的角度来看,这次漏洞突显了什么样的问题?是因为AES-CFB8不够安全?还是软件实例上出了什么问题?

奥义智能资深研究员陈仲宽的看法是,这个漏洞首先显示出软件在安全性及性能上的权衡。他认为,AES-CFB8是一个针对性能的变种算法,虽常用于实务上,但并未仔细地接受理论上的分析验证,尽管也没有人证明其不安全。

而这个漏洞最主要的重点,就是没有正确实例AES-CFB8加密模式,违反IV数值应为随机数值。因为在此实例上,将AES-CFB8成立所需要的一项安全属性- IV数值,写死为一连串的0,造成当攻击者将前述Client challenge同样设置成一连串0时,造成连锁效应,就有相当高的几率(1/256),导致得到的运算结果也是一连串0。

对此,陈仲宽推测,实例此部分软件的人,可能并不熟悉密码学,也没有深入去探讨固定IV的风险,因此造成此次漏洞。他认为,即使是一般程序设计师,也需要有基本安全的概念。