-->

2011-05-09

PHP SCREWのインストール

http://www.pm9.com/newpm9/itbiz/php/phpscrew/
http://slashdot.jp/~bero/journal/508118
http://xcache.lighttpd.net/changeset/548
http://phpspot.org/blog/archives/2006/05/php_40.html

# ダウンロード後、解凍してphpizeを実行する。
$ tar xvzf php_screw-1.5.tar.gz
$ cd ./php_screw-1.5/
$ lv README.jp
$ phpize

# makeが失敗する。
$ ./configure
$ make

# LT_INITのエラーが出る場合、修正する。
# もしくはlibtool-1.5の環境でphpizeを実行した結果をディレクトリごとコピーする。
$ libtool --version|head -n1
libtool (GNU libtool) 2.2.10
$ rm -i aclocal.m4
$ autoreconf -ifv

# makeが失敗する。
$ ./configure
$ make

# php5.3の場合、修正する。
$ cp -i php_screw.c php_screw.c.org
$ emacs php_screw.c
$ diff php_screw.c.org php_screw.c
124c124,128
<       CG(extended_info) = 1;
---
> #ifdef ZEND_COMPILE_EXTENDED_INFO
>         CG(compiler_options) |= ZEND_COMPILE_EXTENDED_INFO;
> #else
>         CG(extended_info) = 1;
> #endif
133c137,141
<       CG(extended_info) = 1;
---
> #ifdef ZEND_COMPILE_EXTENDED_INFO
>         CG(compiler_options) |= ZEND_COMPILE_EXTENDED_INFO;
> #else
>         CG(extended_info) = 1;
> #endif

# 暗号化SEEDキーを修正する。
$ cp -i my_screw.h my_screw.h.org
$ emacs my_screw.h-make.php
$ cat my_screw.h-make.php
short pm9screw_mycryptkey[] = {
<?php
for ($i = 1; $i < pow(2, 16); $i++)
{
    if ($i != 1)
    {
        print ", ";
    }
    print mt_rand(-32768, 32767);
}
print "\n";
?>
};
$ php my_screw.h-make.php > my_screw.h
$ diff my_screw.h.org my_screw.h|lv

# 再度実行する。
$ make clean
$ ./configure
$ make
$ cd ./tools/
$ make

# インストールする。
$ cd ../modules/
$ strip php_screw.so
$ sudo cp -i php_screw.so /usr/lib64/php5.3/lib/extensions/no-debug-non-zts-20090626/php_screw.so
$ sudo chmod 0644 /usr/lib64/php5.3/lib/extensions/no-debug-non-zts-20090626/php_screw.so

# phpの設定ファイルを修正する。
$ sudo su -
$ echo extension=php_screw.so >> /xxx/php.ini
$ exit

# 再起動後、成功の場合、phpinfo()にphp_screwの項目が出現する。
$ sudo /etc/init.d/apache2 restart

# コマンドをインストールする。
$ cd ../tools/
$ make
$ strip screw
$ sudo cp -i screw /xxx/bin/

# テストする。
$ cd /var/www/xxx/
$ emacs sample.php
$ cat sample.php
<?php
print date("Y-m-d H:i:s");
$ screw sample.php
$ rm -i sample.php.screw

# http://example.com/sample.phpにアクセス出来ればOK

バイナリデータの解析に詳しい場合php_screw.soから暗号化SEEDキーを取り出すのは簡単らしいです。
暗号化したxxx.phpの中身を閲覧出来る状況であればphp_screw.soの中身も閲覧できるかもしれないので、問題ないかどうか検討するべきでしょう。
例えば/var/www/html/以下のxxx.phpファイルを通常ファイルに設定してapacheを再起動してしまったという場合、http経由でphpの中身をダウンロードできますが、php_screw.soが見れない場合が多いので力技で解凍することになり、暗号化SEEDキーを長めにしておけば元のファイルを復元するまでに、ある程度の時間を稼げるでしょう。
apacheのプロセスの寿命を寿命無し、プロセス数固定にして、apache起動後にphp_screw.soを消すとどうでしょう?
apache起動サーバーが別にあるとして、php_screw.so送信=>apache起動コマンド送信=>送ったphp_screw.so削除、でどうでしょう?
メモリのデータを解析できる場合、意味が無いのかもしれません。
selinuxやtomoyoなどのソフトを併用するとどうでしょう?
php_screw.soと利用するすべてのxxx.phpをセットであらかじめ作成しておいてapache再起動時には入れ替えるというのはどうでしょう?
その面倒さに見合った効果が得られるでしょうか?
攻撃者がapacheの動いているOSにログイン出来ている時点で、きっとあまり意味が無いでしょうか?
有料の暗号化ソフトもあるので、それも検討するべきでしょう。

xcacheのList PHPではHitsは増えるので毎回復号化している訳ではない?

0 件のコメント: