私はApacheウェブサーバーを実行していますが、bashに対するShellsockエクスプロイトの最近のニュースで、自分のウェブサーバーが脆弱かどうか疑問に思いました。そうは思いませんが、間違いないようにしたいです。
私はサーバーでbash CGIを意図的に使用していません。mod_phpとPHP WSGIサイトを使用してPythonを実行しています。しかし、サーバー上で実行されているソフトウェアが、予期せずにCGIを使用していないことを確認したいと思います。
Webサーバーに脆弱性がないことを確認するにはどうすればよいですか?
CGIとは別に、見落とされているsh
の使用は、ほとんどのLinuxシステムでのexec()
呼び出し、またはsystem()
とpopen()
の使用によるものです。これはbash
を意味します。 exec()
ファミリの呼び出しは "/bin/sh -c
"と共によく使用され、シェルのリダイレクト、パイプライン、またはプロセスを呼び出すときの引数の拡張などのさまざまな機能を提供します。
Apacheはこれを正確に使用します(APRを介して、パイプされたログを使用する場合、およびその他の状況で Shell_PATH
の apr/threadproc/unix/proc.c
の使用を参照)。外部出力フィルターとして(ExtFilterDefine
を介して)、および #exec cmd
SSIの処理が含まれます。この動作はほぼ確実に多くのサードパーティモジュールにも当てはまります。
Webサーバーを保護するための最善の手順:
sh
インスタンスが浮遊していないことを確認し、sh
手動で設定したchrootsでも)chrootでApacheを実行し、必要な場合にのみ、最小限の/bin/sh
を使用します。
|
」から「||
」への切り替えが piped logs で行われるため、/bin/sh
が不要になります(Apache 2.2.12以降で使用可能) )|$
"を使用していないことを確認してください。これは、httpd.2.2の動作に戻ります。 2.4は|
と||
をサポートしますが、どちらも/bin/sh
を使用しませんデフォルトのCGIスクリプトが無効になっていることを確認します。最上位のOptions
から再確認します(例:<Directory />
でExecCGI
まだ使用していない場合は mod_security
を検討してください。 Red Hatは KB記事12123 で環境をログに記録してクリーンアップするために使用できるいくつかのルールを提供しています。
スクリプトで "#!/bin/sh -p
"を使用することも検討できます。これにより、bashが privileged mode に強制されます。これにより、環境から関数をインポートできなくなります(他の変更)。これは、システムに脆弱なCGIスクリプトがあり、パッチやコンパイラがない場合に役立ちます。これは Debianおよび派生システムでは機能しない可能性があります なので、慎重に確認してください。
(また、/bin/sh
がbash
の場合は、無条件に他のものに置き換えないでください。起動スクリプトに影響する可能性があります。)
CGI(bashスクリプト以外)を介して、またはApacheモジュール(PythonおよびPHPの場合))で実行されるアプリケーションコードも再生できますこの一部です。攻撃者が変数を十分に制御できる場合(URIエンコードが難しい場合があります)、アプリケーションがプロセスの呼び出し時に/bin/sh
を使用し、それらの変数が保持されている場合は、問題があるかもしれません。
最新のLinuxシステムを実行しているが、Apache用のchrootまたはその他のコンテナーをセットアップしていない場合、Apacheの起動時にunshare
およびバインドマウントを使用して/bin/sh
を置き換えることができるはずです。 (またはその他のサービス)。
unshare -m -- sh -c "mount --bind /usr/local/bin/bash /bin/sh &&
/usr/local/Apache2/bin/apachectl start"
これの利点は
bash
を選択的に置換できるため、物を壊すリスクが少ないsh
を呼び出す試みをログに記録して監査できます(これで簡単にできないことは、疑わしい変数を検査してログに記録するラッパーとしてbashスクリプトを書くことです。もちろん、他の何かを使用する必要があります...)
Linuxでauditd
を実行している場合、/bin/sh
にいくつかのルールを追加してリロードすることで、audit.rules
の使用を簡単に監視できます。
-w /bin/sh -p x
-w /bin/bash -p x
(sh
はbash
へのシンボリックリンクなので、両方が必要です)
Red Hatは、LD_PRELOAD
で使用できるランタイムの「修正」という別のアプローチを公開しています。これは アドバイザリ にあります。これは、必要に応じて、疑わしい変数をログに記録するように調整することもできます。これまでのところパッチの完全性について現在疑問があることを考えると、このソリューションはおそらく少なくともApacheの短期的な修正としては良いでしょう。
より一般的なApache強化のヒントについては、こちらもご覧ください。 Apache Server Hardening
Redhatアドバイザリによると:
mod_php、mod_Perl、およびmod_pythonは環境変数を使用しないため、影響を受けないと考えられます。
それについてもっと読む: https://access.redhat.com/node/120022
Bashを保護し、ボックスを固定しました。ほとんどのディストリビューションにはパッチが用意されていますが、まだパッチが適用されていないディストリビューションを実行する場合は、自分でコンパイルしてパッチを適用できます。
不明な場合は、cgiモジュールSudo a2dismod mod_cgi
を無効にするか、httpd.conf
のLoadModule
を削除してください。 shaomoon がmod_phpに言及したように、mod_Perlとmod_pythonは影響を受けません。
とにかく、単純にパッチをインストールする必要があります。 bashが脆弱でない場合、Apacheもこの攻撃から保護されます。