2

Flask-bcryptなどの一部のライブラリでは、2 つの文字列の長さが異なる場合、コードが早期に終了することがわかります。

def constant_time_compare(val1, val2):
    '''Returns True if the two strings are equal, False otherwise.

    The time taken is independent of the number of characters that match.
    '''

    if len(val1) != len(val2):
        return False

    result = 0
    for x, y in zip(val1, val2):
        result |= ord(x) ^ ord(y)

    return result == 0

これは本当に安全ですか?これにより、攻撃者は 2 つの文字列が早い段階で異なる長さであり、情報が漏洩したことが明らかになるでしょうか?

4

1 に答える 1

4

タイミング攻撃を防ぐとき、異なる長さで終了しても安全ですか?

一般的にはありませんが、状況によって異なります。

関数自体

この関数は、実行時間が常に入力の長さに依存するため、長さの比較に関係なく、タイミング攻撃で情報を漏えいします。

長さ比較では、両方の入力が同じ長さの場合、実行時間が変わります。

長さの比較がなければ、実行時間は短い方の入力の長さに基づいて変化します (の理由zip)。攻撃者が制御する入力が他の入力の長さを超えると、実行時間は一定のままになります。

ただし、この関数の実行時間は非常に短いため (非科学的なテストでは、32 バイトの入力に対して 0.1 ミリ秒未満であることが示されています)、実際の状況では、次のような他の要因により、攻撃者がこれを利用することはかなり困難です。ネットワーク遅延の変動。攻撃者は、この脆弱性を実際に利用するために、コードが実行されているマシンに既にいる必要があるでしょう。

Flask-bcrypt について

ただし、flask-bcrypt のコンテキストでは、この関数はハッシュの比較にのみ使用され、直接のユーザー入力には使用されません。bcrypt が出力するハッシュ長は固定であるため、return False実際には実行されません。したがって、bcrypt で使用する場合、この関数に対するタイミング攻撃は存在しません。

Flask-bcrypt は、Python での通常の文字列比較 (==) の実行時間が文字列の内容に基づいて変化するため、この関数を使用して等価性をチェックします。同じ長さの 2 つのほぼ同一の文字列を考えてみましょう。2 つの文字列の最初の文字が異なる場合、== 比較は、文字列の最後の文字で違いが発生する場合よりも速く完了します。

ただし、この場合、一定時間の文字列比較は本当に不要であると主張します。攻撃者の目標は、処理時間に基づいて保存されたハッシュ値を推測することです。攻撃者は、これを達成するために、入力によって生成されたハッシュ値を知る必要があります。ただし、どのハッシュが生成されているかを知る唯一の方法は、攻撃者がワークファクターとソルトを知ることです。攻撃者がこの情報を持っている場合は、ハッシュも既に持っています (それらはすべて一緒に保存されているため)。その場合、そもそも攻撃を実行する理由はありません。

于 2013-08-29T12:45:34.513 に答える