Craft CMS 5系にGraphQLの権限回避、5.11.0で修正
Craft CMS 5.0.0以上5.11.0未満のGraphQLで、特定サイト向けに発行したトークンが他サイトのコンテンツの作成や削除にも使えてしまう弱点が公表されました。複数サイトを1つのCraft CMSで運用し、GraphQLの更新(mutation)を使っている組織が主な対象です。5.11.0以降へ更新し、あわせてトークンの権限範囲と更新履歴を点検してください。
急ぎ度: 早めに
CVSSは9.8の最高クラスですが、実際の攻撃での悪用は公表されておらず、悪用にはサイト限定のGraphQLトークンが必要とされているため、至急ではなく早めの更新が妥当です。
関係があるか
1つのCraft CMSで複数サイトを運用し、サイトごとに範囲を絞ったGraphQLトークンを発行している組織が影響を受けます。単一サイトのみの運用では、この弱点で「他サイトへ越境する」場面は想定しにくいものの、版が該当する場合は更新の対象です。
| 製品 | 影響を受ける版 | 直った版 |
|---|---|---|
| Craft CMS(craftcms/cms) | 5.0.0 以上 5.11.0 未満 | 5.11.0 |
確かめ方
- 1管理画面の表示や
composer.lockで、Craft CMS の版が 5.0.0 以上 5.11.0 未満かを確認します。 - 2Composer で入っている版は
composer show craftcms/cmsで確かめられます。 - 3複数サイト(マルチサイト)の構成かどうかを、管理画面の「設定」のサイト一覧で確認します。
- 4GraphQL が有効か、スキーマに更新(mutation)の権限が含まれているか、サイトを限定したトークンが発行されているかを確認します。
何が起きたか
Craft CMS の GraphQL には、トークンごとに「どのサイトを操作してよいか」を決める仕組みがあります。5.0.0 以上 5.11.0 未満では、この制限が更新系の操作で正しく確認されていませんでした。そのため、サイトAだけに許可されたトークンを持つ人が、サイトBのコンテンツも作成・削除できてしまいます。
具体的には、記事(エントリ)を作るときにサイトBの識別子(siteId)を指定すると、サイトBにエントリを作成できます。また、複数サイトで共有されているエントリ、カテゴリ、タグ、アセット(画像やファイル)を削除できます。
原因は、サイトの許可範囲を確かめる処理 requireAllowedSite() が、これらの更新操作で呼ばれていなかったことです。分類は CWE-863(不適切な認可)で、ログインや認証そのものが破られるのではなく、与えられた権限の範囲を超えた操作が通ってしまう種類の弱点です。
修正は 5.11.0 で提供されています。詳細は Craft CMS の GitHub のセキュリティアドバイザリ(GHSA-7rr3-4jcm-x526)で確認できます。
攻撃の流れ
-
1
トークンを入手
サイトAに限定された GraphQL トークンを、正規の発行や漏えいなどで手にします。
-
2
更新要求を送信
GraphQL の更新(mutation)で、別サイトBを指す識別子を指定して要求を送ります。
-
3
検査が働かない
サイトの許可範囲を確かめる処理が呼ばれず、要求がそのまま受け付けられます。
-
4
他サイトを改変
サイトBにエントリが作られ、共有されているコンテンツや資産が削除されます。
どう悪用されるか
悪用にはネットワーク経由で GraphQL のエンドポイントに到達できることと、サイトを限定した有効なトークンが必要とされています。利用者の操作は不要です。なお、CVSS のベクトルでは必要な権限が「不要」と評価されていますが、公表されている説明では「サイトAのトークンを持つ攻撃者」が前提です。トークンが公開アプリや外部業者に渡っている環境では、前提を満たすハードルが低くなります。
悪用された場合は、本来触れられないサイトへの不正なエントリの追加と、共有エントリ・カテゴリ・タグ・アセットの削除が起こり得ます。公開サイトの内容改ざんや、コンテンツの消失による業務への影響が想定されます。一方、情報の読み取りについては、公表されている説明に記載がありません。
この弱点が実際の攻撃で悪用されたという情報は公表されていません。
今すぐやること
-
1
Craft CMS を 5.11.0 以降へ更新する
修正は 5.11.0 で提供されています。本番へ適用する前に、ステージング環境で GraphQL を使う画面やAPI連携が正常に動くか確認してください。更新前にデータベースとアセットのバックアップを取ります。
composer show craftcms/cms -
2
GraphQL のスキーマとトークンを棚卸しする
更新(mutation)の権限を持つスキーマと、それに紐づくトークンを一覧にします。使っていないトークンは削除し、更新権限が不要なトークンは読み取り専用のスキーマに切り替えます。
-
3
不審な作成・削除がなかったか確認する
公開日以前の期間も含め、意図しないエントリの追加や、共有コンテンツ・アセットの削除がないかを管理画面の履歴、データベースのバックアップとの差分、Webサーバーの GraphQL へのアクセスログで確認します。
-
4
不審な点があればトークンを再発行する
外部に渡したトークンや、漏えいの可能性があるトークンは無効にして新しく発行します。更新後も、古いトークンを使い続けないようにしてください。
すぐ更新できないとき
ベンダーから、更新できない場合の回避策は公表されていません。更新までの間の一般的な被害軽減策として、GraphQL のスキーマから更新(mutation)の権限を外す、不要なトークンを無効にする、エンドポイントへのアクセスを必要な接続元だけに絞る、といった方法が考えられます。ただし、これらはベンダーが確認した対策ではなく、更新の代わりにはなりません。
背景
Craft CMS は、企業のコーポレートサイトやメディアサイトの運用に使われるコンテンツ管理システムです。GraphQL は、公開サイトのフロントエンドやスマートフォンアプリ、外部サービスが、CMS のコンテンツを読み書きするために使う窓口です。複数のブランドや言語のサイトを1つの CMS で管理する場合、サイトごとにトークンの許可範囲を分けて運用することがよくあります。
API の権限管理では、「ログインできるか」に加えて「その人にその対象を操作する権限があるか」を操作ごとに確かめる必要があります。この確認が一部の操作で抜けると、権限を絞ったつもりのトークンが想定以上の力を持ちます。このような認可の確認漏れは、Web アプリケーションで繰り返し見つかる種類の弱点です。
よくある質問
Q.マルチサイトではなく、サイトが1つだけでも更新が必要ですか。
Q.GraphQL を使っていない場合は影響しますか。
Q.CVSS が 9.8 なのに、なぜ「至急」ではないのですか。
まだ分かっていないこと
- 実際の攻撃での悪用や、攻撃コードの公開があるかどうかは、公表されていません。
- 5.11.0 未満のうち、修正を含む 5.x の途中の版があるかどうかや、4系以前が影響を受けるかどうかは、公表されていません。最新の情報は Craft CMS のセキュリティアドバイザリで確認してください。
この記事は、取得元の公開情報をもとに生成 AI で作成しています。誤りを含むことがあります。対応を決める前に、下の原文と参照先を確認してください。
原文の説明 取得元が公開している説明をそのまま載せています (多くは英語)。
Craft CMS from 5.0.0 before 5.11.0 contains an authorization bypass vulnerability that allows site-scoped GraphQL tokens to mutate other sites' content because requireAllowedSite() is not enforced. Attackers holding a site-A token can create entries in site B via supplied siteId and delete entries, categories, tags, and assets shared across sites.
出典: NIST National Vulnerability Database NVD GitHub Advisory
参照URL
- web github.com
- web vulncheck.com
- web nvd.nist.gov
- web github.com