Darwinはハッシュバンの実行中に通訳からsetuidを削除します。

Darwinはハッシュバンの実行中に通訳からsetuidを削除します。

これはハッシュ爆発を実行する方法の完全な問題ではありません。スクリプト

この場合、そのu+s権限がある(必ずしもそうではない)ハッシュ爆発スクリプトがあります。代わりに、インタプリタにはあり、u+sスクリプトはそのインタプリタを指定します#!/path/to/interpreter

Mac OSでは、この場合は指定されたインタプリタそれ自体暗黙の setuid が付与されていません。私自身直接実行するのと同様に、許可ビットです。実際の実効ユーザーIDは、ハッシュバンクスクリプトを実行しているユーザーのIDです。

解決策はありますか?通訳者の再実行を含めませんか?

ジョブを再実行します。

Kazs-Mac-Pro:txr kaz$ uname -a
Darwin Kazs-Mac-Pro.local 11.0.0 Darwin カーネルバージョン 11.0.0: 2011 年 4 月 8 日金曜日 20:29:42 PDT ルート: xnu-1699.22.36~1/RELEASE_X86_64 x86_64
Kazs-Mac-Pro:txr kaz$ 猫 setuid.tl
#!./txr --reexec
(入力行 `gids:@(getegid)@(getgid)`)
(入力行 `uids:@(geteuid)@(getuid)`)
(入力行 `groups:@(getgroups)`)
(seteuid 0);;できない場合は投げる
Kazs-Mac-Pro:txr kaz$ ls -l txr setuid.tl
-rwsr-xr-x 1ルートチャクラ163 5月5日、15:18 setuid.tl
-rwsr-xr-x 1 ルートチャクラ 1334500 5月5日 15:17 txr
Kazs-Mac-Pro:txr kaz$ ./setuid.tl
行数: 20 20
UID: 0 501
グループ:20 402 401 12 33 61 79 80 81 98 100 204

することは--reexec呼び出しプログラムexecvpのパス名と--reexec、 poof, setuid 権限が戻ってきただけです。しかし、醜いです。

そうでない場合、--rexec動作は次のようになります。

Kazs-Mac-Pro:txr kaz$ ./setuid.tl
行数: 20 20
ユーザーID:501 501
グループ:20 402 401 12 33 61 79 80 81 98 100 204
./txr: 未処理のシステムエラータイプ例外:
./txr: seteuid 失敗: 1/"操作は許可されません"
./txr: ./setuid.tl:4 フォーム評価中 (seteuid 0)

u+sシステムの観点からは、スクリプトの内容は関係ありません。通訳者はスクリプトの所有権と組み合わせてスクリプト setuid を実行するか、権限を永久に削除して実行するかを決定します。もちろん、タスクのインタプリタ私はこれらのタスクを実行し、実行が要求されたすべてのコードに盲目的に高い権限を与えることを知らず、setuidを使用したくありません。

答え1

セキュリティ上の理由から、ほとんどのUnixバリアントはスクリプトでsetuidを無効にします。詳細については、次を参照してください。シェルスクリプトでsetuid設定を許可する

以前のバージョンのOS Xにはsetuidスクリプトを許可する設定がありましたがsysctl kernl.sugid_scripts=110.9 では文書は表示されません。。まだ存在するかどうかはわかりませんが、文書化されておらず、まだ存在する場合は安全かどうかわかりません。

setuidスクリプトを実行する一般的な方法はを使用することですsudo。これは、setuidスクリプトのいくつかのセキュリティ問題、特に環境クリーンアップを解決することができます。 sudoルールを追加します(visudosudo config編集を実行)。

ALL ALL = (target_user : target_group) /path/to/script

これにより、誰でも(すべてのパラメータを使用して)実行できますsudo -u target_user -g target_group /path/to/script …。最初の項目をメンバーにのみ許可ALLに置き換えます。%original_grouporigininal_group

これを透明にするには、sudo必要に応じて呼び出されるラッパースクリプトを作成します。

#!/bin/sh
exec sudo -u target_user -g target_group /path/to/script "$@"

関連情報