20

root権限なしでchroot監獄にいることをどのように検出できますか? 標準の BSD または Linux システムを想定しています。私が思いついた最善の方法は、「/」の inode 値を見て、それがかなり低いかどうかを検討することでしたが、より正確な検出方法が必要です。

[edit 20080916 142430 EST]/boot や /dev などを複製して投獄されたユーザーをだますことは難しくないため、ファイルシステムを調べるだけでは十分ではありません。

[edit 20080916 142950 EST]Linux システムの場合、/proc 内の予期しない値をチェックすることは合理的ですが、そもそも /proc をサポートしていないシステムについてはどうでしょうか?

4

8 に答える 8

14

/ の i ノードは、ファイル システムのルート ディレクトリの場合は常に 2 になりますが、完全なファイル システム内で chroot される可能性があります。chroot だけの場合 (他の仮想化ではない場合)、mount を実行して、マウントされたファイルシステムを表示されているものと比較できます。すべてのマウント ポイントに inode 2 があることを確認します。

于 2008-09-17T23:36:39.733 に答える
7

chroot を使用していない場合、/ の inode は常に 2 になります。

stat -c %i /

また

ls -id /

興味深いですが、chroot ディレクトリのパスを見つけてみましょう。stat/ がどのデバイスにあるかを尋ねます:

stat -c %04D /

最初のバイトはデバイスのメジャーで、残りのバイトはマイナーです。たとえば、0802 はメジャー 8、マイナー 1 を意味します。/dev をチェックインすると、このデバイスが /dev/sda2 であることがわかります。root の場合は、対応するデバイスを chroot で直接作成できます。

mknode /tmp/root_dev b 8 1

それでは、chroot に関連付けられた inode を見つけてみましょう。debugfs では、inode 番号を使用してファイルの内容を一覧表示できます。たとえば、923960 がls -id /返されます。

sudo debugfs /tmp/root_dev -R 'ls <923960>'
 923960  (12) .       915821  (32) ..     5636100  (12) var   
5636319  (12) lib    5636322  (12) usr    5636345  (12) tmp   
5636346  (12) sys    5636347  (12) sbin   5636348  (12) run   
5636349  (12) root   5636350  (12) proc   5636351  (12) mnt   
5636352  (12) home   5636353  (12) dev    5636354  (12) boot   
5636355  (12) bin    5636356  (12) etc    5638152  (16) selinux   
5769366  (12) srv    5769367  (12) opt    5769375  (3832) media 

興味深い情報は、..エントリの inode: 915821 です。その内容を尋ねることができます。

sudo debugfs /tmp/root_dev -R 'ls <915821>'
915821  (12) .              2  (12) ..    923960  (20) debian-jail   
923961  (4052) other-jail  

と呼ばれるディレクトリdebian-jailにはinode 923960があります。したがって、私のchrootディレクトリの最後のコンポーネントはdebian-jail. 親ディレクトリ (inode 2) を見てみましょう:

sudo debugfs /tmp/root_dev -R 'ls <2>'
      2  (12) .           2  (12) ..          11  (20) lost+found    1046529  (12) home   
 130817  (12) etc    784897  (16) media     3603  (20) initrd.img   
 261633  (12) var    654081  (12) usr     392449  (12) sys            392450  (12) lib   
 784898  (12) root   915715  (12) sbin   1046530  (12) tmp   
1046531  (12) bin    784899  (12) dev     392451  (12) mnt   
 915716  (12) run        12  (12) proc   1046532  (12) boot               13  (16) lib64   
 784945  (12) srv    915821  (12) opt       3604  (3796) vmlinuz 

呼び出されたディレクトリoptには inode 915821 があり、inode 2 はファイルシステムのルートです。したがって、私の chroot ディレクトリは/opt/debian-jail. 確かに、/dev/sda1 別のファイルシステムにマウントされている可能性があります。それを確認する必要があります(lsofを使用するか、情報を直接選択します/proc)。

于 2014-06-16T14:23:24.387 に答える
6

ルート権限のある Linux では、init プロセスのルート ディレクトリがルート ディレクトリであるかどうかをテストします。/proc/1/rootは常に へのシンボリック リンクですが、これ/をたどると「マスター」ルート ディレクトリに移動します (init プロセスが chroot されていないと仮定しますが、それはほとんど行われていません)。がマウントされていない場合/procは、chroot にいる可能性があります。

[ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]
# With ash/bash/ksh/zsh
! [ -x /proc/1/root/. ] || [ /proc/1/root/. -ef / ]

前回のブート以降にアップグレードされた場合、または chroot がメインのルート ファイルシステム上にあり、そこにハード リンクされている場合、chroot の外では異なる可能性があるため、これは見る/proc/1/exeよりも正確です。initinit

root パーミッションを持っていない場合は、/proc/1/mountinfoおよび( Linux カーネルのドキュメントに/proc/$$/mountinfo簡単に記載されています) を参照してください。このファイルは誰でも読み取り可能であり、ファイルシステムのプロセス ビューの各マウント ポイントに関する多くの情報が含まれています。そのファイル内のパスは、リーダー プロセスに影響を与える chroot によって制限されます (存在する場合)。プロセスの読み取りがグローバル ルートとは異なるファイル システムに chroot されている場合 (pid 1 のルートがグローバル ルートであると仮定)、 のエントリは に表示されません。プロセスの読み取りがグローバル ルート ファイルシステムのディレクトリに chroot されている場合、のエントリが に表示されますが、マウント ID が異なります。ちなみにルートフィールド(filesystems/proc.txt/proc/1/mountinfo//proc/1/mountinfo/proc/1/mountinfo//proc/1/mountinfo$4) は、chroot がマスター ファイルシステムのどこにあるかを示します。繰り返しますが、これは Linux に固有のものです。

[ "$(awk '$5=="/" {print $1}' </proc/1/mountinfo)" != "$(awk '$5=="/" {print $1}' </proc/$$/mountinfo)" ]
于 2011-11-09T19:13:57.267 に答える
4

そのようなものを防ぐことが全体のポイントです。chroot で実行することになっているコードの場合は、起動時にフラグを設定します。ハッキングしている場合は、ハックします。既知の場所でいくつかの一般的なものを確認し、/etc 内のファイルを数え、/dev 内の何かを数えます。

于 2008-09-16T18:14:46.193 に答える
4

BSD システム (uname -a で確認) では、proc が常に存在する必要があります。/proc/1/exe の dev/inode ペア (そのパスで stat を使用します。テキストによるシンボリック リンクではなく、基になるフックによるシンボリック リンクをたどります) が /sbin/init と一致するかどうかを確認します。

i ノード #2 のルートをチェックすることも良い方法です。

他のほとんどのシステムでは、root ユーザーは fchdir root-breaking トリックを試みることで、はるかに迅速に見つけることができます。それがどこにでも行くと、あなたはchroot刑務所にいます.

于 2008-10-18T18:25:29.027 に答える
2

なぜあなたが chroot にいるのか、それを偽装する努力がなされているかどうかによると思います。

/proc を確認すると、これらのファイルは自動的に生成されたシステム情報ファイルです。カーネルはこれらを root ファイルシステムに取り込みますが、chroot ファイルシステムには存在しない可能性があります。

ルート ファイルシステムの /proc が chroot の /proc にバインドされている場合、その情報と chroot 環境の間にいくつかの不一致がある可能性があります。たとえば、/proc/mounts を確認します。

同様に、/sys を確認します。

于 2008-09-16T18:22:21.417 に答える
0

schroot で chroot に入った場合は、$debian_chroot の値を確認できます。

于 2013-07-25T07:22:59.750 に答える