nest-adminに認証回避の脆弱性、1.0.1で修正
nest-adminの1.0.1より前の版では、公開されている署名用の秘密値を使って管理者のトークンを偽造でき、ログインなしで管理機能を操作されるおそれがあります。管理画面にnest-adminを使っている組織は、修正版の1.0.1へ更新し、あわせて本番のJWT_SECRETを新しい値に替えてください。
急ぎ度: 至急
CVSS v3は9.8、v4は9.3で、認証なしで管理者権限を奪えるうえ、修正版の1.0.1が出ているためです。
関係があるか
nest-adminを管理画面のバックエンドとして本番運用している組織が対象です。とくに管理画面のAPIをインターネットや広い社内網に公開している環境は、早急な確認が要ります。
| 製品 | 影響を受ける版 | 直った版 |
|---|---|---|
| nest-admin(buqiyuan) | 1.0.1より前のすべての版 | 1.0.1 |
確かめ方
- 1取り込んでいるnest-adminのソースが、修正を含む1.0.1以降かどうかを、リポジトリの履歴で確認します。
- 2本番で使っているJWT_SECRETが、公開リポジトリの.env.productionに書かれた値と同じではないかを、運用担当者が確認します。自前の値に差し替え済みでも、版が古ければ更新は必要です。
- 3管理画面のAPIが外部から到達できる構成かどうかを、ネットワーク構成図やリバースプロキシの設定で確認します。
何が起きたか
nest-adminの1.0.1より前の版には、ログインしていない第三者が管理者になりすませる脆弱性があります。管理画面の全機能を、正規の管理者と同じ権限で操作されるおそれがあります。
原因は、トークンの署名に使うJWT_SECRETが.env.productionにそのまま書かれ、リポジトリに含まれていたことです。nest-adminのJwtStrategyとRbacGuardは、この秘密値で署名されたトークンを正しいものとして扱います。秘密値を知っていれば、任意のユーザーIDを名乗ったり、adminロールを持つと主張したりするトークンを作れてしまいます。
分類はCWE-321で、暗号鍵をコードや設定に固定で埋め込んだ問題にあたります。ベンダーの告知とGitHubの修正コミットが公開されています。
攻撃の流れ
-
1
秘密値の入手
公開リポジトリの.env.productionから、署名用のJWT_SECRETを読み取ります。
-
2
トークンの偽造
入手した秘密値で署名し、任意のユーザーIDやadminロールを主張するトークンを作ります。
-
3
認証の通過
サーバーが署名を正しいと判断し、偽のトークンを受け入れます。
-
4
管理機能の操作
管理者として、データの閲覧・変更やアカウント操作ができる状態になります。
どう悪用されるか
悪用にアカウントは要りません。ネットワーク越しに管理画面のAPIへ届きさえすれば成立し、攻撃を成功させるために管理者や利用者が何かを操作する必要もありません。攻撃の難易度は低く、CVSSの評価もこの条件を反映しています。
秘密値が公開リポジトリにあるため、インターネットに管理画面を出している環境では、急ぐ理由が十分にあるでしょう。
成功すると、管理者を含む任意のユーザーになりすませます。機密性・完全性・可用性のいずれにも大きな影響が出ます。管理画面から見られるデータの読み取り、設定や権限の書き換え、新たな管理者アカウントの作成などが想定されます。
今すぐやること
-
1
利用中の版を確認する
取り込んでいるソースに、修正コミット(f2cec8cb776cbf113115b33164dac69a46d24097)が含まれているかを確認します。含まれていなければ、1.0.1より前の版を使っています。
git branch --contains f2cec8cb776cbf113115b33164dac69a46d24097 -
2
修正版の1.0.1へ更新する
テスト環境で動作を確認したうえで、本番に反映します。独自の改修を加えている場合は、修正コミットとの差分を確認しながら取り込みます。
-
3
JWT_SECRETを新しい値に替える
旧版で使っていた値は、すでに第三者に知られているものとして扱います。十分に長いランダムな値を生成して環境変数や秘密情報の管理基盤に置き、リポジトリには含めません。値を替えると、旧い秘密値で署名されたトークンは検証に通らなくなります。
-
4
管理操作の履歴を点検する
更新前の期間について、ログイン記録のない管理操作、見覚えのない管理者アカウントの作成、権限やロールの変更がないかを調べます。不審な点があれば、パスワードの再設定や関連する認証情報の入れ替えも検討します。
すぐ更新できないとき
すぐに更新できないときは、JWT_SECRETを推測されない新しい値に替えてアプリを再起動し、設定が実際に反映されていることを確認します。あわせて、管理画面のAPIをVPNや社内の固定IPなど、限られた経路からだけ到達できるようにします。いずれも暫定の措置で、修正版への更新は必要です。
背景
nest-adminは、GitHubで公開されている管理画面向けのバックエンドです。ユーザー、ロール、権限といった管理の土台を提供するため、ここを突破されると、その上に作った業務画面や、画面から触れるデータにまで影響が及びます。公開リポジトリのソースを取り込んで自社用に改造して使う形が多いとみられ、上流で修正が出ても、利用側が自分で追随しないと古い版が残りやすい点は気になります。
今回の問題は、金庫の暗証番号が取扱説明書に印刷されたまま出荷されていた状況に近いものです。JWTは、署名に使う秘密値を知っている者なら誰でも正規のトークンを発行できます。その秘密値が公開のリポジトリにあれば、署名の検証は認証として働かなくなります。
よくある質問
Q.すでに侵害されたかどうかは、どう見分ければよいですか。
まだ分かっていないこと
- 実際の攻撃での悪用が確認されているかどうかは、公表されていません。最新の状況は、ベンダーの告知(VulnCheck)とnest-adminのGitHubのIssueで確認してください。
- 1.0.1で秘密値の扱いがどう変わったか(固定値の削除や、起動時の設定の必須化など)は、告知から読み取れません。修正コミットの内容で確認してください。
- 本番で.env.productionの値を環境変数などで上書きしていた構成が、どこまで影響を受けるかは公表されていません。
この記事は、取得元の公開情報をもとに生成 AI で作成しています。誤りを含むことがあります。対応を決める前に、下の原文と参照先を確認してください。
影響パッケージ
| 種類 | パッケージ | 影響を受ける版 | 直った版 |
|---|---|---|---|
| buqiyuan | nest-admin |
1.0.1 未満 |
1.0.1 |
原文の説明 取得元が公開している説明をそのまま載せています (多くは英語)。
nest-admin before 1.0.1 contains an authentication bypass vulnerability that allows unauthenticated attackers to forge administrator tokens by using a hardcoded JWT_SECRET committed in .env.production. Attackers can sign tokens with the known secret that JwtStrategy and RbacGuard trust, impersonating any user ID or claiming the admin role for full administrative access.
出典: CVE.org (CVE Program・cvelistV5) NVD GitHub Advisory