
これはSweet32攻撃(CVE-2016-2183)のデモンストレーションです:https://sweet32.info/
この攻撃は、CBCモードで3DESやBlowfishなど、ブロックサイズが小さい(64ビット)暗号アルゴリズムを悪用する誕生日攻撃の一例です。 攻撃には、既知平文を持つ暗号化ブロックを大量に生成する必要があります。生成後、同一の暗号化ブロックを特定し、未知の平文ブロックの平文値を特定するために利用できます。
この実装では、暗号アルゴリズムとして 3DES (Triple DES) を使用しています。これは64ビット(8バイト)のブロックサイズを持ち、実世界の3DESがSweet32攻撃に対して脆弱となるのと同じブロックサイズです。
2つの暗号文ブロックが衝突した場合(c_i = c_j)、次の式を使用して未知の平文を復元できます:
p_i = p_j ⊕ c_{i-1} ⊕ c_{j-1}
ここで:
p_i は未知の平文(例:秘密のクッキー)p_j は既知の平文(例:HTTPヘッダー)c_{i-1} と c_{j-1} は前の暗号文ブロックこれは、CBCモードでは衝突がブロック暗号への入力が等しいことを意味し、暗号化鍵を知らなくてもXORによる復元が可能になるためです。
保証された衝突を用いてデモを実行します:
# Step 1: Generate encrypted packet with secret cookie
python generate_rigged_packets.py rigged_demo.bin
# Step 2: Execute the attack to recover the cookie
python sweet32.py --block-size 8 rigged_demo.bin
この攻撃はSECRET COOKIEの値を表示し、その後、暗号文のみを使用してそれを復元します!
generate_rigged_packets.pyデモンストレーション用に保証された衝突を含むパケットを作成します。 クッキーの値は、既知平文ブロックと衝突するように細工されています。
sweet32.pySweet32誕生日攻撃を実行してクッキーを復元します。
Sweet32攻撃は誕生日のパラドックスを利用します。64ビットブロック暗号の場合:
これにより、長時間持続するHTTPSセッションでは3DES(および他の64ビットブロック暗号)が脆弱になります。
実際のSweet32攻撃(3DES、64ビットブロック)の場合:
| ブロックサイズ | ブロックサイズ | パケット数 | 必要なデータ量 | ブロック数 |
|---|---|---|---|---|
| 8バイト | 64ビット | ~785GB | ~785GB | ~2^32ブロック |
実際の攻撃では、同じ鍵で約785GBのデータを暗号化する必要があり、そのため主に長時間持続するHTTPS接続に影響を及ぼします。