危険なWordPressプラグインの作り方

# 危険なWordPressプラグインの作り方

[WordBench東京 3月勉強会「WordPress プラグイン祭り」](https://wbtokyo.doorkeeper.jp/events/58337)の発表資料です。

----

## WordPressプラグインの脆弱性の分類

〜Sucuriブログからの抜粋を添えて

----

### SQLインジェクション

* `$wpdb` の間違った使い方により発生。外部からデータベースから自由に情報が取り出せたり、変更できたり
* 結果、ログインパスワードのハッシュが窃取されるなどの被害が起こる
	* [NextGEN Gallery for WordPress](https://blog.sucuri.net/2017/02/sql-injection-vulnerability-nextgen-gallery-wordpress.html)
	* [Ninja Forms](https://blog.sucuri.net/2016/08/sql-injection-vulnerability-ninja-forms.html)

----

### クロスサイトスクリプティング

* Javascript を含んだ文字列が画面に表示されてしまうバグ。ログイン中の管理者のブラウザをJavascriptで操って不正な操作を行わせたり、Cookie情報を盗んだり
    * [JetPack](https://blog.sucuri.net/2016/05/security-advisory-stored-xss-jetpack-2.html)
    * [bbPress](https://blog.sucuri.net/2016/05/security-advisory-stored-xss-bbpress-2.html)
    * [Akismet](https://blog.sucuri.net/2015/10/security-advisory-stored-xss-in-akismet-wordpress-plugin.html)
    * [WP-Super-Cache](https://blog.sucuri.net/2015/04/security-advisory-persistent-xss-in-wp-super-cache.html)

----

### バックドア

* **やりたい放題(ノ´∀｀)ノ**
* ファイル作成処理の不備により、攻撃者が外部からサーバーにファイルを作成できてしまう
	* [WP Mobile Detector](https://blog.sucuri.net/2016/06/wp-mobile-detector-vulnerability-being-exploited-in-the-wild.html)
	* [Custom Content Type Manager](https://blog.sucuri.net/2016/03/when-wordpress-plugin-goes-bad.html)
* コード実行処理の不備により、攻撃者が外部から任意のコードを実行できてしまう
	* [WordPress Download Manager](https://blog.sucuri.net/2014/12/security-advisory-high-severity-wordpress-download-manager.html)

----

### ローカルファイルインクルージョン

* 攻撃者が `wp-config.php` など重要なサーバー上のファイルの内容を読めてしまう
	* [Slider Revolution Plugin](https://blog.sucuri.net/2014/09/slider-revolution-plugin-critical-vulnerability-being-exploited.html)

----

### 権限昇格

* 実行権限チェックの不備、または未実装により、本来管理者でしかできない操作が、管理者以外、悪い時にはログイン不要で実行できてしまう。プラグインではないが、WP Rest API の脆弱性が記憶に新しい
    * [MainWP-Child WordPress Plugin](https://blog.sucuri.net/2015/03/security-advisory-mainwp-child-wordpress-plugin.html)
    * [Fancybox-For-WordPress](https://blog.sucuri.net/2015/02/analysis-of-the-fancybox-for-wordpress-vulnerability.html)
    * [Pagelines for WordPress](https://blog.sucuri.net/2015/01/security-advisory-vulnerabilities-in-pagelinesplatform-theme-for-wordpress.html)

----

## 対策

----

### そもそも、危険なことをしない

* m9( ﾟДﾟ) <その処理、あなたのプラグインで本当に必要不可欠ですか？
    * SQLの実行が本当に必要？
    * 本当にサーバーにファイルを作成する必要がある？
    * 本当に任意のコードを実行する必要がある？
    * 本当にファイルをインクルードする必要がある？
    * 管理者にしかできてはいけない操作を、わざわざプラグインからできるようにする必要がある？

----

### 危険なことをするときは、危険なことをしてるという自覚を持つ

* 危険なものはちゃんとチェックする
    * `$wpdb->prepare()`
    * `validate_file()`
    * `$_GET`, `$_POST`, `$_REQUEST`
* ユーザーは信頼しない、自分も信頼しない

----

## 危険なプラグインの作り方

* **横着する**、これに尽きる
    * APIで実現可能なのに面倒だからSQLでやっちゃう
    * 必須でもないのに、ちょっとしたログや一時データの保管に、面倒だからファイルを作っちゃう
    * `update_option()` の第１引数を動的にしちゃう
    * `require()` `fwrite()` の対象を動的にしちゃう
    * エスケープせずに画面に表示しちゃう

----

## 危険なプラグインを作っていませんか？

自己チェックに便利なツールを開発しました！

### インストール方法

```
git clone https://github.com/hissy/php-code-scanner.git
composer install
```

### 実行方法

```
bin/console wp-code-scanner /path/to/your-plugin
```

----

### 最後に宣伝：WordPress の解説書を執筆しました

#### エンジニアのためのWordPress開発入門

* WordPress を知らないエンジニアが初めて WordPress に触れたとき、戸惑わないための本
* 絶賛発売中！ → [Amazon](http://amzn.to/2jjunDq)
* 著者：野島 祐慈、菱川 拓郎、杉田 知至、細谷 崇、枢木 くっくる

![エンジニアのためのWordPress開発入門](//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4774187062&Format=_SL250_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=booklogofumbr-22)

----

## もひとつ宣伝

コンクリートファイブジャパン株式会社では、案件増加、事業拡大につき絶賛新規採用募集中！
未経験可

* ディレクター
* PHPエンジニア
* インフラエンジニア

詳細は懇親会で！