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

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
  • RT @__apf__: How to write a research paper: a guide for software engineers & practitioners. docs.google.com/presentation/d… /cc @inwyrd 6 days ago
  • RT @HayatoChiba: 昔、自然と対話しながら数学に打ち込んだら何かを悟れるのではと思いたち、専門書1つだけ持ってパワースポットで名高い奈良の山奥に1週間籠ったことがある。しかし泊まった民宿にドカベンが全巻揃っていたため、水島新司と対話しただけで1週間過ぎた。 それ… 3 weeks ago
  • RT @googlecloud: Ever wonder what underwater fiber optic internet cables look like? Look no further than this deep dive w/ @NatAndLo: https… 3 weeks ago
  • @ijin UTC+01:00 な時間帯で生活しています、、、 6 months ago
  • RT @mattcutts: Google's world-class Site Reliability Engineering team wrote a new book: amazon.com/Site-Reliabili… It's about managing produc… 9 months ago
%d bloggers like this: