Apacheをroot権限で動かす裏ワザ

Apacheはroot権限で起動したあと、セキュリティ確保のため、子プロセスを一般ユーザー(nobodyとか)で生成する。今日は、この子プロセスも、rootで起動しちゃおうという話。

CGIは通常、子プロセスの一般ユーザー権限で実行される。そのため、より高い権限が必要なファイル操作を行おうとすると、パーミッションエラーになったりする。この手の問題には、suexecで対処するのがセオリーだけど、「そもそも実行ユーザーをrootにしちゃえば、何でもできるんじゃないの?」というコペルニクス的転回があって、試してみたら、できちゃった。おおっ!

以下、その方法。


Apacheの子プロセスの起動ユーザーとグループは、それぞれhttpd.confのUserディレクティブとGroupディレクティブで設定できる。試しにここをrootに書き換えてみる。

#User nobody
#Group nobody
User root
Group root

んで、configtestしたら、怒られた。

# /usr/local/apache-2.0/bin/apachectl configtest
Syntax error on line 277 of /usr/local/apache-2.0/conf/httpd.conf:
Error: Apache has not been designed to serve pages while trunning as root.  
There are known race conditions that will allow any local user to read any file
on the system. If you still desire to serve pages as root then add
 -DBIG_SECURITY_HOLE to the CFLAGS env variable and then rebuild the server. 
It is strongly suggested that you instead modify the User directive in your 
httpd.conf file to list a non-root user.

「Apacheをrootで動作させようとは何事か、そんな設定は許せない!」とプンスカ怒っていらっしゃる。でも、「-DBIG_SECURITY_HOLE オプション付きでビルドすれば、許しちゃうかも」と優しい一面も見せる、ツンデレなApacheさま。

言われたとおり、CFAGS に -DBIG_SECURITY_HOLE を加えて再ビルド。

# make clean
# env CFLAGS="-DBIG_SECURITY_HOLE" OPTIM="-O2" \
./configure --prefix=/usr/local/apache-2.0 --enable-so --enable-shared \
--enable-ssl=shared --with-mpm=worker --enable-deflate --enable-headers
# make
# make install

そして、もう一度、configtestしてみると…

# /usr/local/apache-2.0/bin/apachectl configtest
Syntax OK

ということで、rootでの起動ができるようになった。わーい。

試しに次のCGIをブラウザから実行してみる。

#!/usr/bin/perl

print "Content-type: text/html\n\n"; print $>;
exit;

結果は、

0

ちゃんとrootユーザで実行してくれてるみたい。これで、ブラウザ経由でサーバの大事なアレとか貴重なアレとかをイジり放題。あの夢の「rm -rf /」だってできちゃう!(しません)

以上、お疲れさまでした。

ちなみに、この方法は、セキュリティ的に非常に危険です。外部公開サーバでは絶対に行わないようにしましょう。あと、よい子のみんなも真似しちゃダメね。

このエントリーのトラックバックURL
http://www.deftrash.com/admin/mt4/mt-tb.cgi/446