2

「set-user root」プログラムから root コマンドを開始したいので、次の C サンプル プログラムを作成しました。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

void main(int argc, char *argv[])
{
    if(argc > 2) {
        setuid(0);
        printf("setuid(0) executed\n");
    } else
        printf("setuid(0) NOT executed\n");

    system(argv[1]);
}

Debian 6 (64 ビット) でテストしたところ、引数として渡すと、次の場合でも"/bin/sh"常に が得られることに気付きました。ROOT SHELLargc == 2

$ gcc foo.c -o foo  
$ su  
Password: *****  
# chown root:root ./foo  
# chmod 4755 ./foo  
# ls -l foo  
-rwsr-xr-x 1 root root 6887 11 dic 17.44 foo  
# exit  
exit  
$ ./foo /bin/sh  
setuid(0) NOT executed  
# exit                 <<<<< ROOT SHELL  
$ ./foo /bin/sh 12345  
setuid(0) executed  
# exit                 <<<<< ROOT SHELL  

Slackware 14 (32 ビット) では、動作が異なります。

$ gcc foo.c -o foo  
$ su   
Password: *****  
bash-4.2# chown root:root ./foo  
bash-4.2# chmod 4755 ./foo  
bash-4.2# ls -l foo  
-rwsr-xr-x 1 root root 6292 dic 11 17:53 foo  
bash-4.2# exit  
exit  
$ foo /bin/sh  
setuid(0) NOT executed  
sh-4.2$ exit             <<<<< USER SHELL  
exit  
$ foo /bin/sh 12345  
setuid(0) executed  
sh-4.2# exit             <<<<< ROOT SHELL  
exit    

引数として「/usr/bin/dolphin」を指定すると、別の動作もあります。
Debian では動作しません:

$ ./foo /usr/bin/dolphin  
setuid(0) NOT executed  
<unknown program name>(28884)/: KUniqueApplication: Cannot find the D-Bus session server:  "Unable to autolaunch when setuid"  
<unknown program name>(28883)/: KUniqueApplication: Pipe closed unexpectedly.    

Slackware では の場合のみ動作するargc == 2ため、root で dolphin を起動できません。
なんで?

4

1 に答える 1