WordPress の load-scripts / load-styles 攻撃(CVE-2018-6389)を緩和します。
Nginx によって wp-admin/load-scripts.php と wp-admin/load-styles.php へのすべてのリクエストを拒否します。
TL;DR
WordPress は load-scripts.php(JS用)または load-styles.php(CSSファイル用)を使用し、ブラウザは単一のリクエストで複数のJS/CSSファイルを取得します。パフォーマンス的にはこの方が優れており、ページの読み込みが速くなります。この機能は管理ページ専用に設計されていますが、wp-login.php ページでも使用されるため、これらのファイルには認証が適用されません。
# for example
https://example.com/wp/wp-admin/load-scripts.php?c=1&load[]=jquery-ui-core,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,wp-fullscreen-stu,wp-ajax-response,wp-api-request,wp-pointer,autosave,heartbeat,wp-auth-check
# same goes to https://example.com/wp/wp-admin/load-styles.php
単一のリクエスト(認証不要)だけで、サーバーに180回以上のIO読み取りを実行させ、すべてのファイルを連結して4MBを超えるレスポンスを生成させることができます。適切なファイアウォールやレート制限がない小規模なサーバーにとっては、DoS攻撃を実行するのに十分です。
- 本当にHTTPSを使用すべきです。使用していないのであれば、そもそもウェブサイトを持つべきではありません。
- HTTPSを使用しているなら、HTTP/2を使用しない理由はありません。
- HTTP/2なら、ファイルを連結する必要はありません。実際、それはアンチパターンです。
-- WordPress における load-scripts.php DoS「攻撃」CVE-2018-6389 の緩和方法
load-scripts.php と load-styles.php へのすべてのリクエストを拒否するこのロールを requirements.yml に追加します:
# requirements.yml
- src: https://github.com/ItinerisLtd/trellis-cve-2018-6389
version: 0.1.0 # Check for latest version!
コマンドを実行します:
➜ ansible-galaxy install -r requirements.yml --force
dev.yml と server.yml の role: wordpress-setup の直後にこのロールを追加します:
roles:
# some other Trellis roles ...
- { role: wordpress-setup, tags: [wordpress, wordpress-setup, letsencrypt] }
- { role: trellis-cve-2018-6389, tags: [nginx, wordpress, wordpress-setup] }
# some other Trellis roles ...
その後、通常どおり再プロビジョニングします:
# https://roots.io/trellis/docs/local-development-setup/
➜ vagrant reload --provision
# https://roots.io/trellis/docs/remote-server-setup/
➜ ansible-playbook server.yml -e env=<environment>
連結を無効にします:
# config/application.php OR wp-config.php OR equivalent
# normal OR outdated Bedrock:
define('CONCATENATE_SCRIPTS', false);
# Bedrock with roots/wp-config:
Config::define('CONCATENATE_SCRIPTS', false);
その後、通常どおりデプロイします:
# https://roots.io/trellis/docs/deploys/
➜ ./bin/deploy.sh <environment> <domain>
# or alternatively
➜ ansible-playbook deploy.yml -e "site=<domain> env=<environment>"
いいえ、Kinsta や WP Engine のようなマネージドホスティングでは使用できません。
この種の攻撃を緩和するのはホスティング会社の役目です。
ありがとうございます!気に入っていただけて嬉しいです。このプロジェクトを誰かが使っていることを上司に知ってもらうことが重要なのです。wp.org でのレビューの代わりに、以下を検討してください:
➜ ansible-playbook -i 'localhost,' --syntax-check tests/test.yml
trellis-cve-2018-6389 は Tang Rufus によって作成された Itineris Limited のプロジェクトです。
このプロジェクトを可能にしてくれた Trellis を開発した the Roots team に特別な感謝を捧げます。
貢献者の完全なリストはこちらにあります。
フィードバックをお寄せください! 私たちはこのライブラリをできるだけ多くのプロジェクトで役立つものにしたいと考えています。 issue を送信して、良い点・悪い点を指摘してください。または、プロジェクトをフォークして提案を行ってください。 どんなに小さな issue でも歓迎します。
最近の変更の詳細については CHANGELOG を参照してください。
trellis-cve-2018-6389 は MIT License の下で公開されています。