AJ-Reportに認証不要でコード実行の脆弱性、1.7.1以前
AJ-Report 1.7.1以前に、固定の署名鍵を使って認証なしでサーバー上のコードを実行される脆弱性が公表されました。利用中の組織は版を確認し、外部からの到達を先に絞ったうえで、開発元の告知で修正版を調べてください。
急ぎ度: 至急
CVSS v3は9.8、v4は9.3で、認証不要のままネットワーク越しにコード実行へ至る脆弱性であり、仕組みの手がかりとなるソースコードも公開されているためです。
関係があるか
AJ-Reportを自社で動かしている組織が対象です。とくに、レポートの共有機能を社外の取引先や顧客に向けて使っている場合や、インターネットから到達できる場所に置いている場合は、優先して確認してください。
| 製品 | 影響を受ける版 | 修正版 |
|---|---|---|
| AJ-Report(anji-plus) | 1.7.1以前のすべての版 | 修正版の有無と版番号は、開発元のリポジトリのリリースとIssueで確認してください |
確かめ方
- 1AJ-Reportを動かしているサーバーやコンテナーを洗い出し、管理画面の表示かデプロイしたファイル名で版を確認します。1.7.1以前なら対象です。
- 2リバースプロキシやロードバランサーの設定を見て、インターネットや社外ネットワークから到達できるかを確認します。
- 3アクセスログに、スクリプトの試し実行を行うtestTransformへの見覚えのないリクエストがないか調べます。
何が起きたか
AJ-Report 1.7.1以前に、ログインしていない第三者がサーバー上で任意のコードを実行できてしまう脆弱性が見つかりました。2026年10月31日にCVE-2026-120209として公表されています。
原因は、レポートの共有に使うShare-Tokenの署名に、プログラムへ固定で埋め込まれたJWTの秘密鍵を使っていることです。鍵が全利用者で共通のうえ、ソースコードが公開されているため、攻撃者は手元で正規のトークンを偽造できます。
偽造したトークンで到達できるtestTransformエンドポイントは、受け取ったスクリプトをGroovyClassLoaderに渡して実行します。トークンの検証が事実上意味を失っているため、認証なしのコード実行につながります。
攻撃の流れ
-
1
鍵の入手
公開されているソースコードから、固定の署名鍵を読み取ります。
-
2
トークン偽造
対象サーバーに接続せず、手元で正規に見えるShare-Tokenを作ります。
-
3
内部機能へ到達
偽造トークンで、本来は認証が必要な機能に入ります。
-
4
スクリプト実行
サーバー上でGroovyのスクリプトが実行され、乗っ取りに至ります。
どう悪用されるか
悪用に認証は要りません。AJ-Reportにネットワークから到達できれば足り、攻撃の複雑さは低く、管理者や利用者に操作させる必要もありません。トークンの偽造は手元で完結するため、失敗や試行の痕跡がサーバー側に残りにくいと考えられます。
成功すると、AJ-Reportのプロセスの権限でコードを実行されます。機密性・完全性・可用性への影響はいずれも高く評価されています。AJ-Reportはデータベースなどの接続情報を持つのがふつうなので、そこに登録されたデータの閲覧や改ざん、サービス停止、同じネットワーク内の別システムへの足がかりにされるおそれがあります。
今すぐやること
-
1
対象の版を洗い出す
社内で動いているAJ-Reportを検証環境も含めて一覧にし、1.7.1以前かどうかを確認します。
-
2
外部からの到達を絞る
インターネットに公開している場合は、修正版の適用前でもまず公開を止めるか、VPNや許可IPに限定します。
-
3
修正版を確認して更新する
開発元のリポジトリのリリースとIssueで修正版の有無を確認します。提供されていれば、検証環境で動作を見たうえで本番を更新します。
-
4
侵害の跡を調べる
公表の前から公開状態だった場合は、testTransformへのアクセス、AJ-Reportの実行ユーザーによる不審なプロセスや外向きの通信、見覚えのないファイルがないかを調べます。
grep -i testTransform /var/log/nginx/access.log -
5
接続情報の入れ替えを検討する
不審な形跡があれば、AJ-Reportに登録していたデータベースなどの接続パスワードを変更し、それらのシステム側のログも確認します。
修正版がないあいだのつなぎ
修正版をすぐ当てられない間は、AJ-Reportへのアクセスを社内の限られたネットワークかVPNに限ります。あわせてリバースプロキシで、スクリプトの試し実行に使われるtestTransformのパスを遮断します。遮断すると、管理画面の一部機能が使えなくなる場合があるため、先に影響を確認してください。これらは更新までのつなぎで、版の問題そのものは直りません。
背景
AJ-Reportは、データベースなどのデータを取り込み、ダッシュボードや帳票として画面に出すオープンソースのレポートツールです。作った画面を共有する機能があり、社外の関係者にもURLで見せられます。そのため、ほかの社内ツールより外部に近い場所に置かれやすい製品です。
今回の問題は、共有を認めるトークンの署名鍵が全利用者共通でプログラムに埋め込まれていた点にあります。ソースコードが公開されているオープンソースでは、鍵も誰でも読めます。署名の検証が成り立たなくなり、認証を前提にした機能がすべて無防備になります。しかも、その先にスクリプトを実行する機能があったため、被害が情報の閲覧にとどまらず、サーバーの乗っ取りまで広がりました。
よくある質問
Q.社内ネットワークだけで使っていれば、急がなくてよいですか。
この記事は、取得元の公開情報をもとに、人が監修しながらAIを活用して執筆しています。執筆と監修は佐々木 航が担い、公開したあとも人が内容を確認しています。誤りに気づいたときは直し、記事の末尾に訂正の行を残します。対応を決める前に、下の原文と参照先も確認してください。
影響パッケージ
| 種類 | パッケージ | 影響を受ける版 | 修正版 |
|---|---|---|---|
| anji-plus | AJ-Report |
1.7.1 以前 |
— |
原文の説明 取得元が公開している説明をそのまま載せています (多くは英語)。
AJ-Report through 1.7.1 signs share tokens with a hard-coded JWT secret, allowing attackers to forge valid Share-Tokens offline. Attackers can mint a token with reportCode 'dataSet' to access the testTransform endpoint, which passes scripts to GroovyClassLoader for unauthenticated remote code execution.
出典: CVE.org (CVE Program・cvelistV5) NVD GitHub Advisory
参照URL
- web gitee.com
- web gitee.com
- web gitee.com
- web vulncheck.com
- web nvd.nist.gov
- web github.com