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 件のコメント:
コメントを投稿