IP Geo Block

WordPressプラグイン脆弱性 – 攻撃ベクタの分析と対策

「セキュリティ」のタグが付いたプラグイン は、公式サイトに1000個程もあり、その中から「1本」を選び出すのは至難の業でだと思います。

そもそも「セキュリティ対策」と一口に言ってもその範囲は広いわけで、健康管理に例えるなら「予防」や「診断」、「治療」とったカテゴリがあるワケで、さらに「予防」的なものには、

  • 「定期的にバックアップをとっておきましょう」的な「定期検診」系
  • 「常に最新版にアップデートしておきましょう」的な「うがい励行」系
  • 「パーミッションやパスワードを強化しましょう」的な「体力増強」系
  • 「2要素認証やファイアウォールを導入しましょう」的な「マスク着用」系

とまぁ色々あるワケです(ヘタクソな例えでスミマセン)。

一方、WPScan の脆弱性データベース には、プラグインやテーマが毎月10個ほど、続々と登録され続けています。

そこで私が最近こだわっているのが「未知の脆弱性という病巣を抱えたプラグインやテーマへの攻撃」を防御する「免疫力強化」系(!?)です。

ということで、IP Geo Block の現状の防御力を調べ、今後の開発の方向性を見定めるために、プラグインの脆弱性データベース から最新の50個を順に拾い、「攻撃ベクタ」という観点で分析を実施してみました(ものすごく骨の折れる作業でした 😉 )。

自分でも予想外の結果だったので、ここに公開します!

分析条件

DBの最新から順に無料で落とせるプラグインを拾い、公開されている「概念実証」(POC)を元にそのパターンを次の様な定義の「攻撃ペクタ」で分類しました。

攻撃ベクタ
= 脆弱性の種類 × 攻撃経路

「脆弱性の種類」は、XSSSQLILFICSRF などを表します。また「攻撃経路」は「WordPress に備え付けの入口」という狭義の意味として、以下の分類としました。

AX
WordPress 標準の Ajax を経由した攻撃
FE
一般公開ページの URI を経由した攻撃
PD
プラグイン PHP ファイルへの直接攻撃
WA
wp-admin 配下のファイルを経由した攻撃

また特に今回の分析のミソは、「何種類の脆弱性をカバーできるか」ではなく、「脆弱性に関する実際の統計的分布に基づいた攻撃経路の分布が得られる事」にあると考えています。別な言い方をすれば、「脆弱性の種類」と「攻撃経路」のどちらに着目した方がより効果的な防御が出来るかを調べたかったのです。

分析結果

まずは50件に占める「攻撃経路」の割合を以下の図に示します。同時に IP Geo Block の前バージョンと最新バージョンのカバー範囲を重ねてみました。

脆弱性の経路とWP-ZEPの遮断成功率

IP Geo Block は、国コードだけでは防げない攻撃を遮断する「ゼロディ攻撃の防御(WP-ZEP)」を装備しているのがウリです(少なくとも私的には)。そこで WP-ZEP の防御力を推定するためのコード・リーディングや幾つかの再現テストも同時に実施しました。

次の表はその結果で、IP Geo Block 2.1.0 の防御成否を示しています。「GEO」は「国コード」による遮断の成否を、「ZEP」は WP-ZEP による遮断の成否をそれぞれ表していて、単純な防御率としては、前バージョンの 2.0.8 で26%、今回更新の 2.1.0 では60%となりました。

プラグインの脆弱性 バージョン 種類 経路 GEO ZEP
WP Business Intelligence Lite <= 1.6.1 SQLI PD* OK OK
Ptengine <= 1.0.1 XSS FE NG NG
EZ Portfolio <= 1.0.1 XSS AX OK OK
WonderPlugin Audio Player <= 2.0 SQLI, XSS AX OK OK
Aspose Cloud eBook Generator <= 1.0 LFI PD NG NG
WPshop – eCommerce <= 1.3.9.5 AFU PD* OK OK
WPBook <= 2.7 CSRF WA OK OK
WP-ViperGB <= 1.3.10 XSS, CSRF WA OK OK
WordPress Survey & Poll <= 1.1.7 SQLI AX OK OK
WP Media Cleaner <= 2.2.6 XSS WA OK OK
WP Easy Slideshow <= 1.0.3 CSRF WA OK OK
N-Media Website Contact Form <= 1.3.4 AFU AX+ OK NG
Tune Library <= 1.5.4 SQLI FE NG NG
Redirection Page <= 1.2 CSRF, XSS WA OK OK
PHP Event Calendar <= 1.5 AFU PD NG NG
My Wish List <= 1.4.1 XSS FE NG NG
Mobile Domain <= 1.5.2 CSRF, XSS WA OK OK
MailChimp Subscribe Form <= 1.1 RCE PD NG NG
IP Blacklist Cloud <= 3.4 SQLI WA OK OK
IP Blacklist Cloud <= 3.42 LFI FE NG NG
InBoundio Marketing <= 2.0.3 RFU PD NG NG
Image Metadata Cruncher <= 1.8 CSRF, XSS WA OK OK
CrossSlide jQuery <= 2.0.5 CSRF, XSS WA OK OK
Aspose PDF Exporter < 2.0 LFI PD NG NG
Aspose Importer & Exporter <= 1.0 LFI PD NG NG
Aspose DOC Exporter <= 1.0 LFI PD NG NG
WP Ultimate CSV Importer <= 3.6.74 AB PD* OK OK
WP Ultimate CSV Importer <= 3.7.1 DT PD* OK OK
WP Mobile Edition <= 2.2.7 LFI PD NG NG
WP All Import <= 3.2.3 RCE AX OK OK
WP All Import <= 3.2.4 CSRF, XSS AX OK OK
UpdraftPlus <= 1.9.50 PE AX OK NG
Ultimate Member <= 1.0.78 AFU PD* OK OK
Ultimate Product Catalogue <= 3.1.1 AFU AX OK OK
Ultimate Product Catalogue <= 3.1.2 SQLI AX OK OK
Ultimate Product Catalogue <= 3.1.2 SQLI FE NG NG
TinyMCE Advanced <= 4.1 CSRF AX OK OK
Huge-IT Slider <= 2.6.8 SQLI AX OK OK
Simple Ads Manager <= 2.5.94 AFU, SQLI PD* OK OK
Related Posts for WordPress <= 1.8.1 XSS FE NG NG
Ajax Search Lite <= 3.1 RCE AX OK OK
Blubrry PowerPress <= 6.0 XSS WA OK OK
PlusCaptcha <= 2.0.14 CSRF WA OK OK
Plugin Performance Profiler <= 1.5.3.8 XSS WA NG NG
NEX-Forms <= 3.0 SQLI AX OK OK
MiwoFTP <= 1.0.4 LFI FE NG NG
MiwoFTP <= 1.0.5 CSRF, XSS WA OK OK
MainWP Child <= 2.0.9.1 AB FE NG NG
Mashshare <= 2.3.0 AB AX OK OK
WordPress Leads <= 1.6.2 XSS AX+ OK NG
OK の総数 33 30

表を眺めるみると、何となく「攻撃経路」に着目した方が良いのでは? という感じがしています(いい加減な、結果ありきの分析でゴメンナサイ)。

今後の対応

上の表を 「経路」で並べ替えて みて下さい。NG が残っているのは、ほとんどが「一般公開ページの URI を経由した攻撃(FE)」と「プラグイン PHP ファイルへの直接攻撃(PD)」であることが分かります。これらが厄介なのは、管理者権限を持たない一般訪問者向けの機能を含んでいるという点です。

実は IP Geo Block 2.1.0 は、今回の分析を元に「PD*」(wp-load.php を読み込んでいる、プラグイン PHP ファイルへの直接攻撃)に対処できるよう、対策をしています。その結果、WordPress のコンテキストとは全く関係なく単独で実行が出来てしまう「PD」が残ったというワケです。

私にとって驚きだったのは、一般公開ページ向けのサービスに WordPress とは独立な脆弱性が予想以上にあったという事実です。このリスクを下げるには、一般公開ページ向けにも何らかの対策を施すべきということが、定量的にも分かっちゃった次第です。

まとめ

正直、前バージョンの IP Geo Block については、思ったより防御率が悪くてガッカリ、というか「誇大広告」ぎみで、利用して下さっている方々にちょっと申し訳ない気持ちになりました。同時に「他のセキュリティ・プラグインはどうなんだろう?」という興味も湧いてきたので、そのうち「ゼロディ攻撃に対する防御力」という観点で比較検証してみたいと思います。

次のステップは「PD*」を遮断する事です。これにより遮断率を80%にする事ができます(が、副作用も増えます)。原理的なところはほぼ出来ているのですが、リライトの設定とか新たな脆弱性を作り込まないための検証とか、結構時間がかかると思います。

また IP Geo Block は「一般公開ページは誰でもアクセスできる様にしておきたい」という気持ちで作ってきました。今後はこの選択もユーザーに任せるべき? と思っています。ただ「検索botは遮断しない」とかの「抜け穴」を作らなくちゃならないので、気が進まないのですが …

まぁ、今後もチマチマと改善は加えていくので、使ってくれれば励みになります 😀 。

WordPressプラグイン脆弱性 – 攻撃ベクタの分析と対策」への3件のフィードバック

  1. るな

    IP Geo Block 2.2.4 に更新したら

    「Warning: strpos(): Empty needle in ~/class-ip-geo-block.php on line 71」

    って出ちゃいます。

    このコメントは削除していただいても結構です。

    返信
  2. tokkonoPapa 投稿作成者

    るなさん、

    フィードバック、ありがとうございます! フォーラムでも報告があり、先ほど問題の部分を元に戻したバージョンをリリースしたところです。皆さんにご迷惑をおかけし、すみませんでした m_(..)_m。

    もちろん、変更は意図あっての事だったのですが、テストの想定が足りませんでした。じっくり考えて再チャレンジしますので、今後ともよろしくお願いします!

    返信
    1. るな

      tokkonoPapa さん。

      なんか、ダメみたいです。
      2.2.4.1 に更新したら

      「変更を保存」ボタンを押すと、Forbidden
      その後は、IP Geo Block の設定画面を開こうとするたびに Forbidden

      何も出来なくなってしまったため、
      FTP で旧バージョンに戻して復帰しました。。。

      返信

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

海外からの投稿は受け付けていません