TL;DR この2つの画像のMD5コリジョンは、今や(*) 簡単かつ瞬時に実現できます。
⟷
<a href=http://gunshowcomic.com/648>
火遊びはするな。MD5を当てにするな。
(*) 任意のファイルペアのコリジョンは何年も前から可能でしたが、毎回数時間かかり、近道もありませんでした。
このページでは、ファイル形式固有のトリックと事前計算されたコリジョンプレフィックスを利用して、コリジョンを瞬時に行えるようにします。
git clone を実行。スクリプトを実行。完了。
著者: Ange Albertini と Marc Stevens。
このドキュメントの目的は、既存の攻撃を広範に探求し、その過程でMD5がいかに脆弱であるかを示すことです(JPG、PNG、PDF、MP4、PEなどのあらゆる形式で即時のコリジョンが可能)。 また、一般的なファイル形式を詳細に調査し、 現在または将来の攻撃によってそれらがどのように悪用されうるかを明らかにします。
実際、同じファイル形式のトリックは複数のハッシュに適用できます。 (同じJPGのトリックは、MD5、 malicious SHA-1 および SHA1 に使用されました。) コリジョンが同じバイトパターンに従う限り利用可能です。
このドキュメントは新しい攻撃(最新のものは2012年に文書化されました)についてではなく、 既存の攻撃の新しい悪用形態についてです。
既知の攻撃の現状(2018年12月時点):
別のファイルのハッシュや指定されたハッシュに一致するファイルを取得する: 不可能
同じMD5を持つ2つの異なるファイルを取得する: 即時
任意の2つのファイルを同じMD5にする: 数時間 (72 hours.core)
特定のファイル形式(PNG、JPG、PEなど)の任意の2つのファイルを同じMD5にする: 即時
同じSHA1を持つ2つの異なるファイルを取得する: 6500 years.core
(*) crypt を使った例 - Sven に感謝!```
import crypt crypt.crypt("5dUD&66", "br") 'brokenOz4KxMc' crypt.crypt("O!>',%$", "br") 'brokenOz4KxMc'
# 攻撃
MD5とSHA1は64バイトのブロックで動作します。
2つのコンテンツAとBが同じハッシュを持つ場合、両方に同じコンテンツCを追加してもハッシュは同じままです。``` text
hash(A) = hash(B) -> hash(A + C) = hash(B + C)
コリジョンは、ブロック境界に計算済みの衝突ブロック群を挿入することで機能します。 これは、ファイル内のそれまでの内容に依存します。 これらの衝突ブロックは、いくつかの小さな差異を伴って非常にランダムに見えます。 (差異は各攻撃に固有のパターンに従います) そして、それらは小さな差異を導入し、最終的に これらのブロックの後にハッシュを同じ値にします。
これらの差異は、特定の性質を持つ有効なファイルを作り出すために悪用されます。
ファイル形式もトップダウンで動作し、そのほとんどはバイトレベルのチャンクで動作します。
一部の「コメント」チャンクは、ファイルチャンクをブロック境界に揃えるために挿入できます。 特定の構造を衝突ブロックの差異に揃えるため、 衝突ブロックの残りのランダム性をファイルパーサーから隠すため、 そして、パーサーから本来有効なコンテンツを隠す(別のコンテンツが見えるようにする)ためです。
これらの「コメント」チャンクは、公式には実際のコメントではないことがよくあります。 それらは単に、パーサーに無視されるデータコンテナとして使用されます。 (たとえば、小文字で始まるIDを持つPNGチャンクは補助的であり、必須ではありません。)
ほとんどの場合、衝突ブロックの差異は、コメントチャンクの長さを変更するために使用されます。
このチャンクは通常、このチャンクのデータの直前に宣言されます。
このチャンクの短いバージョンと長いバージョンの間のギャップに、
別のコメントチャンクが宣言され、一方のファイルのコンテンツ A を飛び越えます。
このファイルのコンテンツ A の後に、別のファイルのコンテンツ B を単に追加します。

ファイル形式は通常、パーサーをその時点で停止させる終端記号を定義するため、
A は解析を終了させ、追加されたコンテンツ B は無視されます。
したがって、通常は少なくとも2つのコメントが必要です。多くの場合3つです:
ファイル形式のこれらの共通の特性により、それが可能になります。これらは通常、弱点とは見なされませんが、検出または正規化によって排除できます:
| プレフィックス | = | プレフィックス |
|---|---|---|
| 衝突 A | ≠ | 衝突 B |
| サフィックス | = | サフィックス |
両方のファイルはほぼ同一です(それらのコンテンツはわずか数ビットの差異しかありません)
悪用:
2つのコンテンツをバンドルし、次にどちらかを行います:
この構造を持つ2つのファイル:
| プレフィックス | = | プレフィックス |
|---|---|---|
| 衝突 A | ≠ | 衝突 B |
| A | = | |
| = | B |
これにより、AまたはBのどちらかが表示されます。
2009年の最終版。
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
.. .. .. X. .. .. .. .. .. .. .. .. .. .. .. ..
.. .. .. .. .. .. .. .. .. .. .. .. .. X. .X ..
.. .. .. .. .. .. .. .. .. .. .. X. .. .. .. ..
差異はブロックの開始/終了点の近くにはないため、近くのバイトを制御できないので、悪用するのは非常に困難です。 潜在的な解決策は、周囲のバイトをブルートフォースすることです - cf PoCGTFO 14:10。
例:
空のプレフィックスを使用する場合:``` MD5: fe6c446ee3a831ee010f33ac9c1b602c SHA256: c5dd2ef7c74cd2e80a0fd16f1dd6955c626b59def888be734219d48da6b9dbdd