プラグインの脆弱性
トップページから記事を選択して個別のページへ飛んだ後、本文の下に関連記事を表示するために使用していた「Related Post(Yuzo Related Post)」というプラグインに脆弱性があり攻撃者がプラグインの設定に任意のコードを書き込む事が出来るようになっていた。2019年4月11日にアラートが上がりプラグインが非公開となっていたがこんな辺境の地のサイトにまで攻撃が来るとは思っていなかったのでしっかりとした対策をとっていなかったところ、2019年5月27日の20時12分に攻撃を受け対策が完了するまでの約3時間、当サイトにアクセスすると一回目のクリックで詐欺サイトが別ページで表示される状況となっていた。万が一その時間帯にアクセスした人がいたらご迷惑をお掛けしたことをお詫びします。
問題となったコードを以下に抜き出してみた。
function __construct(){ if( ! is_admin() ){ // only front-end self::set_main_variable(); return; }elseif( is_admin() ){ // only admin // set default if not exists self::_ini_();
「Wordfence」の指摘によると「is_admin()」の使い方が間違っているとのこと。このプラグインの作者は「is_admin()」を管理者としてログインしているかどうかの判定に使っているようなのですが、この関数は単に管理者画面にいるかどうかを判定しているだけで、管理者としてログイン出来ているかどうかは関係ないそうです。その辺は「公式ドキュメント」の「is_admin()」の項にも「current_user_can()」を使ってユーザーが実際に何が出来るのかチェックすること、と書かれています。
作りが稚拙でセキュリティが甘かったとしても人気のプラグインとしてあちこちで紹介されていたし、実際使ってみるとサイト運営者がやりたいことがほぼ実現出来ていたということで、全世界で約7万サイトにインストールされていたらしいです。作者は学生でほとんど趣味の世界だったようで現在対策した新バージョンを鋭意開発中らしいです。人気が回復するといいですね。
実際どんな攻撃が出来てしまうかというと外部から脆弱性のあるファイル(core.php)を指定してアクセスすることでこのプラグインの設定に任意のコードが書き込めるというもの。
「yuzo_related_post_css_and_style」というプラグインのオプション設定部分に、攻撃者が指定したサイトへリダイレクトするJavaScriptが埋め込まれていました。このオプションというのはファイルではなくてデータベースに保存されるのでサイト上のファイルをチェックするタイプの防御では防ぎようが無く、結果として回復まで3時間かかることになりました。
現在は全く違うプラグインで関連記事を表示しています。