Twitter(じゃなかった、X)などのSNSでよく流れてくる「WordPressプラグイン〇〇にXSSの脆弱性..」という情報。これって何?と思ったことありませんか?
よーわからんけどとにかく新しいバージョンでは対応済みたいだから更新しておこっと!と思って更新を実行した方、正解です(笑)。
ただ、セキュリティの部分なので、とにかく..ではいけないと思い、どんな危険があるのか?自作プラグインや自作テーマで運用するケースではどう確認と対処をしたらいいのか?というのを、私が分かる範囲で公開しておきます。
私はセキュリティの専門家ではありませんので、いろいろな参考資料の1つとしてお読みください
「XSS(Cross-site scripting)」の脆弱性とは?
XSSとは、Cross-site scriptingという語の略です。
「XSS(Cross-site scripting)」という単語を「Cross Site Scripting」と英語表記して直訳してみると「サイトを通じてスクリプトを書き込む」というような意味になるので、理解しやすいと思います。
つまりはどこかの入力項目にスクリプトを記述することで、訪問者がページを開いた時などに実行されて思わぬ動作をする、そして、それを目論んで項目にスクリプトを仕掛けてみる(攻撃する)ことを「XSS攻撃」といい、実行されてしまうケースが存在することを「XSS脆弱性」とか「XSSの脆弱性」などというんです。
また、なぜ「XSS」と略すのか..は一目瞭然、そのまま略すと「CSS」となり、「Cascading Style Sheets(CSS)」と混同するので、「cross(十字架)」を「X(クロス)」としてXSSとしているんだそうです(結構単純)。
XSSの脆弱性があるとどうなるのか?
ざっくりいえば、何かの動作をさせるJavaScriptを書き込み、ページ表示時に実行できてしまうということです。
例えば、WordPressで子テーマなどにスクリプトを読み込ませるような環境(ファイルとwp_enqueue_scriptsによる読み込み)を作り、以下のコードを追加してみてください(よい子はしないでください)。
<script>alert('test')</script>
そして何かのページを表示すると、「test」という文字列が含まれたアラートボックスが表示されますよね。
これは単純にアラート表示するだけのものですが、これがどこかへのリンククリックを促すものだったり、もっと悪質に、開いた途端に別のサイトへ移動するようなものだったら..大変です。
試しにやってみた方、ウェブキャッシュによってしばらく消えないので、コード削除してページ表示したら「Ctrl」+「F5」でキャッシュをクリアしてください
上記で単純なスクリプトを1つ紹介しましたが、画像タグに偽装して仕込んだり、HTML入力可能な場所でわざとHTMLを壊してからスクリプトを差し込むようなコードを入れたりするケースもあるようですから、どんな攻撃方法があるのかは各自調べてみてください。
つまり、〇〇プラグインにXSS脆弱性が..というのが情報として流れてきたら、設定画面のどこかか、フロントエンドの入力フォームのどこか、投稿編集画面のメタボックス(編集画面外にあるフォーム)のどこかなどから入力されたものにスクリプトが含まれている場合には実行されてしまう可能性があるということなのです。
それから、この情報が目に留まるようになるのは、実は結構後になってからで、既に対策済の更新バージョンがリリースされた後であることが多いので、それまでの間は、もしも、ひょっとすると危険にさらされていた間に何かが起こっていてもおかしくありません。
この種の脆弱性でサイトが実際に攻撃を受ける環境としては、WordPressに限って言えば、他者のログインをさせないようにした環境では起こりにくく(もちろん不正にログインされたら脆弱性云々ではなく無法地帯となります)、フロントエンドから通常のコメント項目以外の入力をしてもらうようなサイト(会員制サイトやアンケートサイト、掲示板など)や、複数の方がユーザー登録をして管理画面側で投稿などを行うサイトで発生することが多いです。
え?登録したユーザーには投稿者や寄稿者の権限しか与えてないし..という方、とあるプラグインでは、これらの脆弱性を突いてユーザー権限を勝手に変更できてしまうというケースもありましたから、本当に注意が必要です。
XSSの脆弱性を突いた攻撃をうけないためには
コードなどを追加しないサイトの場合
自身でカスタマイズコードなどを一切追加しない、既存のテーマ+プラグインのみで構成しているサイトの場合は、そのテーマやプラグインの信頼性に頼るほかありません。
よくSNSなどで、脆弱性が見つかったことに対して悪態をつくような書き込みを見ることもありますが、コードを書いたり、セキュリティ面に配慮したりということができないからそれらに頼っているわけで、特に無料配布されているものは、完全に作者のボランティア精神による機能提供なのですから、文句を言うのは筋違いだと個人的には感じます。
そこでユーザーとしてできることとして、以下に留意して運営することをおすすめします。
- そのプラグイン(機能)が本当に必要なのかどうかを考える
- できるだけ人気のあるプラグインを選ぶ
※脆弱性が見つかるプラグインはある程度人気があるから見つかるわけで、決してセキュリティが甘いということではありません。むしろユーザーの少ない物は見つかっていないだけという可能性があるかも知れません - 更新履歴を見て、比較的頻繁に更新されているプラグインを選ぶ
※プラグインの更新履歴は英語表記なので分かりにくいかも知れませんが、「Fix..」という行が多くあるものほど後から見つかった不具合に対してきちんと対応しているというバロメーターにはなると思います - 掲示板や会員制とする部分のみを独立したサイトとして分離できないかを考える
WordPressは本当に便利なプラグインがたくさん出ているので、いろいろな機能を1つのサイトに詰め込もうとしがちですが、ディレクトリ(フォルダ)を作って別のWordPressをインストールして同一ドメインでも別々に運営することも可能ですから、既にごちゃごちゃになっているサイトの場合は検討するようにしましょう。
自作プラグインやテーマにコードを追加して運営しているサイトの場合
自分でいろいろなページを検索してコードを追加して機能を充実させるという方の場合は、データのサニタイズ(無害化)について知っておく必要があります。
特に自作プラグインで設定画面を設けている場合や、投稿編集画面にカスタムフィールドの値を入力・保存するためのメタボックスを使用している場合には、入出力時のサニタイズは必須となります。
サニタイズ(エスケープというのも広義で同義語です)は入力・出力両方に施すのが一番ではあるものの、例えばショートコードでカスタムフィールドの値を出力するといった使用ケースでは、どんなデータをショートコードに格納して出力するかの限定が難しいので、出力側で制御することは難しいですから、入力側できちんと限定しておくことが大切でしょう。
サニタイズ関数や使い方については以下のページでも結構詳しく触れていますので、よかったら読んでください。
また、セキュリティに関する情報についても以下のページで触れていますのでよかったらどうぞ。
コメントを残す