概要
オープンソースの体験管理ツールであるFormbricksに重大な脆弱性が発見されました。この欠陥により、攻撃者は認証なしに任意のユーザーのパスワードをリセットできる可能性があります。この脆弱性は、Formbricksのバージョン4.0.1より前のバージョンに影響を与えます。
脆弱性の詳細
この脆弱性は、JSON Web Token(JWT)の署名検証が欠如していることに起因します。Formbricksはパスワードリセットおよびメール検証リクエストの検証にJWTを使用していますが、apps/web/lib/jwt.ts
内のverifyToken
関数が、トークンの署名、有効期限、発行者、またはオーディエンスを検証せずにJWTペイロードをデコードするjwt.decode
を使用しています。これにより、攻撃者はalg: "none"
ヘッダーと任意のユーザーIDを含むペイロードを持つトークンを偽造することが可能になります。
- CVE ID: CVE-2025-59934
- 説明: パスワードリセットルーチンにおけるJWT署名検証の欠如。
- 影響を受けるバージョン: 4.0.1未満
- 深刻度: Critical
- CVSS v3.1基本スコア: 9.8 (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:L)
影響と攻撃手法
攻撃者は、有効なユーザーの内部識別子(ユーザーID)を知るだけで、偽造されたトークンを作成し、パスワードリセットを強制することができます。例えば、攻撃者が被害者のユーザーID(例: cmfuc8pk60000vxfjud7bcl2w
)を取得した場合、{"alg":"none","typ":"JWT"}
というヘッダーと{"id":"cmfuc8pk60000vxfjud7bcl2w"}
というペイロードを持つトークンを作成できます。この偽造されたJWTを/auth/forgot-password/reset?token=<forged_JWT>
のURLに含めてアクセスすることで、被害者アカウントの新しいパスワードを設定できてしまいます。
この欠陥は、パスワードリセットとメール検証の両方のフローに影響を与え、攻撃者にユーザー認証情報を変更するためのネットワークレベルのアクセスを許可します。特別な権限やユーザーの操作は必要ありません。
解決策と推奨事項
Formbricksのメンテナーは、この問題に対処するためにバージョン4.0.1をリリースしました。修正では、jwt.decode
がjwt.verify
に置き換えられ、署名、有効期限、発行者、およびオーディエンスのチェックが強制されるようになりました。
すべてのFormbricksユーザーは、直ちにバージョン4.0.1にアップグレードして、適切な認証保護を回復することが強く推奨されます。アップグレードは以下のコマンドで実行できます。
npm install formbricks @^4.0.1
FormbricksをWebアプリケーションに統合している開発者は、すべてのJWTベースのアクションで、適切な秘密鍵と検証オプションを使用してjwt.verify
が使用されていることを確認する必要があります。この重大な欠陥は、包括的なJWT検証の重要性を浮き彫りにしています。
元記事: https://gbhackers.com/formbricks-signature-verification-flaw/