XサーバーでSQLインジェクションのWordPressゼロデイ脆弱性を退治した手順

Yuzo Related PostsプラグインのSQLインジェクションゼロデイ脆弱性を退治した時の手順です。やられた後の症状は、被害を受けた独自ドメインにアクセスすると、マルウェア復旧サービスのWEBサイトなど、不特定のWEBサイトにランダムに勝手にリダイレクトされてしまうという状況になります。リダイレクト先は毎回異なります。ダッシュボードへのログインは可能で、ダッシュボードがリダイレクトされてしまうことは無かったです。

原因

原因は、Yuzo Related Postsプラグインがassets/ilenframework/core.php でis_admin()関数の使い方を誤り、非ログイン状態でも$wpdbのinsertやupdateなどデータベースのDML的な操作をhttp/httpsのPOSTリクエストで簡単に出来てしまうことです。結構シビアな脆弱性です。

以下画像は、埋め込まれたマルウェア実物です。Unicodeの文字コード化され、見た目はカンマ区切りのただの数字の羅列です。 カンマ区切りのただの数字の羅列をDBからそのまま出力した後、String.fromCharCodeによってブラウザにjavascriptとして解釈させており、人間的にjsのlocation.replaceやphpのheader(‘Location: ‘.$URL);などをファイルgrepやDB検索して、怪しいjavascriptやphpのマルウェアを見つけることはできません。ソースコード目視では探せないです。


yuzo-related-posts-sql-injection

Yuzo Related Postsプラグイン経由のhttp/httpsのPOSTリクエストでjavascriptのマルウェアを埋め込まれてしまいます。尚、Yuzo Related Postsプラグインを無効化していてもやられてしまいます。 私が緊急受託したレスキューケースでは、ダッシュボードでプラグインを削除しても、サーバ側のプラグインディレクトリではYuzo Related Postsプラグインが以下の様に丸ごと残っていました。コードは追っていませんがUninstall Methodsをしっかり実装できていないためだと考えられます。

ダッシュボードでyuzo-related-postsを削除してもサーバーでは残っています

ダッシュボードのプラグイン画面ではYuzo Related Postsプラグインは表示されない!というわかりにくい状況でした。原因調査中にWordpressのオーナーさんに聞いても、Yuzo Related Postsプラグインをインストールして、削除した記憶すら無い、「そんなプラグイン使ってません」と、忘れ去られている状況でした。

2019/4/10にゼロデイ脆弱性がwordfenceの記事でリリースされていたときには、Yuzo Related PostsプラグインはWordPress公式から即除名されていました。かなり有名なプラグインなので、対処法がわからず泣き寝入りした被害者は日本のみならず、世界規模で多いのではないでしょうか。

原因調査と対応の手順

  1. バックアップからWordPress(コア、テーマ、プラグイン)にマルウェアをSQLインジェクションされる前の状態に戻す。まずは復旧しました。同時にダッシュボード上であまり感じよくないプラグインは全部、停止ではなく削除しています。
  2. WordPressサイトのオーナーさんに、細かい時間間隔で、ブラウザから該当の独自ドメインにアクセスしてもらい、正常な状態を〇時〇分、インジェクションを受けた時は、〇時〇分としてメモしてもらい、ボット攻撃の時間帯を絞り込みました。数回バックアップに復旧しながら時間を絞り込みました。
  3. SQLインジェクションをされてしまうタイミングを10分くらいまで絞り込み出来たので、該当の10分程度のアクセスログを1つずつ手作業で調査、「ファイル名+vulneravility」「プラグイン名+vulneravility」などの思いつくキーワードで未知・既知の脆弱性を調査しました。NVDよりもWordPress専門の脆弱性データベースWEBサイトが有効という印象です。
  4. Yuzo Related Postsのゼロデイ脆弱性のwordfence記事を発見(Yuzo Related Posts Zero-Day Vulnerability Exploited in the Wild)、データベース内を検索すると、記事と全く同じjavascriptが見つかり、プラグインの削除、データベース内もyuzo関連のテーブルとwp_options内をすべて削除して駆除完了しました。

以下は、アクセスログを絞り込み、Yuzo Related Posts プラグインに懐疑の的を絞るに至ったときのものです。

apache log viewer でアクセスログを目視

脆弱性情報ってホントに大事だなぁ!としみじみ思いました。悪のボットの周期はおそらく、1日2回か3回くらいでインジェクションを仕掛けていたんじゃないかと思います。そして、ログ大事です、超大事、ログ無いと何もできません。尚、被害者の方は犯罪の被害者となりますので、そのことをお忘れなく。Thank you!!

WordPress/kusanagi/Azure/AWS/kintoneの開発運用相談