6

システムコールとセキュリティが密接に関連していないことは知っていますが、私がそれを必要としているプロジェクトがあります。私は小さなコードチェッカーを書いています。テストケースに対してテストするには、ユーザーが送信したコードをコンパイルして実行する必要があります。

基本的に、コードをサンドボックスで実行して、一時ディレクトリ外のファイルにアクセスしたり、作成したファイルに外部からアクセスしたりできないようにします。shell.php最近、ユーザーが次の内容のファイルを作成できるエクスプロイトに遭遇しました。

<?php
  echo system($_GET['x']);
?>

これにより、攻撃者はリモートシェルを利用でき、ファイルの所有者はApacheであるため、攻撃者は基本的に/var/www、mysqlパスワードが他の構成情報とともに保存されている場所全体を移動できます。

私はSQLインジェクションのような脅威を認識しており、DBを含む操作の前にユーザー入力をサニタイズしましたが、サンドボックスをどのように設定できるかわかりません。システムコールを無効にし(現在、ユーザーが送信したコードで「system」という単語を検索していて、見つかった場所でそれらのスニペットを実行しない)、ユーザーがファイルへのアクセスを制限するために使用できる手法は何ですか?送信されたコードが作成します。

現在のところ、私のコードチェッカーはCでのみ機能し、セキュリティで保護した後、C ++、Java、Ruby、Pythonなどの他の言語のサポートを追加する予定です。また、私が遭遇したこの問題についてもっと知りたいので、Webセキュリティについてもっと学ぶことができる場所へのポインタもいただければ幸いです。

私の開発マシンはMacOSLionを実行しており、デプロイメントマシンはLinuxサーバーであるため、クロスプラットフォームのソリューションが最も高く評価されますが、Linuxマシンのみを処理するソリューションも同様です。

4

5 に答える 5

5

おそらくやりたいことは、スクリプトを実行しているユーザーのために、ファイルシステム上のランダムな一時ディレクトリにchrootを設定することです。ここに、chrootの設定に関するいくつかの読み物と、知っておくべきいくつかのセキュリティがあります。

また、suExecやMPM-iTKforApacheなどのセキュリティモジュールをインストールすることをお勧めします。次に、ApacheのVirtualHost内で(仮想ホストを実行していない場合は実行してください!)、この特定のVirtualHostの要求を処理するために特定のUserIDを割り当てます。これにより、リクエストがApacheのデフォルトユーザーから分離され、セキュリティが少し追加されます。

    AssignUserID nonprivilegeduser nonprivilegeduser 

次に、次のPHPオプションを設定して、PHPを少し強化します。これにより、ユーザーは特定のディレクトリ外のファイルにアクセスできなくなり、このディレクトリ内でファイルtmp_dirを移動できます。session_save_pathこれにより、ユーザーはベースディレクトリの外部にアクセスできなくなります。

    php_admin_value open_basedir /var/www/
    php_admin_value upload_tmp_dir /var/www/tmp
    php_admin_value session.save_path /var/www/tmp

PHPの行とともに、特定の関数クラスへのアクセスを防止し、 PHPのセキュリティに関する記述を読んでください。

また、スクリプトがroot権限にアクセスしようとするのを防ぐために、とsudoへのアクセスを無効にして、そのユーザーを調べてもらいます。su詳細については、こちらをご覧ください。

全体として、あなたはそれが素晴らしく明確だと言いました。ユーザーが意志を持っている場合、ユーザーがシステムにアクセスするのを完全に防ぐ方法はありません。秘訣は、それをできるだけ難しくし、できるだけ混乱させることです。

于 2012-08-28T14:51:00.773 に答える
1

クロスプラットフォームベースでこれを機能させる方法はありません。サンドボックスは本質的にシステム固有のものです。

Mac OS Xには、サンドボックス機能があります。文書化は不十分ですが、非常に効果的です(Google Chromeはこれに大きく依存しています)。一部の進取的な魂はそれの一部を文書化しています。ただし、Mac OS Xでのみ利用できるため、おそらく除外されます。

Linuxでは、オプションはかなり開発されていません。一部のカーネルは、seccompメカニズムをサポートして、プロセスが小さな「安全な」システムコールのセットを除いて使用できないようにします。ただし、すべてがそうであるわけではありません。さらに、その「安全な」サブセットには、たとえばseccompで実行するように特別に記述されていないコードで必要になる可能性のある呼び出しが含まれてmmapおらsbrkず、許可されていないため、メモリを割り当てることができません。ただし、 seccomp-nurseなどのヘルパーツールを使用すると、どこかに到達する可能性があります。

于 2012-08-21T17:28:33.207 に答える
1

これが私が提案することです。

1.でシステムクラスと関数を無効にphp.iniします

disable_functions="system,curl_init,fopen..."
disable_classes="DirectoryIterator,SplFileObject..."

2.重要なデータが保存されていない読み取り専用環境で実行します。誰かがあなたのサーバーに侵入した場合に備えて、あなたは彼らに何にもアクセスさせたくありません。これを行う良い方法は、Amazon AWS EC2を購入し、投獄されたユーザーを使用してサーバーとPHPを実行することです。

3.人々にそれを壊すように頼みなさい。あなたが気づいていない欠陥や抜け穴を見つけることができる唯一の方法は、それらを見つけることです。必要に応じて、「本番」環境と同じタイプのアプリケーションを複製する「テスト」アプリケーションを備えた一時サーバーを入手します。

ここにいくつかの役立つリソースがあります。

于 2012-08-27T22:37:08.553 に答える
1

あなたが探しているのは強制アクセス制御だと思います。Linuxでは、SeLinux経由で利用できます。これを使用すると、誰がどのコマンドを実行できるかを制限できます。あなたの場合、phpユーザー(Apache)を制限して、gccなどの限られたコマンドのみを実行することができます。AppArmorも調べてください

また、runkitphp仮想環境を調べてください

于 2012-08-28T00:41:14.547 に答える
0

非常に軽量なVMであるコンテナー(Docker)で、ユーザーが送信したコードを実行してみることができます。それらは1秒未満で始まります。

于 2015-08-23T08:02:11.153 に答える