Formbricksの署名検証の欠陥により、攻撃者がユーザーパスワードをリセット可能に

概要

オープンソースの体験管理ツールである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.decodejwt.verifyに置き換えられ、署名、有効期限、発行者、およびオーディエンスのチェックが強制されるようになりました。

すべてのFormbricksユーザーは、直ちにバージョン4.0.1にアップグレードして、適切な認証保護を回復することが強く推奨されます。アップグレードは以下のコマンドで実行できます。

npm install formbricks @^4.0.1

FormbricksをWebアプリケーションに統合している開発者は、すべてのJWTベースのアクションで、適切な秘密鍵と検証オプションを使用してjwt.verifyが使用されていることを確認する必要があります。この重大な欠陥は、包括的なJWT検証の重要性を浮き彫りにしています。


元記事: https://gbhackers.com/formbricks-signature-verification-flaw/