ソフトウェアを収集する必要がある大きなプロジェクトがあると想像してください。 また、あなたは部下が必要なソフトウェアを収集するアセンブリファームをかき立てたいと思っています。 そして、これらはすべてLinuxで行われ、誰もが最小限のコストで「クリーン」な環境を編成する必要があります。 どうやってやるの?
何人かの人々がホールで手を挙げ、「chroot!」と叫んだ。 あなたはそれがシンプルで高速であり、誰もがホストマシンの完全なリソースを手に入れることに同意しました。 皆が拍手を送り、決定が下されました。
そして、このソリューションの統合から1週間後、「X」の従業員が解雇された後、あなたは目を覚まします-そして、サーバーにはきれいなハードディスクがあります。 悪役は開発者の仕事を破壊し、仕事は立ち上がった。
「保護された」「ロックされた」特性にあるのに、なぜ彼はすべてを削除できたのですか?
全体のポイントは、悪役がプログラムのわなにかけられる可能性があるということです。 または、起動時にルート権限があっただけです。
遠くから始めましょう。 Linuxでは、実際のファイルシステムに加えて、仮想ファイルシステムがあります。 そのようなシステムの1つが/ proc /-カーネル情報ファイルシステムです。 たとえば、コマンド
$ zcat /proc/config.gz
ロードされたカーネルが行っていた設定ファイルの内容を表示します。 このファイルシステムには大量の情報があり、Linuxの下で何かを収集する場合、ほとんど常に必要です。 それぞれ-それは私たちの兵士が座っていたchrootにマウントされました。 また、chrootは独自のカーネルをロードすることを意味しないため、次のようなコマンドを使用してホストシステムからマウントされました。
mount -t proc proc /mnt/chrootme/proc/
そして、重要なことに、ホストシステムに関する情報が含まれています!
/ procには、/ proc / $ pid / cwdという形式のフォルダーがあり、このプロセスで現在のフォルダーの内容を確認できます(現在のプロセスには、ショートカット/ proc / self / pidもあります)。 initを含む実行中のすべてのプロセスにこのようなフォルダーがあります。
そして、どのフォルダがinitに対して現在のものですか? そうね! また、initはホストのinitであるため、「立ち上がる」タスクは次のようになります。
# chroot /proc/1/cwd/
そして彼の手をこすります:出来上がり、私たちは外にいます! さらなる行動の自由は、悪用された脆弱性の想像力によってのみ制限されます。
この状況に陥らないようにするには?
- 見知らぬ人にchroot環境を与えないでください!
- 仮想化を使用してアセンブリファームを構築します。 遅いが、安全です(そしてsvm / vtxテクノロジーで-遅くはありません)。
- 信頼している人にも、root(またはそれを取得するわずかな機会)をchrootに与えないでください。