web-dev-qa-db-ja.com

元のSHA-1ハッシュを維持する方法でファイルを悪意を持って変更できますか?

this の記事や他の多くの記事によると、SHA-1は安全ではありません。

私の場合、パスワードやデジタル証明書については心配していません。ファイルの整合性が心配です。

ファイル(ISOイメージや実行可能ファイルなど)が次のような方法で悪意を持って変更されることは合理的に可能ですか?

  • 元のファイルのSHA-1ハッシュを維持し、
  • ファイルの全体的なコンテンツと操作を維持します(もちろん、元々そこにはなかった悪意のあるコンテンツが含まれています)

私の考えでは、SHA-1の衝突が発生するようにファイルを変更すると、ファイルはまったく役に立たなくなります。 ISOは完全に破損するか、実行可能ファイルが完全にスクランブルされて、もはや実行可能ファイルではなくなります。

しかし、私がそれを見る方法はまちがっているかもしれません。これまでのところ、SHA-1のファイル検証への継続的な適合性に関して、Google検索で何も見つかりませんでした。洞察はありますか?

33
misha256

SHA-1でこれを達成した人はまだいません。理論的には可能ですが、まだ実用的ではありません。 SHA-1の不安定性に関するレポートは、セキュリティレベルが私たちが望むほど高くないことを意味します。つまり、私たちが思ったほど心配する必要がなくなるまでに何年もかかりません。

特定のファイルと同じSHA-1ハッシュを使用してファイルを作成するのは、同じSHA-1ハッシュを使用して2つのファイルを作成するよりも困難です。そして、私たちの知る限り、この簡単な作業でさえ、世界中の誰もまだ達成していません。だからといって、明日は起こり得ないということではありません。

41
David Schwartz

理論的には可能ですが、まだ実現していません。

あなたが探しているものは「ハッシュ衝突」と呼ばれています:同じハッシュを持つ2つのファイル。 SHA-1のような暗号化ハッシュコードは、通常、これを困難にするように設計されています。 SHA-1は160ビットのコードであるため、重複を見つけるために平均して2 ^ 159のブルートフォース攻撃を試みます。暗号化ハッシュよりも確実に優れたアルゴリズムが見つかった場合、そのハッシュは「壊れている」と見なされます。

MD-5は、非常に壊れたハッシュの例です。強度は128ビットで、平均2 ^ 127回の試行が必要でした。既知の脆弱性を悪用すると、実際に必要な試行回数は2 ^ 47と低くなる可能性があります。これは2 ^ 127よりも小さいLOTです。実際、最新のコンピューティングクラスタでは1日足らずで行われています。

これは、SHA-1の使用方法に最も近いためです。ただし、これは、ハッシュが破壊されないようにするために暗号解読で使用される最も一般的な方法ではありません。通常、1つのファイルを選択して攻撃者が一致させることを求めるのではなく、攻撃者が選択した2つのファイル間の衝突を許可します。この種の攻撃には、ベンチマークが容易になるという利点があります。ファイルをクラックするのが「難しい」とわかった場合、それは別のファイルも同様に強力であることを意味しますか?攻撃者が両方のファイルを選択できるこの攻撃は、最悪の最悪の事態を確実に捉えます。

この種の攻撃は、「 誕生日の攻撃 」として知られる興味深いトリックを可能にします。簡単に言えば、誕生日攻撃を使用するとアルゴリズムの強度が半減するため、SHA-1には平均で2 ^ 80回の試行が必要であり、MD5では平均で2 ^ 64回の試行が必要です。これらはそれぞれ160と128の半分です。

SHA-1には、その強度を2 ^ 80から2 ^ 69に減少させる既知の攻撃があります。これはそれほど重要ではありません。 2 ^ 69回の試行は長い時間です。

ただし、歴史から、ハッシュアルゴリズムは自然に破壊されるのではなく、時間の経過とともに破壊されることがわかりました。 MD-5のようなアルゴリズムを一晩で2 ^ 64から2 ^ 47にクラックする人はいません。多くの個人がそれに対して使用している数学についての論文を発表しているので、それは時間の経過とともに起こります。通常、アルゴリズムの開始時から攻撃の複雑さが徐々に下がっていく様子を観察できます(通常、最良の攻撃は誕生日攻撃です)。

衝突にいくつかの変化が見られるという事実は、SHA-1がトンネルの終わりに光を見ていることを示唆しています。それはまだ強力ですが、現在より安全な最新のSHA-3にアップグレードしたいという要望があるかもしれません。

このような決定は、脅威モデルの観点から本当に行う必要があります。攻撃者がこれらの衝突の1つを受けた場合に、攻撃者がどれだけのダメージを与えることができるか。攻撃者は、いくつかのラップトップにアクセスできるスクリプトキディ、またはスーパーコンピューティングクラスタ全体を自由に利用できる政府ですか。攻撃者がハッシュを使用しなくなるまでの時間枠の大きさ(暗号化の多くの使用には、パスワードローテーションなどの「ガードの変更」が含まれます)。これらはすべて、衝突を考慮する必要のある深刻度に影響します。

26
Cort Ammon

この記事で説明されているSHA-1の欠陥は非常に具体的です。攻撃者は同じ値にハッシュする2つのものを作成することができます(これは「衝突攻撃」と呼ばれます)。ただし、衝突攻撃では、攻撃者が関与する両方ファイルを制御する必要があります。攻撃者が元のファイルを制御していない場合、衝突攻撃では同じハッシュ値を持つ別のファイルを見つけることができません。

これがTLS/SSL(および一般的に署名)に重要な理由は、これらの場合、攻撃者は多くの場合canで両方のファイルを制御するためです。 TLS証明書は、ほとんどの場合、それを要求する人によって作成されます(制御できないビットは予測可能であることが多いため)。したがって、衝突により、正当な証明書と不正な証明書が作成され、正当な証明書が署名され、署名が転送されます。

ファイルの場合、同じ状況が常に当てはまるとは限りません。ファイルを作成する人が攻撃者であることが懸念される場合(たとえば、1つのものが正当であると個別に検証され、同じハッシュで悪質なペイロードが送信されるなど)、SHA-1攻撃が適用されます。段階的廃止に向けて(ただし、David Schwartzが述べたように、まだ重要ではありません)。元のファイルが信頼できる場合、攻撃者は現在知られているSHA-1攻撃を適用することはできませんが、可能な場合は段階的に廃止することを検討する必要があります(選択肢がある場合は、SHA- 2)。


「衝突は役に立たない」への対応-攻撃は、攻撃者が有用衝突を取得できるようにする必要はありませんが、「衝突」を回すことはそれほど難しくありません「便利な衝突」に。多くのファイル形式には、ファイルの機能に影響を与えることなく、必要なものをすべて含めることができるかなりの量のスペースがあります。攻撃者は通常、機能部品を意図したとおりに維持しながら、衝突を取得するために(衝突が実際に検出可能な場合)変更することができます。 「学術的攻撃」と「実践的攻撃」のギャップは大きくなる可能性があります。 「任意の衝突」と「有用な衝突」の間のギャップは一般にはるかに小さくなります。


アルゴリズムの選択とは関係のないより深刻な問題は、ハッシュの取得方法です。ハッシュが行うことは、問題を「実際のファイルを取得する」から「実際のハッシュ値を取得する」にシフトすることだけです。ファイルと同じサーバーから同じ接続タイプを介して送信されるハッシュ値は、悪意のある変更に対してはまったく役に立ちません(ファイルを改ざんできる攻撃者はハッシュを改ざんできます)。ハッシュは、ファイルを信頼できるよりもハッシュを信頼できる場合にのみ役立ちます。それは時々ありますが(トレント、ミラー)、そうでない場合によく使用されます。そのため、整合性の検証にハッシュを使用する場合は常に注意が必要です。

8
cpast

衝突攻撃プリイメージ攻撃を区別する必要があります。同じ値にハッシュされるany twoメッセージを見つけることは衝突攻撃です。
特定の特定のメッセージ(ここでは実行可能ファイル)を同じハッシュを持つ別のメッセージに置き換えることは、(2番目の)プリイメージ攻撃です。

SHA-1は、2で衝突攻撃を実行できる限り壊れています。52 ウィキペディアの記事によると、その番号の引用を提供していない操作(私が知っている、実際に信頼できる最高の攻撃は、マークスティーブンスによる攻撃で、260 操作)。 仮定の悲観的な2の場合を考えましょう52

これは、そのスケールでの攻撃が理論的に考えられるだけでなく、実際に完全に実行可能であるという懸念があります1日以内マルチGPUリグ。もちろん、これは、「任意の2つの」メッセージが行うアプリケーションの問題です。 260 スティーブンスが与えた数値(これは256倍の作業です)は、攻撃者が問題にいくらか余分のお金を投入するか、1年の時間を費やす意思がある場合に完全に実現可能です。
これはまさに防止できませんスパイ活動やサイバー犯罪に関与している人物が証明書を偽造することを防止します。

現在、プリイメージ攻撃の指数は2倍なので、252 衝突攻撃の場合は2になります104 まったく別の球場です。

これは非現実的であるだけでなく(前の段落で述べたものよりも10億倍速いマシンでも約600万年かかります)、エネルギーを生成するという私たちの狡猾な手段を考えると、これは完全に不可能です。

このような大規模な計算を行うには、1回の操作に費やすことができるものよりもはるかに大きなエネルギー源が必要になります。いいえ、太陽ほどのエネルギー源ではありませんが、それでもかなり大きなものです。

現実的には、1ワットから10〜50 GFLOPSの何かを期待できます。ある種の奇跡が起こり、プロセッサが一晩で約数千倍のエネルギー効率を上げると仮定すると、1 SHA≈1 FLOP(かなり楽観的です!)と想定できます。これは、実行2104 10年以内のハッシュ計算、あなたは10が必要です12W発電所。 1年以内に攻撃を実行するには、1013W発電所。これは、米国、フランス、および日本の原子力発電所全体が一緒に生産できるエネルギーの約50倍です。

これは起こりませんです。同じ目標を達成するはるかに簡単な方法があります(元のハッシュを格納するサーバーを悪用し、そのハッシュを置き換える、誰かを脅迫するなど)。

5
Damon

質問で言及されている記事のgeneralポイントは次のとおりです。SHA1は非推奨であり、スムーズに実行する時間がある間に段階的に廃止する必要があります。一部の地域では、GoogleとMicrosoftが期限を設定しているため、時間がなくなりつつあります。

非推奨 テクノロジーの経験則:

  • 新しい設計を行ったり、機能を追加したりする場合は、使用しないでください(SHA1)。
  • 古いものを維持している場合は、いつ交換するかを計画します(SHA1)。

Bruce Schneierによる2012年のブログ投稿の要約引用: "コミュニティの私たちが、SHA-1からSHA-2/SHA-3への移行を今すぐ開始する必要があるということです。"

2
jmn

質問のSHA-1ハッシュ衝突部分については、これはいくつかの回答で対処されています。

ただし、これの大部分は、処理するファイルのタイプに依存します。

ファイルの全体的な内容と操作を維持します(もちろん、現在は もともとそこになかった悪質なコンテンツ 変更内容)

これが何を意味するかは、変更を検出しているものによって大きく異なります。

  • 署名された実行可能ファイルであり、(合理的な)チャンスではない場合:どういうわけか、ファイルのSHA-1と内部の.exe署名という2つのハッシュ衝突が発生する必要があります。
  • 署名されていない実行可能ファイル、.com、署名されていない.dllなどの場合、それらのリソースフォークは、操作を変更しない方法でに追加できるため、(通常は)「通常」では検出できないハッシュ衝突が発生する可能性があります。操作。
  • ソースコードファイルまたは同様の構造(.cs、.c、.h、.cpp、.rb、.yml、.config、.xml、.pl、.bat、.ini)の場合、追加、変更、または削除有効なコメント構文に制限して、ほとんどの用途(変更またはコンパイル、実行、テキストエディターで開かない)で変更を識別できないようにすることができます。
  • .iso、.Zip、またはその他のコンテナ形式の場合、ランダムな変更のほとんどがコンテナを破損するため、可能性も低くなります。可能です:偽のファイルエントリを追加するか、コンテナ内のコンテンツを変更して再確認しますが、複雑さの層を追加し、結果を確認するための時間を追加するとともに、自由度が制限されますどのように、どのような内容が変更される可能性があります。
  • それがテキストまたはテキストのような形式である場合、コンテンツはおそらく目立ちますが、「有効な」ファイルでありながら、好きなように変更できます。
  • .rtf、.doc、.html、.xslx、およびその他のマークアップ風のフォーマットのような多くのフォーマットでは、パーサーが検出できない方法で、長さ以外に(または長さに制約がある場合でも)追加または変更できます。 、より少ない自由度)ファイルは(最終的には)有効なファイルであるだけでなく、それらが使用される典型的なアプリケーションから見えるような方法で顕著に変更されないままハッシュ衝突を起こすように変更できます。

したがって、残っているのは、破損しておらず、おそらく検出できないある程度の構造で衝突を取得する方法です。

  1. 必要な機能変更(おそらく悪意のあるコンテンツの挿入)を行い、追加の変更を加えて、ファイル形式固有の有効性を保持します。
  2. 機能しないセクションを追加します(コメントブロック間、3Kキャリッジリターンが上にあるテキストファイルの最後、現在のコメントブロックを分離)
  3. 変更する文字/コードポイント/バイトを追加または選択し、考えられるすべての有効な組み合わせを試します(たとえば、すべてのバイトの組み合わせがさまざまなエンコーディングで有効であるとは限りません)。
  4. ハッシュを再計算し、衝突が一致するかどうかを確認します。
  5. そうでない場合は、3に進みます。

非常に高速なコンピューターと小さめのファイルがあり、有効なバイトシーケンスでの変更とハッシュの再計算に1ミリ秒かかるとしましょう(おそらくいくつかの専用ハードウェアが必要です)。 Ifハッシュ分布が完全にランダムであり、範囲全体に分散されている場合、SHA-1との衝突が2^160試行(ブルートフォース)。

2^160/1000/60/60/24/365.24 
= 4.63x10^37 years 
= 46,300,000,000,000,000,000,000,000,000,000,000,000 years 
= 46 undecillion years.

でもねえ、2^60および2^52バージョンを使用して、好きなようにファイルを変更できるように(そうではありません)、1回の試行で1ミリ秒で実行できるように見せかけます。

2^52 yields 142,714 years 
/*humans might still be around to care, but not about these antiquated formats*/
2^60 yields 3.65x10^7 years = 36,500,000 years 
/*machines will probably have taken over anyway*/

しかし、ちょっと、あなたは幸運になるかもしれません。本当に、本当に、幸運なことに、人々が何よりも奇跡を起こす奇跡。

2
Ehryk

実際にはそうではありませんが、一度にこれらの条件の1つを満たすことができますが、両方を満たすことはできません。私の知る限り

0
Anthony Guess