ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Linuxコミュのsuidについて

  • mixiチェック
  • このエントリーをはてなブックマークに追加
はじめまして dogteacherと申します。

suidビットの設定についてどなたか詳しいかたご教授お願いいたします。
下記のように、suidビットを設定し、root権限で動くプログラム
があります。

[saraki@kennsyou hoge]$ ll
-rwsr-xr-x 1 root APG 5989 8月 11 16:50 hogehoge

実際、動かすと、

○ユーザ権限で実行
[saraki@kennsyou hoge]$ ./hogehoge
this uid saraki ⇒ rootになってほしい

○root権限で実行
[root@kennsyou hoge]# ./hogehoge
this uid root


ユーザ権限で動いているのですが
最近のLinuxは、suidを無効にしてしまうのでしょうか。ご教授お願いいたします。」

使用Linux CentOS 5.1

コメント(10)

バイナリファイルで試したら、suidは働くけど、
シェルスクリプト・ファイルで試したら、suidは働かない。
Debian 4.0

そういう仕様だっけ?記憶にない。

setu@sun:~/tmp$ cat /etc/shadow
cat: /etc/shadow: 許可がありません
setu@sun:~/tmp$ cp `which cat` .
setu@sun:~/tmp$ sudo chown root cat
setu@sun:~/tmp$ sudo chmod u+s cat
setu@sun:~/tmp$ ls -l
合計 20
-rwsr-xr-x 1 root setu 17156 2008-08-15 13:00 cat
setu@sun:~/tmp$ ./cat /etc/shadow
.....
daemon:*:13714:0:99999:7:::
bin:*:13714:0:99999:7:::
sys:*:13714:0:99999:7:::
sync:*:13714:0:99999:7:::
games:*:13714:0:99999:7:::
man:*:13714:0:99999:7:::
lp:*:13714:0:99999:7:::
.....


setu@sun:~/tmp$ sudo rm cat
http://www.linux.or.jp/JF/JFdocs/Secure-Programs-HOWTO/shell.html
setuid もしくは setgid した安全が求められるコードには、標準的なコマンドシェルのスクリプト言語(csh や sh、bash のような)を採用しないよう、強く推奨します。システムには(Linux のような)、setuid や setgid したシェルスクリプトを完全に無効にしているものもあり、setuid や setgid したシェルスクリプトを作成すると、移植性の問題がさらに発生します。古いシステムでは、そもそもシェルスクリプト言語は安全ではありません。それは競合状態を起こすからです(Section 3.1.3 で論じたように)。その他のシステムにとっても、あまり良いとはいえません。
どのようにしてuidを確認していますか?
実効uidと実uidのどちらで判断していますか?
getuid()を使用していますか? geteuid()を使っていますか?
その疑問を解決するためには、そのhogehogeの正体(バイナリorスクリプト)によるところが大きいと思うのですが、どうも出ている情報からは、シェルスクリプトをsuidして実行した、という状態で発生する事象の様な気が。

そのプログラムの正体は何なのですか?
シェルスクリプトにsetuidしても、効果はないですよ。
> シェルスクリプトにsetuidしても、効果はないですよ。

昔は、シェルスクリプトにsuidしても、効果があったんだけど、
上のリンクのようにセキュリティ上の問題があるので、
Linuxでは
「setuid や setgid したシェルスクリプトを完全に無効にしている」
ということですね。

上のリンクを読んだら判りますが、suidしてあるシェルスクリプトを解して
勝手なコマンドを実行することも出来るそうです。

現在も、suid付きのシェルスクリプトが有効な*nixもあるわけですね。
皆様、ご回答ありがとうございます。
ご回答の中で、hogeプログラムがシェルスクリプトかバイナリか大きく違うと
となっていましたが、

hogeプログラムは、バイナリです。

#chmod 4755 hoge

でsuidがつき、スーパーユーザーで動くと思ったのですが、
実際には、ユーザ権限で動いており、なぜなのかはまっております。



なるほど。

ではソース中でsetuid(0)をしていますか?
そうしないと、getuid()した時に得られるuidもプロセスの実効ユーザIDも、変更できませんね。

こんな風なソースなら、希望の動作をするんじゃないかと思います。

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

int main(int argc, char *argv[])
{
printf("UID(before) = %d\n", getuid()); /* setuid(0)前の実効UID */
system("cat /etc/shadow");

setuid(0);

printf("UID(arter) = %d\n", getuid()); /* setuid(0)後の実効UID */
system("cat /etc/shadow");

return 0;
}
なかさん

ご回答ありがとうございます。原因がわかりましたので、お伝えします。
まず、皆さんに謝らなければならないことがあります。

hogeプログラム内に
system( "./hoge.pl")というようにPerlスクリプトを呼び出しし、

hoge.pl内にgetuid()を入れて動作させておりました。

ここに問題がありました。
setuidしても、system("./hoge.pl")でシェルスクリプトとして認識され、
setuidが無効になることが判明しました。

system関数でなく、exec*関数を利用することで改善しました。

ご意見いただいた皆様にたいへんご迷惑をおかけしました。
申し訳ありません。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Linux 更新情報

Linuxのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。