[关闭]
@1qaz 2016-05-27T15:23:09.000000Z 字数 2110 阅读 1276

Nonce-Disrespecting Adversaries: Practical Forgery Attacks on GCM in TLS

GCM TLS


Hanno Böck, Juraj Somorovsky et al. Technical report ,Black Hat USA 2016
一句话:作者研究了AES-GCM中的nonce重用问题。网络扫描发现有184个HTTPS server使用重复的nonce,这将导致TLS认证性的完全丧失

1.Background

gcm
J0 = IV || 031 || 1
J0 16字节, IV 为 12个字节, 再加上4个字节的counter。counter从1开始,每个block递增
A: Additional authenticated data 认证数据 TLS中是record header和sequence number
GmulH: Galois Field GF(2^8) 多项式乘法 H = ENCk(0128),H是认证的key
GCM模式下明文和密文长度相同,无填充, 最后一个block ENC 后取MSB
T: Authentication tag

解密方收到C和tag,先验证tag是否匹配,然后ctr模式解密

AES-GCM in TLS
GCM IV = salt || nonce
master secret生成server write iv 和client write iv,4个字节,GCM IV的隐式部分 salt
nonce为8个字节 IV的显式部分 随密文发送 要求nonce 是unique的

2.The Forbidden Attack

Joux在2004年提出了在nonce reuse时对GCM的攻击,攻击者可以恢复出认证的key H,从而可以伪造消息
tag T看作关于H的函数
n个block的明文,m个block的A
g(X) = A1Xm+n+1 + ... + AmXn+2 + C1Xn+1 + .. + CnX2 + LX + S (S笔误? Enck(J0))
加法和减法运算是异或,L是len(A)||len(C),除了S之外 攻击者知道所有的参数
g(H) = T

在一个TLS session中,当两个消息使用相同的nonce加密时,(简化为一个block)
g1(X) = C1X2 + L1X + S
g2(X) = C2X2 + L2X + S
攻击者可以看到流量中的Tag,将方程减去tag
f1(X) = C1X2 + L1X + S + T1
f2(X) = C1X2 + L1X + S + T2

f1(H) = f2(H) = 0
nonce相同时,IV=salt||nonce相同,Enck(J0)相同, S相同,两个等式相加消去S
f1(X) + f2(X) = (C1+C2)X2 + (L1+L1)X + T1 + T2
攻击者知道该方程的所有参数,f1(H) = f2(H) = 0 ,分解多项式就得到H的候选.如果不止一次nonce 相同,取交集

TLS rfc中并没有清楚地指导nonce的用法
rfc

重复的nonce:
随机的nonce:有可能重复
正确做法:计数器 +1

3. Internet-wide Survey & Vulnerable Devices

massscan,2016,2 day,4亿个ipv4 地址,

184 device 使用重复的nonce 其中
66个 0100000003001741
84个 random value first,zero value
23个 always zero
其他

作者猜测至少有4种错误的实现
联系device owner, Radware负载均衡器 使用了修改过的OpenSSL 1.0.1j, 生成随机数没有检查是否返回error,如果随机数生成器出错,iv就是未初始化的内存

其他一些设备HTTP header 中看到Check Point, LFSR 线性反馈移位寄存器 attack?

4. A Practical Attack on Browser HTTPS

中间人环境 Client Malicious nonce重用的Server
1. M让C加载一个被攻击者控制的内容 (钓鱼)
2. M让C运行一个javascript,向S发起一个HTTPS连接。M观察到握手消息,如果加密方式不是GCM就停止攻击
3. 成功握手后,M记录S发送的密文,以下字段
* sequence number
* record header: 密文长度、tag
* record层的前8个字节 :显式nonce
* record层的最后16个字节:tag
* record层其他数据:密文
4. M让C在一个TLS session中不断发送请求
5. 当S有重复的nonce出现时,将相关的密文、tag等建立一个多项式
6. M分解该多项式得到H的候选列表,如果有之前的候选的话求交集
7. 如果不止一个候选,重复步骤4;否则M得到H,M将C重定向到S的一个静态页面
8. M拦截S返回的密文,因为这是一个静态页面,M知道明文的内容,明文xor密文得到key,key xor 任意内容 伪造消息,利用之前得到的H重新计算tag

如果S不存在任何静态HTML页面,M可以选择攻击静态资源如CSS、javascript,同时还需要将HTTP response
header改成text/html

Botan 1.11.28,BouncyCastle Java 1.54,SunJCE 1.8 ,OpenSSL 1.0.2g, none is vulnerable...

xss

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注