tweet:2013:0830_01
WordPress乗っ取りについて考えてみた
世間で姦しいので、WordPress乗っ取りに関して考えてみた。
17:15 追記: どうやら、世間で姦しい方の乗っ取りに関しては、末尾の備考に追記した方が本命でこの推測は予測しすぎという結論に落ち着きそうです。
あくまでも、個人的に考えただけなので、どこかで発生している何かがこんな流れであるということではありません。
- 以下の内容は、端から見た「どこかの事案」を元にした(勝手な)推測である。
- 以下の内容は、「仮に似たような事案があったとしても、あくまでも」、特定の誰かを対象としたものではない。
という前提で読んでください。
こんな世知辛いことを書かなきゃいけない今のInternetってどうなのよ?という話は、いつかまた、機会があれば。
前提
- どこか(以下 A社)のサービスとして、共有サーバーを用いたレンタルサーバーサービスを提供している
- このサーバーサービスでは、Blog設置サービスとしてWordPress(以下WP)やMovableType(以下MT)、メール関係のサービス等が提供されている
- 標準ではDBを利用するのはWPのみ
- このサービスのレンタルサーバーは「共有サーバー」であり、複数の様々な利用者を収容している
- DataBaseを提供するサービスも提供しており、MySQLをユーザー単位で提供している
前提知識
- WordPressは、PHPとMySQLを利用して動作するシステムである
- WordPressで管理される情報は(一部の実体としてのファイル)を除き、全てMySQL内に記録される
- つまり、DB内には、過去の投稿などの記録だけで無く、管理者アカウント情報等も含まれている
- WordPressは、(通常) 1サイト毎に 1DB を使用する
- DBへの接続には、MySQLの認証ロジックを利用しており、Username/Passwordが必要
- WordPressは上記認証情報を wp-config.php に登録している
- この情報は、PHPがMySQLdとセッションを張るために必要な情報であり、暗号化などはされていない
- 一般にWeb ServerはApache等のWeb Server Application(以下httpd)がそのサービスを提供する
- 通常、httpdはシステムに脆弱性を作らないようにするため、(一般には)制限された権限で動作する
- この制限された権限でもWordPressが動作するようにWordPressの本体(PHPスクリプトファイル群)は、注意深く権限設定されていなければならない
前提知識から明らかな結論
- WordPressサイトへの攻撃は、wp-config.phpを入手できればOK
- WordPressサイトへの攻撃は、WordPressのDataが記録されているDB(MySQL)に対象サイトのUsername/Passwordでlogin出来ればOK
- もし、WordPressのDataが記録されているDBのrootパスワードを取得できれば、WordPress以外の全データが奪れるので、なおBetter
- A社のサービスモデルならば、DBサーバーも複数存在する可能性が高く、もし全てのDBサーバーのrootパスワードが一緒なら、一気に美味しい
考えたケース
- A社のWPサービスを利用している大多数のユーザー(5000以上)のサイトが書換えられた
- A社でwp-config.phpのpermission等を再度設定しなおしたが、その後も書換えられるという報告が(少なくとも数件)上がっている
- WordPressのVersionは関係ない(最新版でも古いものでも同じように発生している)
推測
以下、個人的な推測です。こうだったという証拠はありません
- 被害が多数にわたっていることから、個別にwp-config.phpが漏れたとは考えにくい
- 根拠
- このwp-config.phpが漏れるためには、wp-config.phpに何らかの方法でアクセスできる必要がある。
- WordPressからwp-config.phpにアクセスする方はないと思われる(あるのかもしれないが私は知りません)。
- WordPress以外のWebサービス経由か、(ftpやssh等で)loginした上で持っていくか、サーバー自体を乗っとられるか位しか、取得する方策はなさそう。(あるのかもしれないが、私は知りません)
- Browserやwget/curl等で取得する方策は、httpd側でphp処理を実行して結果を返すだけになると考えられるのでダメ。
- WordPress本体、もしくはPHPのBUGの可能性は捨て切れないが、非常に低いと思われる。
- 従って、これだけの数(5000以上)のwp-config.phpを「個別に」取得したと言うのは考えにくい。
- あり得るとしたらサーバー丸ごと乗っとられて、一気に全部のwp-config.phpを持っていくというシナリオだろう。
- 注意:
- 上記シナリオは、そもそもサーバーが正しく護られているという前提にたっている。
- 以下のシナリオが成立する場合は、前提がひっくり返るので注意
- ftp等で/etc/passwd (shadowやmaster.passwdではない)を持っていくことが可能で、利用者のアカウントが全て取得でき、利用者のwp-config.phpが持っていかれる場合
- ApacheでDirectory listingが可能であって、その手法でwp-config.phpが持っていかれる場合
- その他、User permissionがボロボロで何でも出来てしまう設定だった場合
- Webサーバーが乗っとられたのか?というと微妙
- 根拠
- もしサーバーが乗っとられたのであれば、WordPress以外のサービスでも書換えなどの攻撃を喰らったのではないかと考えられる。
- Blog系は、WPかMTが供給されており、それなりに利用者がいると考えられる。
- その他、Mail等も提供されていることを考えれば、WPだけというのは考えにくい
- また、一般にこの種のサービスは、利用者にDisk容量を供給するが、一人当たり10Gとか20GとかのDiskを供給することが多い。
- その場合、1台のサーバーに5000以上のユーザーを収容するか?というとそういう可能性は低い。
- 通常は多くても500〜1000ユーザー程度しか収容しないと思われる。(それでも多い気はしますが)
- 以上から、被害は恐らくサーバー5台分以上に相当する。
- それ以上のサーバーがあると考えられるので、その内のWPユーザーがいるものだけを乗っ取ったと言うのは考えにくい。
- あり得るシナリオは、1台乗っ取ったか、全部乗っ取っただと思うが、被害範囲から後者。
- やはりWPだけが被害を受けていると言うのは考えにくい。
- 注意
- そもそも攻撃者の意図がA社のWPをいじめることにあるなら、WP以外に目をくれない可能性はある
- WPを提供しているサーバーとそうでないサーバーが分離している可能性は否定できない
- 但し、これはサービス毎に収容サーバーを変えることになるため、やはり考えにくい
- 契約後サーバー立ち上げまでに利用する全サービスが決り、途中追加はないを仮定せざるを得ない
- DBが乗っとられたという可能性が高い
- 上記から、書換え自体はDBに直接行われた可能性が一番疑われる
- 根拠
- 書換えを行った全てのページに対し、管理コンソールから書換えを指示する手法では時間がかかること
- 上記手法をscript化出来るなら、DBに対して発行する命令を分析してSQL文にすることは容易であること
- 書き換えた場所にもよるが、多くの場合でサイトのタイトルやキャッチフレーズなど、WPに標準で設定する部分が書き換えられていると思われること
- 注意
- WebサーバーからmysqlコマンドでDBへのSQL命令を発行する手法が取れる場合、そのWebサーバーにlogin出来ていることを(ほぼ)意味する
- その場合は実質2のサーバーを乗っとられてるシナリオとかなり近い状況になる。
- そもそもこの種のサービスでユーザーへのloginを許可する設定になっている可能性は低いと考えられる。
- 何らかの踏台等を経由して、DBに直接アクセスできる状況を作り、そこからMySQLのroot権限を乗っ取り、一気にDBを書き換えたという可能性が高い
- 問題点
- そもそもDBにアクセスできる踏台があるのか?
WordPressが大雑把に1サイト(一人?)あたりどの程度のData容量を食うのか?を類推してみる。
- Case-1: 1投稿の「平均的な文字数」を2000文字とし、全てが持続ブロガー(1記事/1日程度)と考えた場合
2000(文字) * 2(1文字2バイト) * 365(日) * 1.2(DBに登録される情報の係数) < 2MBytes/年
←[1]
- Case-2: 週1ブロガーの1投稿の「平均的な文字数」を1500文字とし、持続ブロガーが1%、残りを週1ブロガーと考えた場合
( [1] * 1% ) + ( 1500(文字) * 2(1文字2バイト) * 52(週) * 1.2(DBに登録される情報の係数) ) * 99% < 300KBytes/年
参考
- http://glink.jp/files/BlogSustainability060615.swf (Flashなのでちょっと…)
- 恐らく2006年頃の調査と思われる
-
- 2009年頃のエントリー。収集方法がgooに偏っているが、上記とかなり出ている数値が近い
以上より、
- Case-1で1万ブロガーいるとすると、2MBytes * 10000 = 20GBytes/年
- Case-2で1万ブロガーいるとすると、300KBytes * 10000 = 3GBytes/年
- Case-1,Case-2のいずれにしても5000ブロガー毎に1台程度MySQL Serverを準備すれば良いと予想できる。
考え得るシナリオ
- 内部犯
- 今回の場合、被害がWPに限定されていることを考えると、内部犯は考えにくい。が多少の可能性は残っている
- 内部犯であるなら、技術問題は恐らく関係ないので、シナリオを割愛する
- 外部犯
- そうはいってもWeb Serverから攻撃した場合
- A社のWPサービスを買う
- DBのアドレスなどを取得する
- wp-config.phpを収集する
- mysqldに対して認証情報などを使って直接SQL文を突っ込む
- 何らかのDBへの踏台を見つけた場合
- 踏台からMySQLdに対してPassword Crackをかける
- MySQLdのroot権限を奪取
- 個別の認証情報など使わずに、一気に全員書き換える
- MySQLがInternetからDirectにアクセスできてしまっている場合
- どこからかMySQLdに対してPassword Crackをかける
- MySQLdのroot権限を奪取
- 個別の認証情報など使わずに、一気に全員書き換える
- このシナリオの場合には、wp-config.phpで集めた認証情報を使う手も利用できるので、かなりカオスです。
結論
以上の考察が正しいとするなら、このような問題が発生した場合、恐らくWordPressの脆弱性とかを疑うよりもサービス及び運用を疑う方が正しいと考えられます。
これは、今回の事案例が「多数の利用者」が「一気に」コンテンツを書換えられたという事例だからで、通常は運用しているWordPressの脆弱性や外部からの攻撃であることが多いでしょう。
備考
tweet/2013/0830_01.txt · 最終更新: 2018/05/14 13:42 by 127.0.0.1