比較処理のタイミング攻撃
ある Web API は,リクエストに付加された HMAC 値を,サーバで計算した正しい HMAC 値と先頭から 1 バイトずつ比較し,一致しないバイトを見つけた時点で直ちにエラーを返す。攻撃者は応答時間を精密に測定でき,何度でもリクエストを送れるものとする。このとき攻撃者が行える攻撃として,適切なものはどれか。
- ア応答時間の差を手掛かりに,HMAC の計算に用いる鍵を先頭から 1 バイトずつ特定する。
- イエラー応答の違いからパディングの正否を判定し,その結果を手掛かりに暗号文を 1 バイトずつ復号する。
- ウ応答時間の差を手掛かりに,改ざんしたリクエストに対する正しい HMAC 値を先頭から 1 バイトずつ特定し,鍵を知らずに検証を通過する。
- エ正しい HMAC 値を得るには全ての値を総当たりする必要があり,出力長が十分であれば現実的な時間では検証を通過できない。
正解と解説を見る
正解 ウ
この問題の基礎知識
- HMAC は共通鍵とハッシュ関数を用いてメッセージ認証コードを計算する方式であり,受信側は同じ鍵で計算した値と比較して改ざんやなりすましを検知する。
- タイミング攻撃はサイドチャネル攻撃の一種で,処理時間が秘密の値に応じて変わることを手掛かりに,秘密の情報を推測する。
- 比較を不一致の時点で打ち切ると処理時間から一致した長さが分かるので,秘密の値の比較には,内容によらず常に全体を比較する定数時間の比較処理を用いる。
- パディングオラクル攻撃は,CBC モードなどの復号処理でパディングの正否が分かることを利用して暗号文を解読する攻撃であり,対象とする処理が異なる。
ア応答時間の差を手掛かりに,HMAC の計算に用いる鍵を先頭から 1 バイトずつ特定する。
比較されるのは,サーバで計算した HMAC 値とリクエストの HMAC 値であり,鍵そのものは比較されない。応答時間から分かるのは何バイト目まで HMAC 値が一致したかであって,鍵の内容ではない。
イエラー応答の違いからパディングの正否を判定し,その結果を手掛かりに暗号文を 1 バイトずつ復号する。
パディングの正否が分かることを利用して暗号文を復号するのはパディングオラクル攻撃であり,CBC モードの復号処理などが対象となる。この API は復号ではなく HMAC 値の比較を行っている。
ウ応答時間の差を手掛かりに,改ざんしたリクエストに対する正しい HMAC 値を先頭から 1 バイトずつ特定し,鍵を知らずに検証を通過する。正解
一致するバイトが多いほど比較が長く続くので,応答時間から何バイト目まで一致したかを推測できる。1 バイトずつ候補を試せば,全体を総当たりするよりはるかに少ない試行で正しい値に到達する。対策は,常に全体を比較する定数時間の比較処理である。
エ正しい HMAC 値を得るには全ての値を総当たりする必要があり,出力長が十分であれば現実的な時間では検証を通過できない。
全体の総当たりが必要になるのは,比較の結果から部分的な一致の情報が漏れない場合である。この実装では応答時間からバイト単位の一致が分かるので,バイトごとに候補を試せばよく,試行回数は大幅に減る。
検証用の出典出典照合済み
CWE-208 Observable Timing Discrepancy照合の根拠(4 件)
- ウ(正解)・エ(誤り): 先頭から比較して不一致で打ち切る実装では,バイトごとに少ない試行で正しい値を推測できる
Since the code breaks on an incorrect entry of password, an attacker can guess the correct password for that byte-check iteration with few repeat attempts.
CWE-208 · Demonstrative Examples(Example 2)(新しいタブで開きます) - ウ(正解): 一致した分だけ処理時間が延びるので 1 文字(1 バイト)ずつ特定できる
Additionally, with this code, the attacker can possibly learn one character of the password at a time, because when they guess the first character right, the computation will take longer than a wrong guesses.
CWE-208 · Demonstrative Examples(新しいタブで開きます) - ウ(正解): HMAC 値の非定数時間比較がこの弱点の実例。比較対象は HMAC 値であり鍵ではない(ア は誤り)
Java-oriented framework compares HMAC signatures using String.equals() instead of a constant-time algorithm, causing timing discrepancies
CWE-208 · Observed Examples(新しいタブで開きます) - イ(誤り): パディングの正否を手掛かりにする攻撃はブロック暗号の復号処理(パディング)を対象とし,HMAC 値の比較とは別物
SSL implementation does not perform a MAC computation if an incorrect block cipher padding is used,
CWE-208 · Observed Examples(新しいタブで開きます)
API は HMAC 値を先頭から比較して不一致で即エラーを返すので,応答時間から何バイト目まで一致したかが分かり,バイトごとの候補試行で正しい HMAC 値に到達できる。漏れるのは HMAC 値の一致長で,鍵の内容は比較されないのでアは誤り。