阅读:3186回复:0
SSL/TLS协议安全系列:CBC 模式的弱安全性介绍(一)
编辑标注: 因drops对数学符号的支持存在问题,所以部分内容采取图片的形式显示,我们会经快解决这个问题,希望见谅。
一 前言 在SSL的一些版本中,使用CBC分组模式对数据进行加密,而CBC分组模式在使用中常会出现一些问题。本文对CBC分组模式中Padding Oracle Attack做基本介绍,主要包括Padding Oracle Attack的背景知识、在多种填充模式下的攻击原理以及现实场景应用。 Padding Oracle Attack,顾名思义:Padding是“填充”,这里指在CBC分组加密模式中的填充数据;Oracle是“提示”,意指服务器返回的提示信息。Padding Oracle Attack可理解为“填充提示攻击”,是一种逻辑上的旁路攻击。简要来说,Padding Oracle Attack是指以明文分组和填充为根源,依据系统解密密文时泄露的填充信息,通过不断尝试填充字节直到获得有效填充信息,从而恢复出明文或者构造任意明文对应的密文这样一种攻击方式。利用Padding Oracle Attack,恢复一块长度为b字节的密文块,只需要平均128*b次oracle回应,而不是尝试2^k次(k指密钥长度为多少bit)。 Padding Oracle Attack最初是Serge Vaudenay在EUROCRYPT 2002会议上提出, Vaudenay介绍了CBC模式中基本的Padding Oracle Attack攻击原理;在 2010 年的 BlackHat 欧洲大会上,Juliano Rizzo 与 Thai Duong 把这种攻击应用到了一些流行的Web应用框架上,包括JavaServer Faces,Ruby on Rails 以及 ASP.NET,他们在2011年的Symposium on Security and Privacy大会上发表文章详细分析ASP.NET中的Padding Oracle问题;同年,在Pwnie Rewards中,ASP.NET的Padding Oracle漏洞被评为“最具价值的服务器漏洞”;次年,Romain Bardou和Riccardo Focardi等人发现,这种攻击对于一些安全设备同样有效;在 2014年,谷歌的安全人员又提出了针对 SSL v3协议中Padding Oracle漏洞的POODLE攻击,99%以上使用 https 服务的网站受到影响。 二 背景知识 在介绍Padding Oracle Attack原理之前,这里首先简单介绍一些相关的背景知识。 CBC(Cipher Block Chaining)分组模式 常用的对称加密算法(如AES、3DES等),一般使用分组加密模式,其中CBC是最常见的分组模式之一。CBC分组模式在对消息进行加/解密时,会根据使用的不同对称加密算法,将消息进行分块(block),每块大小可被分为16字节(AES)、8字节(3DES等)。 CBC分组模式加密流程如下图: 图片:2015062502375017435.png CBC分组模式中引入初始化随机向量IV,使得相同明文在不同的加密次数中产生不同的密文,IV随密文一起发送给接收方。整个加密过程可以表示为: 图片:2015062502375017435.png 其中C表示密文块,P表示明文块。从加密过程中,我们可以看出,每一块明文都需要是整齐的,由于在现实中明文不一定可以整齐的分成块,因此在最后一块明文中需要加入填充(Padding)。 CBC分组模式解密流程图: 图片:2015062502375017435.png 首先每块密文经过对称算法解密成中间值,之后同前一块密文异或得到明文。解密过程可以表示为: 图片:2015062502375017435.png 几种填充方式 前面我们提到,明文信息可以是任意长度,不一定是block的整数倍,这样难免明文分组后最后一块长度不足。解决的方法就是对最后一块内容进行填充,这里我们介绍几种常见的填充规范。 [*]PKCS#5 图片:2015062502375017435.png [*]ISO/IEC 9797-1 ISO/IEC 9797-1标准有三种填充方式: 第一种在明文后面全部补‘0’,直到是block size的整数倍; 第二种在明文后面紧跟着的一位补‘1’,之后补‘0’,直到是block size的整数倍; 第三种方式: 图片:2015062502375017435.png 假设分组模式每块长度为n(bit),首先右填充,在明文后面全部补充‘0’,直到n的整数倍,然后再进行左填充,(L_D)_2是未填充的明文长度(用bit表示)的二进制表示,然后在该长度左边补充‘0’直到长度为n。这种填充方式如果数据为空,仍然会有一个全‘0’的块作为填充。针对第三种填充方法,我们后面会给出对应的攻击原理。 上面介绍的两种标准,第一种是按字节填充,第二种是按位填充。除了这两种标准,还有很多其他的填充方式,比如John Black和Hector Urtubia在USENIX 2002年大会上提出的,这里我们以4字节填充为例介绍: 图片:2015062502375017435.png XY-PAD:选取固定的X和Y,在明文最后填充一个X,之后填充足够的Y; ESP-PAD:在明文最后填充123..n补齐; PAIR-PAD:与XY-PAD类似,这里的X和Y不是固定值,每次随机选取; OZ-PAD:按位填充,在明文最后填充‘1’bit,之后以‘0’补齐; ABIT-PAD:按位填充,发送者检测明文最后一位是‘0’还是‘1’,在最后以相反的位进行填充; ABYT-PAD:发送者检测明文最后一个字节,然后选取任意不同的字节‘Y’进行填充; BOZ-PAD:同XY-PAD,只不过X取的是0x80,Y取◆0。 三 攻击原理 1 攻击实施条件: Padding Oracle Attack依赖于两个假设,也就是实施攻击需要满足的先决条件: [*]攻击者可以窃听通信,并且拦截CBC分组模式的密文。 [*]攻击者能够访问一个padding oracle O,并且能够区分返回的响应信息表示填充‘有效’或者‘无效’。 [*]当信息解密和填充都合法时,服务器会返回类似200 OK这样的有效信息; [*]如果解密过程中填充正确,但是消息内容不正确,也会返回200 OK; [*]如果出现填充错误,我们就会得到一个密码学异常和一个类似 500 Internal Server Error的响应。比如JSF view states填充错误时,会返回 javax.crypto.BadPaddingException: Given final block not properly padded。这就很明显的告诉我们此时填充不正确。 2、如何解密 (1)PKCS#5 这里我们首先以PKCS#5填充标准为例,介绍Serge Vaudenay在EURO-CRYPT 2002上提出的Padding Oracle Attack的基本原理。 首先给出几个符号定义,‘b’表示block的字节长度,比如AES中b=16,DES中b=8;N表示明文包含的block数量;在PKCS#5中,一个block序列x1, x2,……xN填充有效,是指xN最后一个字节为◆1,或者最后两个字节为◆2,◆2,以此类推。 |
|