@1qaz
2015-01-26T22:28:28.000000Z
字数 3392
阅读 1808
密码学误用和攻击场景,和一些defense的建议
essays,tools,ctf problems,real world case
误用不一定会产生实际的攻击,但理论上的脆弱性就有被攻破的可能性
Nothing is impossbile!
最常见的版本应该是SQL注入中的计时攻击,在密码学比较字符串的过程中,如果不同的输入在比较时耗时不相等,就存在被暴力枚举的可能性.
攻击者的难点在于处理网络延时造成的噪音,但在嵌入式设备上本地爆破是可行的。
相关函数
hmac.compare_digest
https://docs.python.org/2/library/hmac.html
java.security.MessageDigest.isEqual
http://docs.oracle.com/javase/7/docs/api/java/security/MessageDigest.html#isEqual(byte[],%20byte[])
样例
python oauth
http://seb.dbzteam.org/crypto/python-oauth-timing-hmac.pdf
Google Keyczar
a = HMAC.digest(secret)
b = HMAC.digest(userinput)
a == b 存在计时攻击的风险
#time-constant comparison def is_equal(a, b): if len(a) != len(b): return False result = 0 for x, y in zip(a, b): result |= x ^ y return result == 0
ECB模式,相同的密文会产生相同的明文,很多密码库(JCE,PyCrypto)的默认模式就是ECB,存在pattern枚举、分组顺序被重排的问题
相关函数
javax.crypto
Cipher.getInstance("DES") 即
Cipher.getInstance("DES/ECB/PKCS5Padding")
def do_crypto(userdata):
c = DES.new(key) #ECB
return c.encrypt(userdata + "this is secret..")
攻击者可以控制输入,让待猜测的一个明文字节位于分组边界,得到这个分组的密文,然后再此输入的结尾增加一个字节用来枚举待猜测的明文.
AAAAAAAAthis is secret..
|------||------||------|
AAAAAAAthis is secret
AAAAAAthis is secret
this is secret
|------||------||------|
AAAAAAAAAAAAAAAthis is se
AAAAAAAAAAAAAAthis is se
hash长度扩展攻击
verifier = Hash(secret || data)
client send data & verifier to server
攻击者截获了data和verifier,尽管不知道secret的值,仅枚举secret的长度,攻击者可以在data之后添加任意内容,并算出对应的hash值
Hash(secret || data || pad || anything)
most hash algorithms (MD4,MD5,SHA,SHA1,SHA256,SHA512,whirlpool) can “pick up where they left off”
Defense:HMAC
Tools:hash_extender https://github.com/iagox86/hash_extender
Real World:http://netifera.com/research/flickr_api_signature_forgery.pdf
CTF:https://github.com/ctfs/write-ups-2015/tree/master/ghost-in-the-shellcode-2015/crypto/knockers
火焰病毒(Flame),伪造微软的数字签名,签名算法为MD5,chosen-prefix collisions
XBOX "Tiny Encryption Algorithm" ("TEA") used as hash
Authenticate And Encrypt :E(k1,P) || MAC(k2(P)
Authenticate Then Encrypt : E(k1,P || MAC(k2,P))
Encrypt Then Authenticate : E(k1,P) || MAC(k2,E(k1,P))
这个其实和Padding oracle配合使用的,攻击者可以选择密文。mac是明文的一部分,所以解密后会先检查pading,然后再检查mac,需要攻击者可以区分padding error 和mac error,或者基于时间区分
已知明文攻击,可以构造任意明文对应的密文
fixed IV
流密码中,IV指初始的状态向量(数组),IV的固定导致密钥流的固定,十分危险
Real World:
Microsoft Word&Excel 2002 ,当一个加密了的文档被修改保存后,IV仍然不变,攻击者如果获得使用同一密钥流的不同密文,就能恢复出很多信息。
predictable IV
BEAST attack
HTTP是多请求的,一个SSL通道内有多次HTTP通信,而SSL v3和TLS1.0设计的时候,将多个请求当成一个数据流来分块加密,多次请求中的IV和KEY都维持不变。
在CBC模式中,明文要先和上一块的密文异或后作为加密函数的输入,而密文是公开的.攻击者与受害者处于同一个SSL通道,攻击者可以猜测一块敏感明文的内容,构造一个输入请求加密,比较密文是否与原来观察到的密文相同。
java Cipher类doFinal函数在执行解密时会抛出javax.crypto.BadPaddingException异常
Defense:HMAC 解密前先验证密文,或者使用带authentication的模式,如GCM
seed
srand(time())感觉这是一个非常不好的教材样例,大部分人第一次接触随机函数时书上基本都是这样写的
Ghost in the Shellcode 2015: MTGO
不安全的随机数生成算法
梅森旋转算法
https://github.com/ctfs/write-ups-2014/tree/master/asis-ctf-finals-2014/rsa-in-real-world
(没看懂)
C1 = P ^ e1 % N
C2 = P ^ e2 % N
用e1,e2两个私钥对同一明文P加密,他们共享了模数N
在gcd(e1,e2)=1时,由扩展欧几里得,有k1*e1 + k2*e2 = 1.假设k1<0,则(C1^-1)^(-k1) * C2^k2 %N=P
到这里感觉已经变成密码学后门了Kleptography
Dual EC DRBG
http://www.8btc.com/satoshis-genius-unexpected-ways-in-which-bitcoin-dodged-some-cryptographic-bullet
下面这个是在RSA的模数里面插了加密后的生成私钥时的随机值,所以能够从公钥里推出私钥
http://kukuruku.co/hub/infosec/backdoor-in-a-public-rsa-key
https://www.reddit.com/r/crypto/comments/2ss1v5/rsa_key_generation_backdoored_using_curve25519/