リソースが制限されたシステムで実行されていて、実行中のアプリケーションで10個以上のファイルが開いていないことを確認したいとします。みんな。
たとえば、を使用してこれを実行しようとすると、setrlimit
次のようになります。
if (fork() == 0) {
struct rlimit l = { 10, 10 };
setrlimit(RLIMIT_NOFILE, &l);
execl(EVIL_PROGRAM, args);
}
これにより、EVIL_PROGRAM
10個のオープンファイル記述子制限が継承されます。しかし、悪意のある/誤ってコード化されたアプリケーションがXサブプロセス(すべて10個のファイルが開いている)を生成するのを止める方法は? (これは実際のシナリオです)。
limits.conf
私は、開かれたファイルの数に合理的な制限を設定するために子プロセスが作成されるのを完全に防止したくありません(これはグローバルで管理する必要があります)。
この目的のためにcgroupを使用する方法への参照を見つけましたが、この機能を使用するにはrootユーザーである必要があると思いました。
答え1
特にsetrlimit
以下は、ナビゲートしたいいくつかの便利なコマンドオプションですman
。
RLIMIT_NOFILE
プロセスが開くことができるファイル記述子の最大数より1大きい値を指定してください。
RLIMIT_NPROC
呼び出しプロセスの実際のユーザーIDに対して生成できるプロセスの最大数(より正確にはLinuxではスレッド)。この制限に直面したとき
RLIMIT_SIGPENDING
呼び出しプロセスの実際のユーザーIDを待機できる信号数の制限を指定します。この制限を確認するために、標準信号とリアルタイム信号の両方が計算されます。
設定できる他の本当に素晴らしい制限があるようです。したがって、フローを制御するための別のツールを示すあなたの質問に触れてくれてありがとう。
一般的なUNIX/Linux
あなたが探しているアプリケーション制限ツールの一般的な用語は「Sandbox
for UNIX」だと思います。請負業者そして乗客Raspberry Pi B + v2やデュアルコアネットブックなどの限られたシステムでDocker
見てKVM
、それを使ってみたLinuxのための確実な選択です。Firejail
ほとんどのサンドボックス操作には仮想化可能システムとカーネルが必要です。最新のCyonagenMod ROMで動作しているのを見たAndroidのようなシステムでSelinux
chrootアプリを使用したい場合は、少し残念です。ただし、Ubuntuを実行した一部のシステムではエラーが発生します。Apparmor
新しくインストールされたプログラムを実行しようとすると動作が停止します。家に電話する継続的な接続を維持します。特定のプログラムまたはプログラムグループが実行できるタスク、表示または通信できるタスク、使用可能なCPUおよびGPUリソースの量を制御するための多くのオプションがあると言えば十分です。
動作させることができれば(ARMhfバイナリが動作するように開発者と協力し続けているため、少し確信が持てない)、開発者のホームページでホストされているガイドでFirejailを扱うことができるので、ユースケースに最適なのはFirejailになります。デュアルゲームデバイスの要件に合わせて。上記の他のものよりもメモリ使用量が少なく(私が見たものから)、プロセスがアクセスできるファイルと永続性が許可されるかどうかを高度に設定できます。繰り返し可能でカスタマイズ可能で、必要に応じて最終的に削除できる作業環境が提供されるため、テストに適しています。
完全な仮想化をサポートしていないシステムの場合、 selinux は、読み取りおよび書き込み権限を維持するために、既存のuser
/権限設定のよりgroup
厳しいルールを定義するためによく使用されます。この単語を検索してLinux name space permissions
みるとたくさん出てきました。隠された人々は移動方法を制限することができますが、最大のもの穴これらすべてのオプションと同様に、うまく設定されたroot
chroot刑務所でも刑務所やサンドボックス内でroot権限を取得する方法がある場合は、刑務所のプロセスが実行中のユーザーIDにエスカレーションする方法があります。
デフォルトでは、プロセスは複数の階層を通過する必要があります。つまり、Webサーバーの場合は、制限されたファイアウォールルールセット、ルールを動的に追加し、ファイアウォール設定を変更するログリーダー(カスタムアクションとスクリプトを含むFail2ban)、chrootを設定します。ディレクトリ構造では、Webサーバーに必要な依存関係のみを含めて刑務所に配置し、ソケットバインディングのルートレベルの権限を要求しないように1024より高いポートにバインドし、仮想サンドボックス(おそらくFirejail)にラップします。 、ホストはその刑務所tripwire
などの侵入検知アクションを実行します。honeyd
これはすべて、.php
パブリックサーバーで変更してはいけない類似のコードを受信するようにするためのものです。接触不良これは無視され、バックアップIPが再割り当てされ、違反者は将来のアクセスが禁止されます。
サンプルコードはネットワーキングに多くのことをするようには見えませんが、他のスクリプトや関数から呼び出される可能性が高く、明らかにサブプロセスを呼び出すので、どうすればよいかを調べる必要があります。入力を削除し、すべてのステップでエラーをキャッチし(理由を確認するにはKill Chromeリンクを見つけて)、特権ユーザーが削除されていない入力を読み取ったり妨げたりすることを防ぐ(shell-shock
FirefoxにブラウザIDを追加する方法)を参照してください)。理由を確認してください))、呼び出しまたは戻り出力がネットワークに関連している場合、プロセスがバインドされているポートは許可されていないポートに配置する必要があります(Webアプリケーションの場合は、転送にiptables /ファイアウォールを使用します)。考慮すべきシステムサービスロックオプションはたくさんありますが、コードの破壊の可能性をテストするオプションもたくさんあるようです。Metasploit
これはdrone.io
、以前に実行したいかもしれない2つの非常によく知られた侵入テストとコードテストオプションです。誰かがあなたのためにそれをします。調査をしてください。