Wikimedia スチュワード - 利用者権限が次々に乗っ取られたお話 ～セキュリティの鎖はいつも最も脆い箇所から破断する～

この記事は [Wikimedia project](https://wikimedia.org/) で 2018年に発生したセキュリティインシデントを、公開情報の範囲内で書いたものです。

# 前提条件・前提知識・用語
1. `Wikimedia project` (WMF) は [Wikipedia](https://wikipedia.org/) をはじめとする、米国 [Wikimedia Foundation](https://wikimediafoundation.org/) が運営するプロジェクト群のことです
2. Wikipedia を始めとする多くの Wikimedia project は "[MediaWiki](https://www.mediawiki.org/)" という Wiki clone を利用します
3. Wiki とは、原則としてだれでも編集可能な Web システムです
4. 編集やアカウント登録などのあらゆる書き込み操作は、機微情報にかかわるものを除いて、公開の記録に残ります
4. Wikipedia やその姉妹プロジェクト (Wiktionary, Wikidata, Wikimedia Commons, etc) は、それぞれ独立したウィキサイトです
3. MediaWiki には、アカウント作成機能があります
4. それぞれ独立したウィキサイト間でアカウントを毎度作成することはあまりにも手間がかかるため、Wikimedia project では [CentralAuth](https://www.mediawiki.org/wiki/Extension:CentralAuth) というシングルサインオンシステム（統一ログインシステム）を導入しています
4. ページの削除や利用者の投稿禁止（ブロック）といった操作は、誰でも利用が可能だと混乱に陥ることが予想されるため「一部の制限された操作」として指定することができます
5. 「一部の制限された操作」を実行するための追加権限を、`管理者`などの「利用者権限グループ」に加入することで得られます
6. MediaWiki は設定により、サイト全体の js, CSS や、アカウント利用者へ個別に適用される js, CSS などがあり、それらも MediaWiki のページとして管理されます
7. 「サイト全体の js, CSS」は、初期セットアップ状態の MediaWiki では「一部の制限された操作」に含まれるため、だれでも編集できるわけではありません。
8. 初期セットアップ状態の MediaWiki では、「アカウント利用者へ個別に適用される js, CSS 」は、その適用されるアカウントのサブページ（例: `User:USERNAME/common.js`）として作成し、それらはその利用者 (`USERNAME`) か、「一部の制限された操作」が可能なアカウント以外による編集はできません。
9. MediaWiki の初期セットアップ状態では、`ビューロクラット`と呼ばれる利用者権限グループの所属者が、同じサイトの全登録利用者に対して利用者権限グループへの加入・離脱を行うことができます
10. `Wikimedia project` のウィキでは、`ビューロクラット`は同じサイトの全登録利用に`管理者`権限や`ボット`フラグと呼ばれるものを付与することができますが、`管理者`などの一部の利用者権限グループに属する人を、そのグループから離脱させることはできません。そのため`スチュワード` が全 Wikimedia project におけるウィキサイトの全利用者に対して、利用者権限グループへの加入・離脱処理を行うことができます
11. スチュワードは、すべての WMF における公開ウィキ（誰でもアカウント作成が可能なウィキ）において、`管理者`利用者権限グループに属する利用者と同等の操作を実行する権限が与えられています
14. CentralAuth には「アカウントロック」と呼ばれる、スチュワードなどごく一部の限られた利用者のみが使える「ログインを禁止する機能」があります
15. MediaWiki には、通常のアカウントログインとは別に、BotPassword という API ログイン専用のパスワード発行・管理システムがあり、OAuth 1.0a も利用可能です

# 事の始まり
2018年前半、あるスチュワードのアカウントが乗っ取られたと判断されました。結果、一時的にそのスチュワードのアカウントはロック（ログイン禁止）されることとなりました。

WMF のセキュリティチームは、乗っ取りの状況を調査した結果、特定の機能が悪用されていると結論づけ、対策に乗り出し始めました。
その結果、一部のサイトにおける`管理者`利用者権限グループに所属する利用者が、安全ではない箇所から JavaScript を読み込んでいたことが発覚しました。

## 暗躍する攻撃者

WMF のセキュリティチームが対策を行っている最中、攻撃者も攻撃可能な穴（脆弱性）を探りつづけています。地道にその時が来るまで、じっくりと「種まき」を続けています。

# 第二波攻撃 - ファイル中央保管庫サイトに悪意のある js が仕掛けられる
Wikimedia project における画像や動画、音声といった利用者によってアップロードされるファイルの中央保管庫である [Wikimedia Commons](https://commons.wikimedia.org/) の`管理者`利用者権限グループに属するアカウントが乗っ取られました。

それにより、一時 Wikimedia Commons はサイト全体の JavaScript に悪意のあるものが仕掛けられ、次々に`管理者`権限グループに属するアカウントを含む多数のアカウントに、攻撃者が操れる BotPassword が本人が気づくことなくサイトにアクセスしただけ JavaScript によりでセットされました。

乗っ取りが疑われる奇妙な操作を行った管理者アカウントは、スチュワードによって一時的にロックされることとなりました。

WMF セキュリティチームは、この不正にセットされた BotPassword を、データベースから削除する処理を行いました。

# 第三波攻撃 - 次々に乗っ取られるスチュワードアカウント
2018年後半、攻撃者は対策の不十分な点を突き、再び攻撃を仕掛けます。手口は第二波攻撃と同様であったものの、さらに巧妙な手をつかって攻撃精度を上げたのです。

それは、**活動中のスチュワード権限保持者を見定める**ために [Meta Wikimedia](https://meta.wikimedia.org/) という、スチュワード活動の本拠地で[活動を監視](https://meta.wikimedia.org/wiki/Special:RecentChanges)し、悪意のある js を仕掛けることに成功した Wikimedia project のウィキサイト上にある「現時点で活動中のスチュワード権限保持者を対象とした利用者会話ページへ投稿」でした。確実にスチュワード権限をもつ利用者を指定のウィキサイトにおびき寄せるため、「利用者の会話ページに投稿するとメールやウェブ上での通知が飛ぶシステム」を悪用したのです。

この攻撃作戦は成功し、数名のスチュワードが攻撃者の制御下にある BotPassword をセットされてしまいました。スチュワードたちはチャットで連携を取りながら、不審な挙動のあるスチュワードや、悪意のある js が設置されたと思われるサイトを踏んだと思われるスチュワードは、安全が確認できるまでの間、一時的にアカウントをロックされることになりました。

# 事態の収束

## 発見された BotPassword の脆弱性
BotPassword には、CentralAuth によってアカウントロックが施されていても API 経由で[利用者権限が変更できるという脆弱性](https://phabricator.wikimedia.org/T194605) (CVE-2018-0505) があることが発覚し、修正されました。

## インターフェース管理者の導入
今までは、投稿の禁止措置である「ブロック」やページの編集禁止措置である「保護」といった機能の利用のみを目的に`管理者`になっていたセキュリティ知識や JavaScript, CSS にまでは詳しくない人も、サイト全体の CSS/JS や他利用者個別 CSS/JS を変更できていました。

それが今回は仇となったので、新たに MediaWiki は既存の管理者権限に含まれていた前述の CSS/JS 編集権限を「インターフェース管理者」に[分割する](https://phabricator.wikimedia.org/T190015)こととなりました。

## 誰でも編集可能なページにおける js と CSS の無効化
かつての MediaWiki では、だれでも編集できるページに置かれた js / CSS でも読み込みが可能でした。そこに置かれた便利なスクリプトを読み込んで使っていても、悪意のあるものによって編集されると同様の事例が発生するために、制限が設けられました。

- https://ja.wikipedia.org/wiki/Wikipedia:%E3%81%8A%E7%9F%A5%E3%82%89%E3%81%9B/%E9%81%8E%E5%8E%BB%E3%83%AD%E3%82%B0/2018%E5%B9%B410%E6%9C%88#Tech_News:_2018-40
- https://lists.wikimedia.org/pipermail/wikitech-ambassadors/2018-September/001955.html

## Content Security Policy の導入検討
外部リソースの読み込みを制限するために、Content Security Policy (CSP) の導入が検討されています。

- https://phabricator.wikimedia.org/T28508