問題タブ [setuid]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
permissions - OpenBSD で SUID ビットを設定すると、有効で保存された UID が実行可能ファイルの所有者に設定されないのはなぜですか?
Parallels for Mac のゲスト OS として OpenBSD 5.3 の新規インストールを使用しています。
驚いたことに、root が所有し、SUID ビットが設定されたバイナリ ファイルは、SUID が設定されていないかのように UID で実行されます。つまり、UID 1000 がそのようなプログラムを実行すると、プログラムは次の状態で開始されます。
状態ではありません:
予想通り。
これはなぜですか?
問題を見つけた方法に関する詳細は次のとおりです。
さまざまな Unix システムでの setuid の動作を評価するための対話型 C プログラム ( setuid_min.binとしてコンパイル) を作成しました。このプログラムは UID 1000 のホーム ディレクトリのサブディレクトリにあり、sudoコマンドを使用して所有権と SUID を変更します。次に、プログラムが実行され、uidを入力して、プロセスの実際の、有効な、保存された UID を報告します。
上記のsome_pidはsetuid_min.binプロセスの pid であることに注意してください。プログラムは、次のシェル コマンドの出力を報告することによって、実際の UID、有効な UID、および保存された UID を報告します。
my_pidはgetpid()によって報告される pidです。これが当てはまる理由についての私の唯一の推測は、OpenBSD には、setuid_min.binが存在するディレクトリの所有権/アクセス権を使用している、または権限のないユーザーがsudoでファイルのパーミッションを変更します。
c - Windows サービス: 各ユーザーの %APPDATA% 変数を取得します
私のアプリケーションはサービスとして実行され、ある時点で、システム上の既存のすべてのユーザー アカウントをループし (これは で実行できると考えましたNetUserEnum()
)、見つかった各ユーザーの %APPDATA% パスの下にある特定のファイルにアクセスする必要があります。問題は、そのユーザー固有のパス (%APPDATA%) を取得する方法がわからないことです。
アプリケーションはサービス (SYSTEM) として実行されるため、環境またはSHGetFolderPath()
. 最初は利用できると思ってLogonUser()
いましたが、ユーザー、管理者、またはシステムでアプリケーションテストコードを実行しても、常にエラー1326がスローされます。(テスト プラットフォームとしての winxp)。ユーザーのログイン ハンドルを取得する方法があれば、SHGetFolderPath()
またはExpandEnvironmentStringsForUser()
API で使用できますが、正しいですか?
したがって、これまで LogonUser() で試したコードは次のとおりです(はい、ユーザー名は正しいです):
おそらくパスワードが必要ですが、顧客のマシンでそれを知る方法はありません。クイック検索で見つけたすべての API は、LogonUser() の HANDLE に依存しているようですが、これは明らかに使用できません...
トリッキーでないアイデアやトリッキーなアイデアは大歓迎です!
c - setuid() C 関数は euid 値も変更しますか?
このサンプル suid プログラム
'noemi' (id=1001) の所有者:
ユーザー 'sarah' (id=1000) から開始した場合、euid が 1000 に変更されるのは
なぜですか? p.bin は uid のみを変更します (p.bin が 'sarah' によって開始されたとき、uid は 1000 だったので、これは効果がないはずです):
Debian 6 64 ビットを使用しています。
理解を助けてください。ありがとうございました
linux - 実行可能ファイルの setuid が機能しないようです
killSPR
RHEL ボックスで次のプロセスを強制終了するために呼び出される小さな C ユーティリティを作成しました。アイデアは、この Linux ボックスにログインするすべての人がこのユーティリティを使用して、後述のプロセスを強制終了できるようにすることです (これは機能しません - 以下で説明します)。
このユーティリティは (これらのプロセスを実行する) ユーザーによって所有されcadmn
、setuid フラグが設定されています (以下を参照)。
C コードを以下に示します。
pmn
とは異なるユーザー ( )cadmn
が、このユーティリティを使用して上記のプロセスを強制終了しようとしましたが、失敗しました (以下を参照)。
ユーザーが上記の Enter キーを押すのを待っている間、プロセスkillSPR
が検査され、cadmn
killSPR がプロセスを終了できないにもかかわらず、ユーザーとして実行されていることがわかります (以下を参照)。
ところで、メインパーティションには何もありませnosuid
ん
実行可能ファイルの setuid フラグは、望ましい効果を持っていないようです。ここで何が欠けていますか?setuid の仕組みを誤解していませんか?
c - この C ラッパーのセグメンテーション違反
私はCを初めて使用します。これは、別のユーザーとしてスクリプトを実行するために作成された単純なラッパー(rootsetuidwrapper.c)です。実行したいスクリプトは、ルートとしてパス (/home/neehar) にある ubuntu-server-secure.sh です。私のオペレーティング システムは Ubuntu 12.04.03 LTS です。誰かがこれらのエラーを修正するのを手伝ってくれますか? gcc でコンパイルし、コンパイルしたコードを rootsuidwrap として呼び出しましたgcc -o rootsuidwrap rootsetuidwrapper.c
。./rootsuidwrap ubuntu-server-secure.sh [0] を実行してターミナルで実行したとき。それは正しい呼び方ですか?コードの使用部分は、このようにすることを示しています。次のように出てきますSegmentation Fault (core dumped)
。コードのこのセクションと関係がありますか: *user=cuserid(NULL);
. 不正なポインターである可能性があります。もしそうなら、修正はどのようなもので、どのように見えるでしょうか?
誰かがこれらのエラーを修正して、動作するコードを教えてくれたらうれしいです。また、私が何を間違えたのか知りたいです。
助けていただければ幸いです。
c - 2 番目の getpwuid 呼び出しは、古い値を上書きするようです
以下は、ファイルに setuid フラグが設定されている場合に、プロセスの実際の ID と有効な ID を出力する (出力するはずの) 小さな C プログラムです。このプログラムではgetpwuid
、2 回目に呼び出すと (L.No 38)、realUserName
L.No 24 で取得した変数の値を上書きする傾向があります。この動作は説明できません。これは予想される動作で、その理由は何ですか? これを Linux ボックス (RHEL 2.6.18-371.1.2.el5) で試しています。
出力: