This post is also available in: English (英語)
概要
Unit 42 のリサーチャーは、新たな オブジェクト レベル認可の不備 (Broken Object Level Authorization: BOLA) の脆弱性を発見しました。この脆弱性は Grafana のバージョン 9.5.0 (9.5.18 より前)、10.0.0 (10.0.13 より前)、10.1.0 (10.1.9 より前)、10.2.0 (10.2.6 より前)、10.3.0 (10.3.5 より前) に影響を与えます。Grafana は人気の高いオープンソースのデータ オブザーバビリティ/データ可視化プラットフォームで、全世界に 2000 万人のユーザーを抱え、GitHub 上ではほぼ 60,000 個のスターを集めています。
当該の脆弱性には CVE-2024-1313 が割り当てられています。CVSS スコアは 6.5 です。この脆弱性を悪用すると、低い権限を持つ Grafana ユーザーが、ほかの組織に属するダッシュボード スナップショットを、そのスナップショットの key を使って削除できるようになり、システムの完全性が影響を受けます。スナップショットの key の知識さえあればよいことから、当該脆弱性のエクスプロイトは比較的容易です。このスナップショットの key はシークレットとはみなされておらず、複数のエンドポイントのクエリー パラメーターに表示されています。
この BOLA 脆弱性に加え、Unit 42 のリサーチャーは、任意の Grafana ユーザーがスナップショット イメージを作成でき、自身が割り当てたシークレット key の複雑度チェックを強制しないエンドポイントも発見しています。これらは Grafana からは脆弱性であるとみなされていませんが、攻撃者がこれらをエクスプロイトし、DoS (サービス拒否) 攻撃を開始したり、弱いシークレットにブルートフォース攻撃を仕掛けることでほかのユーザーのスナップショットを閲覧ないし削除できてしまう可能性があります。
本稿で取り上げるセキュリティ上の懸念はすべて、ダッシュボード スナップショットの API に由来しています。これらの API は、データの共有、表示、バックアップによく使われている人気のある機能です。低い権限をもつユーザーに悪意がある場合、これらの問題をエクスプロイトすることで、機微データにアクセスしたり、データの完全性を損なったりする可能性があります。
本稿では、技術的詳細、前提条件、潜在的影響を含む、当該 BOLA 脆弱性と Grafana 内の攻撃ベクトルについての包括的分析を提供します。本稿はまた、事前的セキュリティ施策に重きをおいた解決策/緩和策についての実践的なアドバイスを提供します。
Prisma Cloud をご利用のお客さまが Web-Application and API Security (WAAS) をお使いの場合、カスタム ルールによってこれらの脅威からより適切に保護されます。
また、弊社の 次世代ファイアウォール製品 (NGFW) で クラウド配信型のセキュリティサービス (Advanced URL Filtering を含む) を有効にされている場合もより適切に保護されます。
侵害の懸念があり弊社にインシデントレスポンスに関するご相談をなさりたい場合は、こちらの問い合わせフォームからご連絡いただくか、infojapan@paloaltonetworks.com まで電子メールにてお問い合わせください (ご相談は弊社製品のお客様には限定されません)。
関連する Unit 42 のトピック | API Attacks |
オブジェクト認可の不備 (Broken Object-Level Authorization: BOLA)
BOLA は別名 IDOR (insecure direct object references: 安全でないオブジェクトの直接参照) とも呼ばれ、アプリケーションのサーバーが、ユーザーが正当なアクセス/変更/削除権限を持っているかどうかの検証を正しく行えていない場合に発生します。ここでオブジェクトとは、システム内の任意のデータを指します。これにはたとえば次のようなものが含まれます。
- メッセージ
- 写真
- トリップ
- ユーザー プロファイル
- インボイス
攻撃者は BOLA を使ってリクエスト内のオブジェクトの識別子を操作することにより、API エンドポイントをエクスプロイトできます。そのさい、攻撃者がほかのユーザーのデータに対する認可されていないアクセスを得る可能性があります。ここからデータの漏えい、データの操作、あるいは完全なアカウント乗っ取りにつながるおそれがあります。
Grafana のコンテキストでは、これらのオブジェクトはダッシュボード スナップショットのようなデータ リソースを指します。
Grafana
Grafana はオープンソースのデータ可視化/データ監視ツールです。このツールを使うことで、ユーザーはさまざまなソースからデータを取得して観測し、複雑なデータセットを理解できるようになります。私たちの見つけた新たな脆弱性について理解していただけるよう、本セクションでは、2 つの重要な Grafana のコンポーネントである「組織のロール」と「ダッシュボード スナップショット」について説明します。
組織のロール
Grafana において、ユーザーは 0 個、1 個、または複数個の組織と自身を関連づけることができます。どの組織とも関連づけられていないユーザーは、通常はアクセスが制限されており、低い権限のユーザーとみなされます。こうしたユーザーはどの組織内においても特定のロールをもたず、データのアクセスや変更がブロックされています。
これに対し、組織に関連づけられたユーザーは特定のロールを割り当ててもらうことができます。これにより、それらのユーザーは組織内で特定のアクションを行えるようになります。Grafana は事前定義された組織のロールをひと揃い用意しています。組織が所有するリソースへのユーザーによるアクセスは、これらのロールを使って管理されています。管理対象にはダッシュボードやデータ ソースが含まれます。Grafana によれば、あるユーザーに割り当てられる組織のロールは 4 種類あります。
- Organization Administrator (組織の管理者): すべての組織のリソースに対するアクセスを持つ。これにはダッシュボードやユーザー、チームが含まれる。
- Editor (編集者): ダッシュボード、フォルダー、プレイリストの閲覧および編集を行える。
- Viewer (閲覧者): ダッシュボードやプレイリストを閲覧でき、データ ソースへのクエリーを発行できる。
- No Basic Role (ベーシック ロールなし): 権限なし。必要に応じて、ロールベースのアクセス コントロール (RBAC) により権限が追加される。
CVE-2024-1313 を悪用すると、「No Basic Role」ロールを持つユーザーや組織との関連付けをもたないユーザーが、ほかの組織の任意のスナップショットを、そのスナップショットの key を知っていることにより、削除できるようになります。
ダッシュボード スナップショット
Grafana ダッシュボード スナップショット は現在の状態をキャプチャするもので、その対象には可視化やデータ、構成などが含まれます。ダッシュボード スナップショットを使うと、生のデータ ソースが削除された場合でもそのデータを保持できます。スナップショットの機能は通常、特定のデータ ビューを共有したり、バックアップを作成したり、知見を得るための共同作業をする目的で使われます。ユーザーは Grafana ダッシュボードのスナップショットを作成し、URL を通じて、ほかの人たちとそれを共有することができます。
図 1 は Grafana UI のダッシュボード スナップショットの例です。
Key と deleteKey
あるユーザーがスナップショットを UI (ユーザーインターフェース) 経由で作成すると、デフォルトで Grafana はランダムな 32 文字からなる key と deleteKey を作成します。これらはスナップショットの閲覧や削除に使われます。例を以下にあげます。
hxxp://localhost:3000/dashboard/snapshot/l1cWRaD0kJERIYF9eyz3RVhafNWEKPbz
API 経由でスナップショットを作成する場合、ユーザーはオプションで key と deleteKey に 2 つの値を指定できます。key はあるスナップショットを一意に識別します。deleteKey はあるスナップショットを削除するさいの一意な識別子として機能します。deleteKey と key を別のものにすることで、スナップショットの作成者だけがそのスナップショットを削除できるようにしています。
BOLA 脆弱性で認可されていないユーザーがスナップショットを削除可能に
CVE-2024-1313 を悪用すると、任意の Grafana ユーザーが、対象となるスナップショットの key を使い、DELETE /api/snapshots/{key} という HTTP/s リクエストを行うことで、そのスナップショットを削除できるようになります。対象ダッシュボードを所有する組織に属していない Grafana ユーザーが、Grafana 内のどの組織のダッシュボード スナップショットであっても削除することができます。
どの組織とも関連付けられていない攻撃者 (または対象となるダッシュボードが存在している組織以外の任意の組織で No Basic Role を与えられている攻撃者) は、key か URL があれば、任意のユーザー (Grafana の管理者を含む) が作成したスナップショットを削除できます。こうした行為はデータ損失や事業中断につながるおそれがあります。ただし、対象のダッシュボード スナップショットと同じ組織内の攻撃者はそのスナップショットを削除することはできません。この脆弱性の CVSS スコアは 6.5 です。
弱い key と deleteKey でどの組織のスナップショットでも作成可能に
この調査のなかで、私たちは POST /api/snapshots の HTTP/s リクエストに 2 つの潜在的な問題があることを発見しました。1 つめは、このリクエストが任意の Grafana ユーザーにスナップショット生成を許している点です。2 つめは、自身が割り当てるシークレット key に複雑さのチェックを強制しない点です。
Grafana はこれらを脆弱性とは考えていませんが、私たちはこれらの問題が悪用されると Grafana システムの可用性と機密性が損なわれかねないと考えています。その理由は 2 つあります。
- 1 つめの問題は、任意の Grafana のユーザーが、自身のロールや組織との関連付けとは関係なく、Grafana 内でスナップショットを作成可能という点です。これにより、悪意のあるアクターが、ランダムなデータで埋め尽くしたサイズの大きなスナップショットを繰り返し生成しつづけることにより、Grafana のシステムが正常に機能しないようにする余地が生まれます。(注意: ただしそのユーザーはスナップショットが作成されることになる組織はコントロールできません。そのユーザーが組織の一員だった場合、スナップショットはすべて同じ組織内に生成されます。)
- デフォルトでは、ダッシュボード スナップショットが Grafana の Web コンソール内で生成されると、32 文字からなる高エントロピーの key と deleteKey が自動的に割り当てられます。以降、ほかのエンドポイントはこれらの key が推測不能という事実にたのむことになります。したがって、なんらかの機能を呼び出すにあたって Grafana は認可を要求せず、認可されたユーザーだけがそれらの key を知っているという前提に頼ることになります。2 つめの問題は、ユーザーがエンドポイントを使うさい、自分自身が用意した key を POST でき、そこでは複雑さの要件がなにも強制されないという点です。これによってブルートフォース攻撃に対して脆弱となります。複雑さの要件がないことで、攻撃者はこうした key に依存しているほかのエンドポイントをエクスプロイトし、スナップショットを漏えいしたり、削除したりすることができます。たとえば GET /api/snapshots/{key}、DELETE /api/snapshots/{key}、GET /api/snapshots-delete/{deleteKey} の HTTP リクエストはすべて、被害者の key の複雑さが低ければ、ブルートフォース攻撃に対して脆弱になります。
2 つめの問題に関連し、global configuration の public_mode 変数が問題を悪化させるおそれがあります。public_mode が true に設定されている場合、認可されていないユーザでも弱い key を使ってスナップショットを作成したり、例に示したエンドポイントにクエリーを実行することができるため、問題が悪化します。なお public_mode はデフォルトでは false に設定されていることは指摘しておくべきでしょう。この問題は、ユーザーが API を使ってスナップショットを作成した場合にのみ発生します。
図 2 は、低い権限をもつユーザーが、複雑度の低い key と deleteKey でダッシュボード スナップショットを生成している例です。これらの key は URL のパス パラメーターにも登場しており、認可されていないユーザーが、新たに生成されたスナップショットに簡単にアクセス・削除できるようにしています。
POST /api/snapshots の HTTP/s リクエストは入力内に依存するパラメーターを持っていません。必要とされる ダッシュボード モデル データ には、スナップショットに含まれることになるテレメトリーを含みますが、その内容は任意です。Grafana のバックエンドはこのテレメトリー データの存在の有無を検証しません。
前提条件
先の 2 つのセクションで述べたセキュリティの問題をエクスプロイトするには、攻撃者が対象のスナップショットの key または deleteKey を知っている、ないし推測できる必要があります。攻撃者はこれらの key を以下に述べる方法のいずかを使って取得可能です。
- 対象のスナップショットが複雑度の低い key と deleteKey を使って生成されている場合、攻撃者はこれらの key に対するブルートフォース攻撃をしかけて HTTP/s リクエストを生成することができる (DELETE /api/snapshots/{key}、 GET /api/snapshots/{key}、GET /api/snapshots-delete/{deleteKey} など)。key の推測に成功すれば攻撃者にはスナップショットのアクセス・削除が可能になる。
- 通常の条件下では、対象のスナップショットにアクセスするさい、key は平文で URL のパス パラメーターの一部として表示されている (例: hxxp/s://grafana_host/dashboard/snapshot/admin_key_123)。対象のスナップショットがプレゼン時にブラウザー内に表示されている場合、視聴者はその key が URL として表示されているところを録画すればよい。さらにこのスナップショット機能はデータの共有・表示・バックアップによく利用されていることから、低い権限をもつ攻撃者は、組織のコンテンツ マネジメントシステムやメッセージング プラットフォーム、共有文書といった場所からこのスナップショットの key を発見しうる。
修正と緩和策
Grafana は CVE-2024-1313 似対する修正を公開し、本件についてセキュリティ アドバイザリーで言及し、バージョンを 10.4.x、10.3.5、10.2.6、10.1.9、または 9.5.18 に更新して BOLA のリスクを緩和することを推奨しています。
Prisma Cloud をご利用のお客さまが Web-Application and API Security (WAAS) をお使いの場合、カスタム ルールによって、これらの脅威からより適切に保護されています。これにより、以下にあげたような HTTP/s リクエストに低い複雑度の key が含まれるスナップショットに関連したリスクが緩和されます。
- POST /api/snapshots
- GET /api/snapshots/{key}
- DELETE /api/snapshots/{key}
- GET /api/snapshots-delete/{deleteKey}
以下がデプロイされている弊社の WAAS ルールのスニペットです。このルールにより、弱い key でスナップショット生成・取得・削除を行う Grafana ユーザーを検出します。
1 |
((urlPathDecode(req.path) = "/api/snapshots" and req.http_method = "POST") and (req.body contains /"key":([^&?]{1,31}?)(\?|$)/ or req.body contains /"deleteKey":([^&?]{1,31}?)(\?|$)/)) or ((urlPathDecode(req.path) contains /api\/snapshots\/([^&?]{1,31}?)(\?|$)/ and req.http_method = "GET") or (urlPathDecode(req.path) contains /api\/snapshots-delete\/([^&?]{1,31}?)(\?|$)/ and req.http_method = "GET")) |
さらに Prisma Cloud をお使いのお客さまは脆弱性管理 によりワークロード内の BOLA 脆弱性を検出できます。
また、弊社の 次世代ファイアウォール製品 (NGFW) で クラウド配信型のセキュリティサービス (Advanced URL Filtering を含む) を有効にされている場合もより適切に保護されます。
開示プロセス
- 1 月 22 日: パロアルトネットワークスが脆弱性を発見、レポートを Grafana のバグ バウンティ プログラムに提出
- 1 月 23 日: Grafana が迅速に応答、問題を確認しさらにチェックを行う
- 2 月 7 日: 本件に対し CVE 2024-1313 が予約される
- 3 月 26 日: Grafana がバージョン 10.4.x、10.3.5、10.2.6、10.1.9、9.5.18 で修正を公開
結論
BOLA は見落とされがちな種類の脆弱性ですが、その影響は潜在的に大きなものとなりえます。精力的にセキュリティ監査を行っている枯れたアプリケーションであっても、わかってみれば明らかな BOLA が見つかることがあります。自動化されたテストツールの欠如は、組織が BOLA の脆弱性に取り組み続けることになっていることの主な要因です。
Unit 42 のリサーチャーは、オープンソース ソフトウェアの堅牢化と技術の革新に精力的に取り組むことで、新たな脆弱性をより効率的よく、より効果的に発見しています。パロアルトネットワークスのお客様は、こうした調査による発見や洞察によって保護されています。
侵害の懸念があり弊社にインシデントレスポンスに関するご相談をなさりたい場合は、こちらの問い合わせフォームからご連絡いただくか、infojapan@paloaltonetworks.com まで電子メールにてご連絡いただくか、下記の電話番号までお問い合わせください(ご相談は弊社製品のお客様には限定されません)。
- 北米フリーダイヤル: 866.486.4842 (866.4.UNIT42)
- EMEA: +31.20.299.3130
- APAC: +65.6983.8730
- 日本: (+81) 50-1790-0200
パロアルトネットワークスは、これらの調査結果を Cyber Threat Alliance (CTA: サイバー脅威アライアンス) のメンバーと共有しました。CTA のメンバーはこのインテリジェンスを使って、お客様に保護を迅速に提供し、悪意のあるサイバー攻撃者を体系的に阻害できます。詳細は Cyber Threat Alliance にてご確認ください。