How can I get setuid shell scripts to work?

Unix 系OSではプログラムを実行するユーザ(effective user)とプログラムを起動するユーザ(real user)を別にすることができる。
プログラムの set-uid ビットをセットすることで、起動するユーザーにかかわらず、プログラムのオーナー権限で実行されるようになる。
シェルからは chmod +s でビットを立てられ、パーミッションの実行権限はsで表示される。

$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 42856 2011-02-15 07:11 /usr/bin/passwd

real user/effective user はそれぞれ getuid(2)/geteuid(2) で取得できる

青木 峰郎(著)「ふつうのLinuxプログラミング」§14.3クレデンシャルの操作 参照

Demonstration of setuid

例は wikipedia の Setuid から

[bobie]$ cat printid.c
#include
#include
#include
int main(void) {
    printf(
        "         UID           GID  \n"
        "Real      %d  Real      %d  \n"
        "Effective %d  Effective %d  \n",
             getuid (),     getgid (),
             geteuid(),     getegid()
    );
    return 0;       /* always good to return something */
}
[bobie]$ cc printid.c -o printid
[bobie]$ ./printid
        UID           GID
Real      1008  Real      1008
Effective 1008  Effective 1008

[bobie]$ sudo chown root printid     # to change the owner you need to sudo
Password:
[bobie]$ sudo chmod ug+s printid     # SetUID and SetGID flags
[bobie]$ sudo chmod o-rx printid     # Don't let Others read or execute it
[bobie]$ ls -l
-rwsr-s--- 1 root staff 6944 2011-10-06 10:22 printid
[bobie]$ ./printid
        UID              GID
Real      1008  Real      1008
Effective 0   Effective  20

Script Program & setuid

上記プログラムをスクリプト言語に移植して動かしてみると、effective userreal user と同じという結果になった。
古いバグが残っているのかなぁとソースコードを読んだが問題なさそう。
グーグル先生にきくと、スクリプト言語で setuid を許すと、インタープリターに渡すプログラムを変えることで任意のプログラムを effective user 権限で実行できてしまうため、Linux では setuid ビットを無視していることが原因と教えてくれた。

Allow setuid on shell scripts @ StackExchange (Oct 8 ’10 at 20:18 の投稿)

とはいえ、Solaris では動いたりPerl は独自のセキュアな仕組みで setuid をサポートしているなど、例外はある。

回避する方法もなくはないが、StackExchange では次のように締めくくられている

  • Setuid shebang is insecure but usually ignored.
  • If you run a program with privileges (either through sudo or setuid), write native code or perl.

References

Advertisements
Tagged with: ,
Posted in linux

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Archives
%d bloggers like this: