7

killSPRRHEL ボックスで次のプロセスを強制終了するために呼び出される小さな C ユーティリティを作成しました。アイデアは、この Linux ボックスにログインするすべての人がこのユーティリティを使用して、後述のプロセスを強制終了できるようにすることです (これは機能しません - 以下で説明します)。

cadmn@rhel /tmp > ps -eaf | grep -v grep | grep " SPR "  
cadmn    5822  5821 99 17:19 ?        00:33:13 SPR 4 cadmn  
cadmn   10466 10465 99 17:25 ?        00:26:34 SPR 4 cadmn  
cadmn   13431 13430 99 17:32 ?        00:19:55 SPR 4 cadmn  
cadmn   17320 17319 99 17:39 ?        00:13:04 SPR 4 cadmn  
cadmn   20589 20588 99 16:50 ?        01:01:30 SPR 4 cadmn  
cadmn   22084 22083 99 17:45 ?        00:06:34 SPR 4 cadmn  
cadmn@rhel /tmp >  

このユーティリティは (これらのプロセスを実行する) ユーザーによって所有されcadmn、setuid フラグが設定されています (以下を参照)。

cadmn@rhel /tmp > ls -l killSPR  
-rwsr-xr-x 1 cadmn cusers 9925 Dec 17 17:51 killSPR  
cadmn@rhel /tmp > 

C コードを以下に示します。

/*  
 * Program Name: killSPR.c  
 * Description: A simple program that kills all SPR processes that  
 * run as user cadmn  
 */  
#include <stdio.h>  
int main()  
{  
    char *input;  
    printf("Before you proceed, find out under which ID I'm running. Hit enter when you are done...");  
    fgets(input, 2, stdin);  

    const char *killCmd = "kill -9 $(ps -eaf | grep -v grep | grep \" SPR \" | awk '{print $2}')";  
    system(killCmd);  
    return 0;  
} 

pmnとは異なるユーザー ( )cadmnが、このユーティリティを使用して上記のプロセスを強制終了しようとしましたが、失敗しました (以下を参照)。

pmn@rhel /tmp > ./killSPR  
Before you proceed, find out under which ID I'm running. Hit enter when you are done...  
sh: line 0: kill: (5822) - Operation not permitted  
sh: line 0: kill: (10466) - Operation not permitted  
sh: line 0: kill: (13431) - Operation not permitted  
sh: line 0: kill: (17320) - Operation not permitted  
sh: line 0: kill: (20589) - Operation not permitted  
sh: line 0: kill: (22084) - Operation not permitted  
pmn@rhel /tmp >  

ユーザーが上記の Enter キーを押すのを待っている間、プロセスkillSPRが検査され、cadmnkillSPR がプロセスを終了できないにもかかわらず、ユーザーとして実行されていることがわかります (以下を参照)。

cadmn@rhel /tmp > ps -eaf | grep -v grep | grep killSPR  
cadmn   24851 22918  0 17:51 pts/36   00:00:00 ./killSPR  
cadmn@rhel /tmp >

ところで、メインパーティションには何もありませnosuid

pmn@rhel /tmp > mount | grep nosuid
pmn@rhel /tmp >

実行可能ファイルの setuid フラグは、望ましい効果を持っていないようです。ここで何が欠けていますか?setuid の仕組みを誤解していませんか?

4

3 に答える 3

2

あなたのsystem呼び出しをexec呼び出しに置き換える必要があります。systemsuid プログラムから実行すると、権限が失われると言うマニュアル。

理由は次のとおりですman system

set-user-ID または set-group-ID 権限を持つプログラムから system() を使用しないでください。一部の環境変数の奇妙な値がシステムの整合性を破壊するために使用される可能性があるためです。代わりに exec(3) ファミリの関数を使用してください。ただし、execlp(3) または execvp(3) は使用しないでください。実際、system() は、/bin/sh が bash バージョン 2 であるシステムでは、set-user-ID または set-group-ID 権限を持つプログラムからは正しく機能しません。これは、bash 2 が起動時に権限を失うためです。(Debian は、sh として呼び出されたときにこれを行わない、変更された bash を使用します。)

を呼び出す場合を除き、シェル構文systemexec使用できるようにする必要があります。/bin/sh -c <shell command>これがsystem実際に行っていることです。

于 2013-12-17T08:21:39.927 に答える
2

シェル スクリプトをデーモンにする方法については、次のリンクを参照してください。

シェルスクリプトデーモンを作成する最良の方法は?

「サービスへのLinuxスクリプト」をグーグルで検索することもできます。この件に関するリンクがいくつか見つかりました。

アイデアは、代わりに「サービス」タイプのスクリプトを呼び出すことにより、ユーザーが別のユーザーとして実行されるプログラムを制御できるようにするいくつかの基本的なものを含むシェルスクリプトをラップすることです。たとえば、/usr/var/myservice/SPRkiller任意のユーザーからそのように呼び出すことができる「サービス」スクリプトとしてまとめることができます:service SPRkiller startSPRkiller実行し、適切なサービスを強制終了します (SPR の「プログラム」が root 以外のユーザーとして実行されていると仮定します)。 .

これは、あなたが達成しようとしているように聞こえます。プログラム (シェル スクリプト/C プログラムなど) を実行すると、何があっても同じユーザー制限が適用されます (エスカレーション バグ/ハッキングを除く)。

余談ですが、Linux/Unix のユーザー権限と、特定のコマンドや機能が何をするかについて、少し誤解しているようです。ユーザーが特定のアクション (別のユーザーのプロセスなど) を実行する権限を持っていない場合、ユーザーが別のユーザーのスペースに対する権限を持っていないため、必要なプログラム(またはそれ自体) をkill呼び出しても効果はありません。 ' スーパー ユーザー権限なし。したがって、シェル スクリプトまたは C プログラムで同じコマンドを呼び出しても、同じ結果が得られます。setuidkillkillsystem

http://www.linux.com/learn/は優れたリソースです。ファイルのアクセス許可に関するリンクは次のとおりです。

それが役立つことを願っています

于 2013-12-17T09:25:34.833 に答える