8

アップデート

とった!私の解決策を参照してください(5番目のコメント)

これが私の問題です:

「jail」と呼ばれる小さなバイナリを作成し、/etc/password でテスト ユーザーのデフォルト シェルにしました。

-- 単純化された -- ソース コードは次のとおりです。

#define HOME "/home/user"
#define SHELL "/bin/bash"
...
if(chdir(HOME) || chroot(HOME)) return -1;
...
char *shellargv[] = { SHELL, "-login", "-rcfile", "/bin/myscript", 0 };
execvp(SHELL, shellargv);

まあ、どんなに頑張っても、テスト ユーザーがログインしたときに、/bin/myscriptが読み込まれないようです。同様に、.bashrcユーザーのホーム ディレクトリにファイルをドロップすると、それも無視されます。

なぜこれらの人をスノッブするのですか?

--

必ずしも関連するわけではありませんが、コメントで指摘されたいくつかの点を明確にするために、いくつかの精度を示します。

  • 「jail」バイナリは実際には suid であるため、chroot() を正常に実行できます。
  • 'ln' を使用して、適切なバイナリを利用できるようにしました - 私の独房はうまく埋められています :)
  • 問題は、ユーザーを chroot することではないようです...何か他のものが見落とされています。
4

5 に答える 5

4

Jason C が言うように、実行されたシェルはインタラクティブではありません。

彼の解決策は、シェルがそれを意味することを受け入れる場合-i(そしてbashがそうする場合)、シェルを強制的にインタラクティブにします:

char *shellargv[] = { SHELL, "-i", "-login", ... };
execvp(SHELL, shellargv);

ARGV[0]ただし、ダッシュで始まる場合、伝統的にシェルはログインシェルとして機能することを追加したいと思います。

char *shellargv[] = {"-"SHELL, "-i", ...};
execvp(SHELL, shellargv);

ただし、通常、Bash は対話的に実行する必要があるかどうかを自動検出します。あなたの場合の失敗は、/dev/*ノードの欠落が原因である可能性があります。

于 2008-10-31T18:56:49.667 に答える
2

私はこれを自分でやりたいと思っていますが、まだ行っていない場合は、jail chroot プロジェクトjailkitをチェックして、jail シェルを作成するためのツールをいくつかドロップしてください。

于 2008-10-31T19:05:18.620 に答える
2

シェルはインタラクティブではありません。引数のリストに -i を追加してみてください。

于 2008-10-31T18:36:24.467 に答える
1

ユーザーがログインし、シェルがこのファイルを読み込もうとするまでに、ファイルはユーザーの UID で実行されています。システム コールはchroot()root のみが使用できます。これよりも賢くする必要があります。

また、ユーザーのホーム ディレクトリに chroot すると、シェルが役に立たなくなります。(そこにたくさんのものが入っていない限り) バイナリにアクセスできないからです。lsたとえば、 のような便利なもの。

于 2008-10-31T19:02:54.770 に答える
1

助けてくれてありがとう、みんな、

私はそれを考え出した:

setuid()/setgid()、 chroot()、setuid()/setgid() を戻し、execve() を使用して適切な環境を渡すのを忘れていました

ああ、bash に引数を渡さないと、~/.bashrcが source されます

「-l」を渡すと、/etc/profileをソースする場合

乾杯!

于 2008-10-31T21:23:21.493 に答える