top page > computer > web > security > poodle > padding.html
更新日:
文責: 重城良国

POODLE: パディング部を利用した攻撃

攻撃対象

CBCモードでパディング部の正しさをチェックしていないサーバ。SSLv3のCBCモードを利用しているか、またはTLSであっても不適切な実装を使用しているサーバ。

攻撃方法の要約

前提

SSL/TLSで使用されているパディングの方式では、CBC暗号の最後のブロックは必ずパディングを含むことになっていて、そのブロックの最後の1バイトがパディング長を示す。もともとのデータがブロック長の整数倍である場合、パディングは不要のように思われるが、実際にはそうではなく、パディングのみのブロックが必要になる。この攻撃はそのような場合において可能となる。

実際の攻撃

攻撃者が入手した暗号文の任意のブロックをパディング部にコピーし、サーバに送信する。だいたいにおいてパディング長を示す最後のバイトが異なるのでエラーとなる。しかし、256分の1の確率でエラーとならない場合がある。パディング長は既知なので、復号化されたブロックの最後のバイトがわかることになる。するとCBCモードの特徴から、暗号化される直前のブロックの最後のバイトがわかる。つまり、パディング部にコピーしたもとのブロックの最後のバイトがわかることになる。

この攻撃は1バイト判定するのに期待値的に256回の試行が必要になる。これを1バイトずつずらしたデータでくりかえすことで、必要なだけのデータを取得することができる。

実装における対策

パディング部のデータを決めておき、サーバがきちんとチェックすれば良い。TLSではパディング部のデータは全てのバイトがパディング長を示す値になっている必要がある。

攻撃に使われる計算の詳細

この攻撃について理解するためにはブロック暗号のCBCモードについての理解が必要になる。wikipediaの記事か何かを読むと良いかもしれない。

パディング部にコピーした暗号文の復号結果の最後の1バイトはパディング長を示す値になる(そうでないとエラーとなるので)。パディング部のひとつ前の暗号文の最後の1バイトとのXORをとることで、パディング部にコピーした暗号文のAESによる暗号化直前の値がわかる。それとコピーもとの暗号ブロックのひとつ手前の暗号文の最後の1バイトとのXORをとることで、コビーもとの暗号文に対応した平文の最後の1バイトがわかる。

(ここに図を入れたい)

疑問点

クライアントが必要以上の長さのパディングをランダムに付加するような実装であれば、POODLEに対する耐性がやや向上するように思う。サーバ側ではなくクライアント側で出来る対策なので一考の余地はあるように思う。調べておくこと->自分。

「POODLE」にもどる

参考: mobage developers blog

正当なCSSです! HTML5 Powered with CSS3 / styling, and Semantics