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

【漏洞成因就是AES-CFB8实作缺失】关于CVE-2020-1472漏洞的发生原因,是在Netlogon远端协定认证交握过程中,第三步骤加密时所使用的AES-CFB8加密模式,存在实作上的缺失,导致攻击者有很高的概率在不知道账户密码、Sesson Key时,就能猜到Client Credential,导致Netlogon远端协定出现重大漏洞。(图片来源/奥义智慧)
在今年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的风险,因此造成此次漏洞。他认为,即使是一般程序员,也需要有基本资安的概念。
