[关闭]
@1qaz 2015-01-26T22:28:28.000000Z 字数 3392 阅读 1808

Crypto Misuse and Attack Scenario

密码学误用和攻击场景,和一些defense的建议
essays,tools,ctf problems,real world case

误用不一定会产生实际的攻击,但理论上的脆弱性就有被攻破的可能性
Nothing is impossbile!

Timing attack

最常见的版本应该是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

工具:
https://www.blackhat.com/docs/us-14/materials/us-14-Mayer-Time-Trial-Racing-Towards-Practical-Timing-Attacks.pdf

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 attacks

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 length extension

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

Hash collisions

火焰病毒(Flame),伪造微软的数字签名,签名算法为MD5,chosen-prefix collisions

Weak hash

XBOX "Tiny Encryption Algorithm" ("TEA") used as hash

MAC-then-encrypt fail

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,或者基于时间区分

CBC bit flipping

已知明文攻击,可以构造任意明文对应的密文

IV Problems

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通道,攻击者可以猜测一块敏感明文的内容,构造一个输入请求加密,比较密文是否与原来观察到的密文相同。

Padding oracle


java Cipher类doFinal函数在执行解密时会抛出javax.crypto.BadPaddingException异常

Defense:HMAC 解密前先验证密文,或者使用带authentication的模式,如GCM

PRNG

seed
srand(time())感觉这是一个非常不好的教材样例,大部分人第一次接触随机函数时书上基本都是这样写的

Ghost in the Shellcode 2015: MTGO
不安全的随机数生成算法
梅森旋转算法

RSA模数分解

https://github.com/ctfs/write-ups-2014/tree/master/asis-ctf-finals-2014/rsa-in-real-world
(没看懂)

RSA 共模攻击

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

ECC

到这里感觉已经变成密码学后门了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/

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