APIに、認証を回避してコンテンツを書き換えられる脆弱性が存在する。攻撃は極めて容易で、その影響は任意コンテンツの書き換えであるため、重大な結果を及ぼす。対策はWordPressの最新版にバージョンアップすることである。本稿では、脆弱性混入の原因について報告する。はじめにWordPress本体に久しぶりに重大な脆弱性が見つかったと発表されました。こんな風に書くと、WordPressの脆弱性なんてしょっちゅう見つかっているという意見もありそうですが、能動的かつ認証なしに、侵入できる脆弱性はここ数年出ていないように思います。いうクラスのものが久しぶりに見つかったということですね。Blog以下は、ITMediaの記事からの引用です。WordPressではこの問題について、「セキュリティ問題は常に公開されるべきというのがわれわれのスタンスだが、今回のケースでは、何百万というWordPressサイトの安全を保証するため、意図的に公開を1週間先送りした」と説明している。この間にSucuriをはじめとするセキュリティ企業と連携し、攻撃が発生した場合でも各社のファイアウォールで防御できる態勢を確立。自動更新を通じてWordPressの更新版が行き渡り、できるだけ多くのユーザーが保護されるのを待ってから、情報を公開したという。脆弱性のサマリは下記となります。対策WordPressのアップデート(4.7.2にて修正)認証なしにリクエスト一発でコンテンツを改ざんできるため、影響は極めて深刻です。対象バージョンをお使いの方は、即刻アップデートすることをお勧めします。攻撃の様子PoCは複数公開されています。以下、一部を伏字にした形で攻撃の手順を説明します。以下に攻撃前のコンテンツを示します。WordPressをインストールした直後であることが分かります。このサイトに対して、以下のリクエストを送信します。一部伏字にしています。攻撃後の画面は下記となります。攻撃を受けて、コンテンツが改ざんされていることが分かります。上記から分かるように、認証不要で、攻撃に特別な情報も必要とせず、極めて容易にコンテンツが改ざんできるため、深刻な脆弱性であることがわかります。Blogにて解説されていますが、この記事だと少し分かりにくいので解説を試みます。Coreにバンドルされました。以下の説明において、攻撃目標は、認証を回避して、id=1のコンテンツを改変することとします。APIの内部では、以下の2つのメソッドが動きます。メソッドのソースです。}ここで、idとして以下のようなパラメータを指定した場合のそれぞれの返り値を示します。返されるところが恐ろしいですね。get_post関数が受け取るパラメータを確認してみましょう。コンテンツが変更されることになります。対する更新ができてしまうことになります。以上が、この脆弱性の根本的な原因です。4.7.2では、代わりに、get_postメソッドがget_post関数のラッパーとして作成され、権限チェックと更新の両方から呼ばれるようになりました。}get_postメソッドの冒頭は下記のとおりです。整数にキャストすることと、「存在しないコンテンツ」に対してエラーを返すようになりました。どちらか一方でも先の攻撃は防げるはずですが、とくに「存在しないコンテンツ」に対するチェックがいいですね(元々そうすべき内容ではありますが)。教訓この脆弱性は権限チェックの間違いの典型例です。チェックと更新とで、異なる入力を用いているわけですから、両者の不整合がチェック漏れの原因になります。キャストしている箇所があります。これは潜在的にバグや脆弱性の原因です。以下のいずれかにすべきであると考えます。APIに存在した脆弱性について説明しました。(権限昇格)としています。一般ユーザーが特権を悪用できるように感じますが、実際には認証しなくても権限が悪用できるため、「アクセス制御の欠落」の方がより適切であるように思います。前述のように、極めて危険な脆弱性であるため、当該バージョンのWordPressをお使いのサイトは、至急のアップデートを推奨します。【HASHコンサルティング広告】HASHコンサルティング株式会社では、WordPressを用いたウェブサイトのセキュリティ強化支援サービスを提供しています。詳しくは以下を参照下さい。