WordPress REST APIのセキュリティが脆弱という誤解
REST APIはWordPress内のデータをJSON形式で取得できる機能です。
歴史的な経緯から危険な印象があり、無効化を推奨する記事も多いです。
しかしほとんどの場合、REST APIを無効化すべきではありません。
REST APIは開発者のための機能
WordPressで構築されたサイトなら「ドメイン名/wp-json/wp/v2/」でREST APIにアクセス可能です。
※このサイトなら「https://otogeworks.com/wp-json/wp/v2/」
他のURL(REST APIではエンドポイントと呼びます)も用意されており、様々なデータを取得できます。
例えば以下のようなデータです。
- 登録されているユーザーの情報
- 投稿された記事の情報
- 登録されているカテゴリやタグの情報
- アップロードした画像やファイルの情報
ユーザーのパスワードなど、重要なデータは取得できません。
取得できるデータはWordPressで公開情報とされているデータのみです。
REST APIの魅力は、プログラムが扱いやすいJSON形式でデータを取得できることです。
一部のテーマやプラグインはこれに依存した作りになっています。
ユーザーのための機能ではなく、開発者のための機能なのです。
過去に深刻な脆弱性があった
WordPress 4.7.0から4.7.1には、REST APIの脆弱性がありました。
![](https://www.ipa.go.jp/k3q2q400000050d7-img/k3q2q400000050dg.png)
REST APIは4.7.0で登場した新機能でした。
しかし、この機能には不幸な出生秘話があります。
REST APIを介して第三者がサイトの改変を可能にする、深刻な脆弱性が存在したのです。
この脆弱性を修正した4.7.2がリリースされ、利用者にはアップデートが呼びかけられました。
悪用を防ぐため、リリース直後は公式からのアップデート内容も伏せられていました。
しかしこれらの努力むなしく、少なくとも155万のサイトが改ざん被害に遭ってしまったのです。
![](http://internet.watch.impress.co.jp/img/iw/list/1043/880/wordpress0.png)
セキュリティに関する被害の中でも大きな部類です。
Webにおけるセキュリティの歴史という大きな枠組みに、悪い意味で名を連ねたことでしょう。
この衝撃的な出来事がきっかけで「REST APIは危険な機能である」という認知が世間一般に広まりました。
中には「WordPressは危険なソフトウェアである」と感じた方もいるでしょう。
上長からWordPress関連の調査指示を受けた方もいるのでは?
WordPressのメジャーなセキュリティ系プラグインにもREST APIを無効化・制限できる機能があります。
それはこのような歴史的事情があるからです。
現在はもう危険ではない
前述の出来事は2017年の話です。
現在のREST APIにそのような脆弱性は存在しません。
もしかするとまだ発見されていない脆弱性があるかもしれません。
これから実装される機能に伴って脆弱性が増えてしまうこともあり得るでしょう。
しかし、それは全ての機能に対して言えることです。
現在のREST APIが危険ではないことが分かります。
また、WordPressの開発陣は二度とそのようなことが起こらないように尽力しているはずです。
WordPressのシェアは年々増加を続けています。
2017年の時点ではWeb上の27.3%のサイトがWordPressを使っていますが、2022年の時点では43%まで上がっています。
また同じような事故が起こると、当時よりも事態が深刻になるのです。
開発陣の意識が低いなどということはないでしょう。
とはいえ、残念ながらどれだけ気を付けていても脆弱性が生まれてしまうことはあります。
WordPressは基本的には有志が集って開発しているものですし、責められるものでもありません。
無効化・制限するデメリット
前述の通り、テーマやプラグインの中にはREST APIに依存した作りのものがあります。
有名どころではContact Form 7、Caldera Form、Yoast SEO、Jetpackなどです。
これらのプラグインを使っていた場合、プラグインを生かしつつ制限する必要があります。
むやみに制限すると知らず知らずのうちに不具合に悩まされるわけです。
また、WordPressそのものにもREST APIに依存した機能があります。
具体的には以下です。
- アプリケーションパスワード
- WordPressのモバイルアプリ
アプリケーションパスワードは外部アプリケーションとWordPressを認証する仕組みで、WordPressのモバイルアプリはスマートフォンなどからWordPressを使うためのアプリです。
REST APIを制限すると、これらが使えなくなる恐れがあります。
この先、バージョンアップに伴って実装される新機能でもREST APIが必要になるかもしれません。
危険なこともある?
「REST APIは必ず有効にするべきだ」というわけでもありません。
無効化・制限すべきパターンもあります。
ユーザー名の流出
仮に以下の要件のサイトがあったとしましょう。
- 従業員を100人以上抱えた企業のポータルサイト
- ポータルサイトはWordPressで構築している
- ポータルサイトには全従業員がログイン可能である
- 社内連絡のほか、従業員同士で連絡を取ることができる
- 社外からも閲覧できるようにするため、インターネットからアクセス可能である
さらに、以下の運用を行っていたとします。
- ポータルサイトには全従業員に対する登録を義務付けている
- 他の従業員から分かるようにするため、ユーザー名は従業員の個人名とする
この条件で運用していた場合、対策しなければ全社員の個人名が流出します。
REST APIを使えば、WordPressに登録している全てのユーザーに関するデータを取得できます。
このデータにユーザー名も含まれているので、ユーザー名に個人名を使っているとアウトです。
このケースに該当する場合はREST APIを制限しましょう。
未公開情報の意図しない公開
REST APIは「アップロードしたファイルのURL一覧」が取得可能です。
画像やPDFなど、管理画面からアップロードしたすべてのファイルが対象です。
WordPressではこれを公開情報としているので、ログイン状態にかかわらず取得可能です。
限られた人にのみURLを教えてファイルをダウンロードしてもらうように運用している方もいるでしょう。
このようなパターンではREST APIを無効化・制限するべきです。
つまり、URLを知っている人だけが閲覧できるようにしているファイルがある場合は対策が必要です。
REST APIは無効化すべきではない
ほとんどの場合は無効化・制限すべきではありません。
制限することにデメリットがある以上、明確な理由がなければ制限せずにそのまま使うべきです。
前述した通り、以下のパターンに当てはまる場合は制限することをおすすめします。
- ユーザー名に個人を特定できる名称をつけている
- 特定の人だけが閲覧できるファイルがある
あとがき
2022年現在、「WordPress REST API セキュリティ」辺りで検索すると「REST APIは無効化すべき」「制限すべき」という趣旨の記事がたくさん出てきます。
それが間違っているというわけではないので、否定はしません。
- なぜそのような設定をしなければならないのか?
- デメリットは何なのか?
そこまで解説している記事は少ないように感じました。
理由なしに設定すべきではないので、少しでも検索に引っかかるようにするために本記事を書きました。
ちなみに、本記事の内容は以下の記事でも解説しています。興味があればどうぞ。
![](https://otogeworks.com/wp-content/uploads/2022/01/some_wordpress_security_do_not_have_to_do.png.png)