• 中科院DCS中心    林璟锵  荆继武

密码技术,相比其它安全技术,具有更加严谨的安全模型、更加严密的逻辑推导,能够从基本公认的少量假设出发,推导得到各种可以证明安全的方案。密码技术的应用,通常都会给信息系统带来显著的安全性提升。

本文我们将探讨密码及其在现实应用中面临的诸多挑战。从现实情况来看,密码技术与应用的安全效果并不尽如人意。

一、错误的密码算法和不当的密钥长度

密码设备中可能会集成多种算法,密钥长度也可能是用户可以选择的,这就要求用户有足够的密码学知识。特别是,许多旧的设备在缺省情况下的算法和密钥长度选择已经不安全,有的甚至不具备新的算法选项。例如,近年来的HASH算法攻击分析,就使得原有MD5算法和SHA-1算法从安全变为不安全;RSA算法的安全密钥长度,也随着技术研究进展而不断调整。

对于实际运行的系统,要再升级密码算法或者密钥长度可能需要很大代价。2011年的Internet统计分析表明,大约25%的网站仍然在使用密码算法不安全的数字证书(MD5和RSA-1024算法),2016年的统计表明,IETF新标准禁止使用的RC4序列密码算法仍然大量使用,约占邮件类连接的10%。相关文献对Diffie-Hellman密钥交换协议的技术分析,推测NSA有能力解密大量SSL/TLS加密流量。

即使密码算法是绝对安全的,考虑到前向/后向安全、考虑到可能发生的安全事件,密钥也需要定期更换。NIST SP 800-57给出了各种场景推荐使用的密钥长度和更新周期。这些密钥更新原则,在现实的计算机和网络系统中,并没有得到完全实施。更为严重的是,大量的密钥被重用。在互联网邮件通信中,仅大约15%的公钥正确地对应一个主机,其他公钥都对应两个或更多主机。

二、密码算法的工作模式选择错误

在密码应用中,对称算法会使用CTR、CBC或GCM等工作模式来处理数据;RSA算法也需要使用PKCS#1、OAEP和PSS的数据填充方法。对于特殊的应用场景,还会有专门的密码算法工作模式:在硬盘数据存储加密应用中,通常使用XTS工作模式,NIST SP 800-38G定义了Format-Preserving Encryption工作模式、用于保持加解密前后的文本格式等。学者也针对Hash算法提出了数据完整性校验工作模式。

然而,这些理论研究成果并没能全面应用到计算机和网络系统中,最近暴露的QQ浏览器的RSA算法使用问题、著名的SSL/TLS DROWN攻击都是利用了不安全的RSA算法数据填充方法,相关文献也讨论了数据存储加密中不同工作模式的相应安全问题。

三、随机数不安全

如何获得不可预测的随机数一直是密码应用中的重要问题。早在1996年,研究人员就发现,Netscape Browser的SSL协议实现使用了有问题的随机数生成方法,攻击者可以很容易地预测密钥。在20年前,相关文献就总结了若干实际运行系统中的随机数问题、并给出了在计算机系统中产生安全随机数的技术建议。

目前有多种方法来产生和评估随机数或伪随机数,其中也有些方法已经形成标准。然而,即使标准化的方法也有可能存在安全问题。如,NIST SP 800-90A标准中著名的Dual EC伪随机数产生算法,就被广泛猜测有后门。2014年NIST的新版本标准去掉了Dual EC算法;ANSI X9.17/X9.31伪随机数产生标准,如果在实现中使用固定种子,也容易导致攻击。我们的研究表明,现有随机数检测评估标准也存在缺陷,不能完全正确地评估随机性。有文献分析了Windows操作系统随机数产生函数CryptGenRandom的实现,详细讨论了其中的安全问题。

2012年的研究表明,Internet上公开使用的数字证书和PGP/SSH密钥中,有大量的重复密钥或者重复使用的素因子;这就说明,实际系统产生随机数难以达到完美的随机性。通过网络从第三方获得随机数,涉及了复杂的操作和假设,在实际系统中并不完全可行。此外,虽然现在Intel和AMD的CPU内置了硬件随机数指令RDRAND和RDSEED,但是仍未得到广泛应用,其安全性还有争议。

四、密码安全协议的实现和使用不当

直接使用标准化的密码安全协议,是最合适的选择。目前最广泛使用的SSL/TLS密码协议在各种平台上都有公开源代码实现。SSL/TLS协议也可以运行在UDP之上、即DTLS协议。然而,在实际应用中,很多方面仍然存在问题。主要问题包括算法配置、证书配置、与应用层协议的协作、证书/密钥重复使用、操作流程复杂、代理劫持等等。比如,在针对邮件的被动侦听中发现,有超过58%的连接仍然使用不安全的TLS1.0版本。这些问题都使得SSL/TLS协议并不能得到预定的安全目标。

单点登录和统一认证授权协议也是目前广泛使用的,如OpenID、OAuth、SAML等。这些协议在实现和使用中也存在诸多问题。比如,不同程序片段对数字签名数据的不同理解,鉴别凭证和授权凭证的错误混用,关键数据在浏览器消息处理和传递过程中的泄露和篡改等都成为这些协议不正确实施的重要安全漏洞。错误的主要原因来自于协议实现和使用中的理解偏差和对实际计算机和网络系统在消息处理和传递过程中的复杂性认识不足。例如,在XML数字签名数据处理中,数字签名验证和数据解析的分离处理;对于浏览器传递和处理的消息,有多种正常方法或者攻击手段可以修改和读取。单点登录和统一认证授权协议实现,从B/S模式转到智能移动终端APP模式,也会引入新的问题;例如,APP使用WebView访问身份服务提供方时候的数据泄露,在不可信环境APP中的敏感信息泄露等。

五、网络实体与密钥绑定缺乏有效验证

在密码算法和密码协议的设计和分析中,通常直接假设网络实体正确持有密钥(对称密钥或私钥),或者采用数字证书证明网络实体与公钥的绑定关系。研究发现,大量的SSL/TLS软件实现并没有正确地验证网络实体与公钥/数字证书的绑定关系,在数字证书验证过程中没有检查根CA证书配置和实体身份标识,即使启用了SSL/TLS协议,也仍然会有中间人攻击风险。数字证书验证过程的复杂性,尤其是各种数字证书的扩展理解不当,都会影响PKI证书链的验证正确性。这些类型的软件逻辑漏洞不同于常规的软件漏洞,很难有通用的解决方案。

实现安全增强的PKI体系,也是当前的重要技术研究内容,提升安全的措施包括数字证书/公钥Pinning,数字证书的多重认证,数字证书签发操作的公开审计,不同网络路径的数字证书对比,证书服务范围限定规则,证书持有者的控制和确认等等。这些解决方案各有优缺点,都能够在某些情况下更好提升PKI数字证书的可信度。

六、密钥保护仍旧是薄弱环节

密码计算过程中的各种侧信道攻击,一直以来都是密码工程的重要研究方向。计算机系统进程中的密钥也面临各类系统攻击和安全威胁,包括Cold-Boot攻击、DMA攻击、计算机系统功能导致的数据扩散和软件漏洞导致的内存信息泄露等。针对OpenSSL的心脏出血漏洞的攻击就可以导致内存信息泄露。

针对计算机系统中的内存信息泄露和攻击,学术界提出了多种密钥安全方案,包括基于寄存器的密钥安全方案;基于Cache的Copker密钥安全方案;基于硬件事务内存机制的Mimosa密钥安全方案;基于TrustZone机制的密钥安全方案。有人也提出了基于GPU寄存器和Cache的PixelVault密钥安全方案。但是后续研究发现,PixelVault方案的技术假设不成立、其安全目标并不能达到。

早在2014年,Intel公司推出SGX机制,实现了由CPU硬件创建的隔离计算环境,在SGX执行环境中的数据,只在Cache中出现,交换到内存芯片时会自动由CPU加密,可以抵抗恶意操作系统以及恶意进程读取敏感数据,篡改可执行代码。2016年,AMD公司也推出了SME/SEV机制,由CPU实现内存数据的自动加密。但是,近年来的最新研究成果表明,SGX执行环境仍然面临着多种侧信道攻击获取密钥等敏感数据,控制程序执行流程等安全威胁;SME/SEV机制也存在安全问题。

2018年,针对CPU硬件的Meltdown漏洞和Spectre漏洞的发现,引起了网络空间安全各界的极大关注。该漏洞影响了不同厂商、不同型号的大量CPU,使得攻击者非授权地读取数据,包括密钥等敏感数据。利用该漏洞的攻击可以突破SGX机制的保护。

七、密码模块的访问控制措施不足

密码算法安全强度通常是128比特甚至更高,但是访问密码模块,即密码计算设备或者密码计算软件的权限控制却经常只是依赖于简单的用户口令。传统密码设备的使用中一般会增加额外的控制措施,如多次输入错误口令则锁定设备或者销毁关键数据,USB Token在不执行数字签名计算时不接上计算机,密码计算设备带有独立的展示界面和操作接口等。然而,近年来多次发生的CA签发虚假数字证书的安全事件表明,攻击者并不需要获取密钥,也可以进行恶意的密码计算。

由于智能移动终端的接口条件限制,外置硬件密码设备,如Sim卡,通常是始终保持连接。有文献早在2001年和2002就讨论利用RSA门限密码算法,结合在线的半可信系统,实现实时的、零延迟的密钥撤销。类似方案也可以用来支持SM2国产密码算法,实现智能移动终端的密码计算访问控制。En-ACCI方案利用虚拟机自省技术,检验密码计算调用进程的完整性,实施访问控制策略,适用于虚拟化环境的密码计算软硬件设备。CASTLE方案提出的完全物理隔离,利用二维码图片交换数据的方式,也是很有意思的探索。

广泛应用的口令身份鉴别机制,已经有服务器端不需存储口令明文的多种协议,也有一些已经成为国际标准,但是目前尚未有成为事实标准的协议设计和广泛认可和使用的开源软件实现。

八、结束语

在计算机和网络系统中让密码技术充分地发挥安全作用,并不像看起来那么容易和直接,需要综合密码学、系统安全和网络安全的知识体系。从理论层面,要保证算法和协议的不断进步;在产品层面,要确保密码实现正确,确保密码模块自身安全;在应用层面要确保选用合适安全等级的密码模块,正确配置密码参数并正确使用。每个层面都需要与时俱进,不断跟上时代发展。我们要认识到,错误地应用密码技术,就有可能会造成“安全的假象”,进而忽视或放弃了其他方面的安全措施。

(本文刊登于《中国信息安全》2018年第8期)

声明:本文来自中国信息安全,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。