密碼學漏洞與他們的產地 Crypto fail and where to find them

  • View
    2.441

  • Download
    0

  • Category

    Software

Preview:

Citation preview

密碼學漏洞與他們的產地zuan@chroot.org

Who am I

- Zuan

- chroot讀書會成員- 什麼都略懂一點,但什麼都不精通- 愛玩資訊跟電子領域的各種事務- 興趣是騎腳踏車跟買學生證

Content

- 非對稱式演算法- 對稱式演算法- 雜湊- 其他

這邊有人沒有聽過 RSA的嗎 ?請舉個手

c ≡ ne (mod (N))n ≡ cd (mod (N))

ed ≡ 1 (mod φ(N))

c -> 密文n -> 明文

(e,N) -> 公鑰(d,N) -> 私鑰

一般為了加速計算, e會取很小(e=65537 or e=17 or e=3)

如果 ne < N且 e = 3

那不是開方根就能解密了?

...

OK,那如果效能不是問題,我 e選大一點總可以吧?

如果要加密 0或 1

0^e = 01^e = 1

...

Encrypt(‘A’) = YCD6WGtUMNDedQ2HjC5KzSVTEncrypt(‘B’) = REfHH3SCzed6jkRhP6JZwytHEncrypt(‘C’) = aSWP4Z6cX2VYWMxwA9bGMKRAEncrypt(‘D’) = sRuHR8t8Vmy3th8Gf2RAVfkzEncrypt(‘E’) = F4ahebRHXUyzzeNgcBzN4r26

Encrypt(t) = aSWP4Z6cX2VYWMxwA9bGMKRAt = ?

就說該都猜 C

一個加密演算法不該有那麼多毛

以上這些弱點都可以透過 Padding來解決

加解密: PKCS #1 v1.5, OAEP簽章: PKCS #1 v1.5, PSS

Plaintext n

Padded Plaintext n

Ciphertext n

OAEP

RSA

如果自己實作 Signature Padding應依照標準驗證簽章

Python RSA出過類似包CVE-2016-1494

[問掛 ] 有沒有 RSA很慢的八卦?

2048 bit/op * 768.3 op/s ≈ 200 kB/s2048 bit/op * 26270.6 op/s ≈ 6.7 MB/s

撥接喔?!╯ -____-) ~═╩════╩═╯

加解密 (AES): 75~90 MB/s簽章 (SHA2): 30~300 MB/s

RSA iPad AES/SHA!

RSA Weak Key

RSA的 Key不是找兩個大質數就夠了

CVE-2008-0166

亂數產生器不夠亂,某些質數出現機率高

=> 直接猜那些質數可破密

=> 拿一堆 N來 GCD也可以破一發( shared factor)

N1 = p1*q1N2 = p2*q2

若 p1 = p2, p1 = GCD(N1,N2)

Weiner’s Attack

不常見,記得 d > ⅓ N¼就好

Pollard p-1 Factorization

也不常見,建議 (p-1)/2也要是質數

TL;DR懶人包 : 生 Key? OpenSSL

[問掛 ] 有沒有 RSA很慢的八卦?

...

你有聽過橢圓曲線嗎?

對稱 RSA ECC

80 1024 160

112 2048 224

128 3072 256

192 7680 384

總時間上,橢圓曲線遠比同級的 RSA快

ECDSA 256 bit Public Key: AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCv5hlgEJBGfQfF/4RdBDMv0hiaeNbwqwkyW4ntYsUUroqqFQMROgYSdHr2bqmX0BCX87l95Hynh2nUPxbOvWtg=

RSA 2048 bit Public Key: AAAAB3NzaC1yc2EAAAADAQABAAABAQD4XK2ooKXQZFIrzTlu6sIVOTdnLDcKc1Qn/WvrGCBFRx5jTfKlJflCVb0BdhPayaYwibMzu87rn6IzfKdc3yEivcRIKJ0Vv/z86jjbK1V7zlTXyhvp0I2IUgL46HTFQVykn88dcj0CX0vuuITfr+sHjSLG8icBrZHOoiAXYI8xdbZFZ5BZFp5IbeD5QZ2BNotK1SkMAt1ls2AZD48toBoX0lMiWf7pufdviQw8GIkQo7Jm52QDFPj2QPUocVLeqCvzreWgu0SSfaIEDUMScM9alS/OBajrorQI9/eT85H57sv3che8ascbwN48EpQngBwwzylUl0WmsjYneybGW8xT

Key小就是爽啦

下次也考慮下 ECC系列吧

但如果 Public端為嵌入式,則可考慮RSA

如果用 ECDSA一定要記得

不要 Sony

Sony進行 PS3的 ECDSA簽章時每次 k都一樣

兩次 k 一樣的簽章 = 洩漏私鑰

RSA有 Side Channel問題

想想Modular Exponentiation

def modexp( base, exp, mod ): out = base if (exp[0] == 1) else 1 for i in range(1,len(exp)): out = (out * out) % mod; if exp[i] == 1: out = (out * base) % mod return out

def modexp( base, exp, mod ): out = base if (exp[0] == 1) else 1 for i in range(1,len(exp)): out = (out * out) % mod; if exp[i] == 1: out = (out * base) % mod return out

量測 CPU Cache Hit/執行時間 /使用功率可以看出這步有沒有執行

執行在同一顆 CPU的其他程式或是對CPU有實體權限的攻擊者有機會破密

RSA要避免類似 Side channel較麻煩ECC也有類似問題 (Double or add)

進幾年 HITCON有示範過

bit 0 1 2 3 4 ...

0 1 1 1 1 1 ...

1 M^1 M^2 M^4 M^8 M^16 ...

如果有這考量,可以用現成的 Library,或是用 Ed25519

玩夠非對稱式的,來聊聊對稱式的吧

用過 Stream Cipher吧?

RC4, OFB/CTR Mode的 Block Cipher,Salsa20, ChaCha20

Stream Cipher的 IV/Nounce每次加密一定要不一樣,否則加密多少,就能解密多

Win32/Dircrypt.A

如果有使用某些舊的 Block Cipher,需要注意Weak Key

尤其是 Blowfish

AES沒這煩惱,把把都是好 Key

Block Cipher跟 RSA一樣不能單用

要搭配 Cipher Mode of Operation

看維基百科秒懂

那不然要用什麼?

大多人會推薦 CBC

Source: Wikipedia

但是 CBC有 Padding Oracle問題

解密時如果 Padding不對,不能讓對方知道

if not VerifyPadding( … ): // ERROR return

if not VerifyHMAC( … ): // ERROR return

除了 CBC以外,還有什麼可以用?

看看 Google用什麼吧

[問掛 ] 有沒有 GCM的八卦

GCM其實很好用

內帶驗證,且效能高

考慮拿 GCM取代 CBC+HMAC

Hash

還在用md5的舉手

md5跟 sha1都已經過時讓他們安息吧

大家密碼都怎麼存?

a)明碼md5sha1sha256/sha512md5+saltsha1+saltsha256/sha512+salt

salt可以避免 Rainbow Table

不要再猜了,答案是以上階非

Source:https://gist.github.com/epixoip/973da7352f4cc005746c627527e4d073

hash的設計都是在安全的狀況下盡量快

所以要用另一類專門的函數 -- KDF

Key Derivation Function

設計就是要慢

Source:https://gist.github.com/epixoip/973da7352f4cc005746c627527e4d073

考慮使用 PBKDF2, scrypt, bcrypt

內建 Salt, 可調運算強度

純 Hash不應該拿來做驗證

不少 Hash有 Length Extension的bug feature

給 H(A), 不知道 A, 可以求 H(A+B)

H(secret || msg) 不安全

如果有驗證需求,請用 HMAC

HMAC = H( K1 || H(K2 || M) )

其他

亂數 ?

rand()

當然不是

如果需要少量的亂數 (生 Key)就跟系統拿 Entropy

*nix: /dev/randomWin: RtlGenRandom()

/dev/random是稀有資源

urandom沒有快到哪裡去

需要大量亂數 ? 用 entropy去 seed PRNG

Hash_DBRG, CTR_DBRG

不要 Dual_EC_DBRG

封包大小有 Side Channel問題

透過 ssh tunnel上網

Google 台科大官網

不難看出誰是誰

GFW就是這樣抓 VPN的

若要避免,可以用 obfs4/ScrambleSuit

語音也有一樣問題

HTTPS很好用

但是它其實會洩漏 Server的 Domain

最後,東西用完記得收

有些勒索軟體可以用刪除復原 /硬碟救援工具還原

因為他們檔案用完沒有 Shred

*nix: shredwin: sdelete

記憶體也可能殘留,用完記得複寫再釋放

結論

能用現成整套的,就用

HTTPS/TLS, SSH, GnuPG

如果需要單獨使用密碼學的元素請用現成 Library

Crypto++, CryptoJS, libsodium… etc

END謝謝大家

小抄 /懶人包1. 非對稱加密相關問題與建議1a. 非對稱式加密應該搭配對稱式加密使用。1b. RSA不能直接用,需要搭配專門的 Padding Scheme。1c. RSA存在Weak Key。 (Pollard p-1 Factorization, Shared Factor, Weiner)。1d. 可以考慮 ECC系列演算法,因為安全性下,需要較少運算。1e. RSA跟 ECC都存在 Timing/Power Side Channel,如果要避免,

可以考慮 Ed25519。1f. ECDSA每次簽章的 k必須隨機不重複。 (PS3因此被破解 )1g. 簽章驗證應該依照標準檢測所有參數。 (ie. CVE-2016-1494)2. 對稱演算法相關問題與建議2a. Stream Cipher必須有 Nounce,且必須每次不一樣。2b. 部份 Blocker Cipher有Weak Key。 (例如 Blowfish)。2c. Block Cipher應注意 Cipher Mode,不該單純用 ECB。2d. Block Cipher的 Padding Oracle問題。2e. Block Cipher Mode建議使用GCM模式,因為性能較優異且帶有驗證功能。

3. Hash相關問題與建議3a. md5/sha1應淘汰。3b. 密碼不應該用單純 Hash存,應該使用 PBKDF或 scrypt。3c. 注意 Length Extension Attack,因此 HMAC請照標準 HMAC格式走。4. 其他4a. 亂數應該使用標準的亂數演算法 (NIST系列, DUAL_EC_DRBG除外 )。4b. 亂數應確保有足夠的 Entropy。4c. 封包的大小與 Timing有 Side Channel。4d. 承 4c,該漏洞可利用於破解通話加密,以及分析 TLS裡面瀏覽的網站內容。4e. TLS有 SNI會洩漏你瀏覽哪個網站。4f. 除非必要,建議使用現成,常用的套件或協定 (ie. OpenSSL+TLS)4g. 注意殘留,硬碟 /記憶體需要 Shred,如果使用現成套件,用完要釋放。

Recommended