Synopsys CyRCの研究者は、広く使用されているJava暗号化ライブラリBouncyCastleのOpenBSDBcryptクラスに認証バイパスの脆弱性であるCVE-2020-28052を発見しました。 このクラスは、パスワードハッシュ用のBcryptアルゴリズムを実装します。 攻撃者は、BouncyCastleのOpenBSDBcryptクラスを使用するアプリケーションでパスワードチェックをバイパスできます。
methodOpenBSDBcrypt.doCheckPasswordの脆弱性は、 00dfe74aeb4f6300dd56b34b5e6986ce6658617eのコミットで明らかになりました。
doCheckPasswordメソッドは、欠陥のある検証ルーチンを実装します。 このコードは、0から59の位置にある文字が一致するかどうかをチェックするのではなく、0から59までの文字のインデックスをチェックします。 たとえば0x00から0x3Bまでのバイトを含まないハッシュを生成するパスワードは、それらを含まない他のすべてのパスワードハッシュと一致します。 このチェックに合格すると、攻撃者は保存されているハッシュ値とバイトごとに一致させる必要がなくなります。
boolean isEqual = sLength == newBcryptString.length();
for (int i = 0; i != sLength; i++)
{
isEqual &= (bcryptString.indexOf(i) == newBcryptString.indexOf(i));
}
return isEqual;
Bcrypt.doCheckPassword()を使用してパスワードをチェックするほとんどの場合、悪用に成功すると認証をバイパスできるようになります。
攻撃者は、バイパスがトリガーされるまで、パスワードの試行をブルートフォースする必要があります。 私たちの実験では、テストされたパスワードの20%が1,000回の試行で正常にバイパスされたことが示されています。 一部のパスワードハッシュは、0から60(1から59)の間にあるバイト数によって決定され、より多くの試行を必要とします。 さらに、調査の結果、十分な試行を行うことで、すべてのパスワードハッシュをバイパスできることがわかりました。 まれに、一部のパスワードハッシュは任意の入力でバイパスできます。
注記:この開示の結果、シノプシスは自社製品を調査し、この開示が公開された時点でBouncyCastleバージョン1.65または1.66を使用していないことを発見しました。
Bcryptハッシュベースの認証は、たとえばWebアプリケーションやAPIでの認証チェックに使用できます。
BouncyCastleはソフトウェアライブラリです。 次の最悪の場合の実装シナリオは、CVSSスコアを決定する際に想定されました(ソフトウェアライブラリのFIRSTCVSSスコアリングガイドラインに従う)。Bouncy Castle is a
Bcryptハッシュは、ユーザーが指定したパスワードをチェックするために使用されます。 認証バイパスがトリガーされると、攻撃者は正当なユーザーと同じ操作を実行できます(たとえば、シングルサインオン(SSO)システムへの管理者レベルのアクセス権を取得します)。
ベクター: AV:N/AC:H/PR:N/UI:N/S:C/C:H/I:H/A:H/E:P/RL:O/RC:C
スコア: 8.1
攻撃される可能性の指標:
Attack Vector (AV): N = Network
Attack Complexity (AC): H = High
Privileges Required (PR): N = None
User Interaction (UI): N = None
Scope (S): C = Changed scope
影響の指標
Confidentiality Impact (C): H = High impact
Integrity Impact (I): H = High impact
Availability Impact (A): H = High impact
ソフトウェアベンダーとライブラリのユーザーは、Bouncy CastleJavaリリース 1.67 以降 にアップグレードすることを強くお勧めします。
発見した研究者は下記の2名で、フィンランドのオウルにあるCybersecurity Research Center (CyRC) に所属しています:
シノプシスは、Bouncy Castleチームがこの問題に速やかでタイムリーに対処してくれたことに感謝します。