前回はTLSv1.1以降とTLSv1.0とでパディング処理に関するRFC上の規定が違うのでPOODLE攻撃の影響を受ける実装があるのではないか、という話をしました。
影響を受ける可能性が高いのはTLSv1.0と、TLSv1.1やTLSv1.2とで パディング処理の実装を区別しているケースでは影響をうける可能性があります。
OpenSSLの最新のもの1.0.1jについて、ソースを見てました。 結論から言うと、TLSv1.xではPOODLEへの影響が無い事が確認できました。
OpenSSLのソースコードでは、sslディレクトリの下に SSL/TLS関係のコードがまとめられており、大まかに、
- s3_*.c SSLv3(or TLSv1.x)のコード
- d1_*.c DTLSv1のコード
- t1_*.c TLSv1.xのコード
ssl/s3_cbc.c
に定義があり、以下の関数でパディング部分の削除とパディングのチェック
を行っています。
- ssl3_cbc_remove_padding
- tls1_cbc_remove_padding
ssl3_cbc_remove_padding
では、
確かにパディングの値をチェックしていないことが確認でき、
関数tls1_cbc_remove_padding
では、
のようにTLSv1.0でもTLSv1.1でもTLSv1.2でも 共通で同じパディング値バイト列のチェックを行っているので、 TLSv1.0でPOODLE攻撃の影響が無い事が確認できました。# to_check:チェックが必要なパディングバイト数 # padding_length:パディング長の値バイト # b:チェック対象の値バイト for (i = 0; i < to_check; i++) { unsigned char mask = constant_time_ge_8(padding_length, i); unsigned char b = rec->data[rec->length-1-i]; /* The final |padding_length+1| bytes should all have the value * |padding_length|. Therefore the XOR should be zero. */ # XORを取ってゼロならばパディング長の値バイトと対象は一致 good &= ~(mask&(padding_length ^ b)); }
とりあえずOpenSSLについては、こんな所で。