暗号を鍵無しで解読するパディングオラクル攻撃

/.から。

ASP.NETRuby on RailsJSFに存在するってのはちょっとインパクトある見出しだったので。
パディング実装の脆弱性ってのがちょっとイメージつかないな。そもそも攻撃名の由来であるオラクルマシンについて理解が足りないからだろう。

まずオラクルマシンについて理解を試みる。
一方向性ハッシュ関数の例で、ランダムオラクルモデルとスタンダードモデルを対比させるとちょっとイメージできたかな。

  • ランダムオラクルモデルの場合、入力値に対して、まさに神のみぞ知る(真の)ランダムなハッシュ値を返す。だからハッシュ値から入力値を求めるためには総当りに試すしかない。
  • スタンダードモデルの場合、入力値に対して、ある数学的なアルゴリズムによって導きだされたハッシュ値を返す。だから、お粗末なアルゴリズムの場合はハッシュ値から入力値が導出できちゃう。

暗号解読に話を戻すと。
ブロック暗号だから暗号文の長さはブロック数の整数倍になるように、何かしらの値で埋められる。単純なものなら全部0x00とか。例えばブロック数が5だったら(実際に利用されているブロック数としてはあり得ないけど)、暗号処理結果A7 03 61 CEはA7 03 61 CE 00になるとかね。この末尾の00に何を設定するかがパディング方式。

で、今回の攻撃。一番分かりやすいのは下の説明だと思う。
http://slashdot.jp/security/article.pl?sid=10/10/11/0148242

原理不明だけど必ず正しい答えを返す機械がオラクルマシン。直訳すると神託機か?
今回は、既存実装が、不正パディングすると「暗号文が正しいかを判断するオラクルマシン」として機能してしまうと云う脆弱性を突いたもの。
それで、名前が「パディングオラクル攻撃」になる訳。

余談だが、安全な暗号を設計する際には、特定の「オラクルマシン」が実在しても安全な様に設計する。
今は出来ないけど、将来には可能になるかも知れない。その時でも大丈夫って発想ね。
で、現実では、お粗末な実装で想定外のオラクルマシンが誕生してました、ってオチ。

自分なりに噛み砕くと。

  1. 攻撃者は入力値として暗号文もどきを復号器に食わせてみる。この時食わせる暗号文もどきは意図的に様々なパディングアルゴリズムを適用したものを仮定。
  2. 復号におけるパディング処理がお粗末な実装だと、結果を返さなかったり、特定のエラーが出たりと、いつも同じ反応を示してしまう。
  3. そうすると結果として復号器は、パディング処理が正しいかを調べる判定器になってしまう
  4. これを利用して攻撃者は暗号文を解読すると。

たしかにこういう脆弱性があると、任意のデータに対して、正しい暗号文かどうか(復号可能なパディング処理が施されているか)を調べることはできるってのはイメージできるけど、それを元にどう解読するかまでは理解が及んでないな…。