Group of Software Security In Progress

GoSSIP @ LoCCS.Shanghai Jiao Tong University

安全论文每日读 2015.02.27

还记得2014年沸沸扬扬的针对SSL 3.0的Poodle Attack攻击吗?我们今天来介绍一篇和Poodle Attack以及 这一大类(Padding Oracle Attack)攻击有关的论文,发表在2011年高大的SP学术会议上的论文:Cryptography in the Web:The Case of Cryptographic Design Flaws in ASP.NET

作者:Thai Duong,Juliano Rizzo

单位:Vnsecurity/HVAOnline, Netifera

Abstract

这篇文章概括况的讲就是利用decryption oracle来攻击unauthenticated encryption这个漏洞。

  • 本文主要讨论Web安全设计中的密码学误用问题;
  • 重点关注的是ASP.NET,它被25%的网站使用;
  • 展示了攻击者可以利用多种密码学设计漏洞来攻破ASP.NET web应用;
  • 描述了一些实用高效的攻击允许攻击者窃取密码学密钥和伪造认证令牌来访问敏感信息。这些攻击联合了解密预言机、未认证加密和多种加密意图的密钥重用。
  • 提出web技术中密码学被误用的部分原因,以及避免这些错误的方法。

Introduction

  • 由于HTTP是无状态协议,web开发者通常把用户会话状态数据放在客户端,他们希望会话信息保密,就需要使用密码学,但是使用密码学常常会出错。
  • 本文观察到未认证加密常常被用来加密会话状态数据比如HTTP cookie和view state。未认证机密在认证系统中尤其危险。能够伪造明文对应密文的能力可以使得攻击者能够假扮成其他用户。
  • Web开发者还常对不同的加密意图使用相同的密钥。多种密码学错误结合在一起使得Web很容易遭受选择密文攻击。
  • 本文观察到ASP.NET v4.0中的若干密码学漏洞,最严重的是未认证加密。本文提出两种攻击方法使得攻击者能够窃取密码学密钥、伪造认证令牌、摧毁所有ASP.NET v4.0应用中的安全模型。这两种攻击方法都是结合解密预言机的选择密文攻击。这些攻击的新颖性在于攻击者不仅能够解密ASP.NET中的密文,他还能构造密文,使得ASP.NET解密处理后允许他检索敏感信息。

An Overview of ASP.NET

Key concepts and Terminology

  • Machine Key:一组设置在web应用配置里的全局密钥,用来进行加密和认证。ValidationKey用来生成HMAC以保护authentication ticket和view state的完整性,decryptionkey用来加密和解密authentication ticket和view state。
  • View State:这是ASP.NET提供的一种状态管理函数。它被用来维护网页表单的controls和widgets的状态。ValidationKey被用来从view state的内容生成一个HMAC。这个HMAC被存放在ASP.NET表单的一个隐藏域里。当ASP.NET收到一个有非法HMAC的请求时,就抛弃这个请求。在本文的测试中,ASP.NET v4.0 要么认证view state要么加密view state,但是没有同时进行这两个操作。
  • Forms Authentication Tickets用来记住用户的登陆状态,在全站跟踪用户,其中包含用户名,ticket版本号,目录路径,签发时间,过期时间等信息,然后ticket被序列号,从序列号数据中利用validationKey生成HMAC。HMAC加在序列号数据后面,整体用AES或DES加密,最后得到的字符串称为form authentication ticket,通常存在HTTP cookie里面,也可能放在一个查询字符串里。后面认证的时候就提取这个字符串,解密,计算hash值对比是否被篡改过
  • Web Resources and Script Resources:请求资源文件的格式是“webresource.axd?d=encrypted_id&t=timestamp”,对于d这个参数,ASP.NET加密它,但是没认证密文。同时,如果一个攻击者能伪造出一个合法的d参数,那么他就能从应用根目录里下载任何文件,比如web.config,这个文件里有很多重要信息可以用来伪造authentication ticket和database password。

Cryptographic Design Flaws in ASP.NET

  • Insecure Key Management:
  • The reuse of keys for different purposes;
  • Insecure key storage;
  • Key management is left to developers and users.
  • Improper Use of Cryptographic Primitives:
  • ASP.NET中的密码学API不默认使用认证加密;
  • ASP.NET使用MAC-then-Encrypt模式来进行认证加密,这种模式已经被证实是不安全的了。

Decryption Oracle Attacks

  • The Padding Oracle Attack:
  • padding oracle:能够接收一段密文后将其解密,告诉密文发送者padding是否合法;
  • POA基于这样的假设进行:攻击者能够截获CBC模式加密的填充了的消息,并能够访问padding oracle。攻击结果是攻击者能恢复任意块的密文对应的明文,平均使用128-b次oracle调用,b是一个block里面的字节数。
  • ASP.NET里面的padding oracle分两种:认证加密padding oracle(ASP.NET用MAC-then_Encrypt保护form authentication ticket,这种模式可被选择密文攻击,可以认为这里有一个padding oracle),未认证加密padding oracle;
  • Turning Decryption Oracles into Encryption Oracles:
  • CRC-R:如果攻击者能够设置IV,他就能利用CRC-R技术生成一段指定明文的对应密文。

Fig:1

  • CRC-R without controlling IV:如果攻击者不能设置IV,他可以把一段合法密文添加到伪造密文的前面,这样就可以保证解密后字符串的前几个字符是合法的,不会被服务器抛弃这个请求,请求的中间部分会有一个block是无意义字符串,后面的块可以解密成攻击者选定的字符串。同时攻击者也可以通过暴力攻击的方法生成一个合法header对应的密文块,后面再跟选定明文对应的密文块。

Fig:2

  • Using CBC-R to Attack ASP.NET: 为了下载文件,攻击者需要魏总一个d参数,解密后是这样的形式:R#anything|||~/path/to/file,其中前两个字节可以是r#,R#,q#,Q#。这是一个完美的利用CRC-R进行攻击的场景,可以构造一个三段字符串d,后两段解密后是garbage|||~/path/to/file,第一段通过暴力方法得到合法值,利用这样一个d,就可以下载文件了。

First Attack:CBC-R with padding oracles

ASP.NET里有很多独立于应用的padding oracle,每一个都可以结合CRC-R构造出d参数。这里介绍的攻击中,使用WebResource.axd中的padding oracle。 – Attack implementation: – 攻击者能从WebResource.axdxiangying 中推测填充信息。这很容易实现,如果padding不合法,websource.axd返回500 HTTP响应,否则返回404 HTTP响应。 – 攻击者建立一个类似Vaudenay的分组解密算法。构造一个三组信息= Cvalid|Crandom|Ctarget。Cvalid是ASP.NET中很容易发现的合法资源标识符,攻击者需要它来使消息解密后形式像资源标识符,否则ASP.NET会返回500 HTTP响应。攻击者不停变换Crandom直到获得404响应,表明找到一个合法padding。然后利用Vaudenay最后一位解密算法解密Ctarget最后一位,然后再变换Crandom,再用Vaudenay分组解密算法解密剩余部分。 – 攻击者有一个可靠的分组解密算法后结合CBC-R来构造d参数。

Fig:3

  • Attack cost: 假设每一个块大小为16,则|||~/web.config只占一个块,对每个块,攻击者进行128-b次oracle调用,,所以攻击者共需要214 + 128 – b = 18432次HTTP请求。

Faster attack:CBC-R with T-block Decryption oracle

  • The T-block Decryption Oracle in ScriptResource.axd:。 ScriptResource.axd里面有一个decryption oracle:如果解密d参数后的第一个字节是“T”,处理程序会把解密数据都发送给客户端。为了出发这个decryption oracle,攻击者需要找到一个T-block它的第一个字节解密后是“T”。不过这里有个问题是处理程序把解密数据发给客户端之前会进行字符编码转换,加入很多噪声,需要处理一下。
  • Attack Implementation:
    • 攻击者随机生成一个block,把他发送给ScriptResource.axd,看是否返回HTTP 200响应和包含解密数据的HTML内容。
    • 构造CRC-R Cn,Cn-1,…C1链,并找到一个合适的C0.
    • Attack cost:攻击代价由三部分组成:找T-block,CRC-R,找合适的C0

Fig:4

Fig:5