テクニカルノート
passwd、shadowファイルを直接編集しても良いのですが、Linuxではuseradd、usermod、userdelコマンド
がありますので、このコマンドを利用して、ユーザー情報を書き換えます。apitialは
ブラウザに入力されたデータをこれらのコマンドに渡しています。
しかし、これらのコマンドはrootで起動しなければなりません。一方、CGIは普通nobodyユーザーで起動されます。
ですから、何らかの方法で、CGIで起動したプログラムを、rootユーザーが起動したように見せかけなければなりません。
apitialはsetuid(0)として、nobodyなどで起動したプロセスをrootにしています。
例えば、次のprogram.cは任意のユーザーが実行してもrootが実行したと同じ結果が得られます。
program.cソースファイル
-----------------------
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
main()
{
setuid(0); /* 0はroot */
system("cat /etc/shadow"); /* system関数の引数は何でも良い */
}
-----------------------
コンパイル
gcc -o program program.c
chown root.root program <---オーナー、グループをrootにしておくことが大切
chmod 4755 program <---s属性を付けておく
-----------------------
ファイル
-rwsr-xr-x 1 root root 11687 Dec 24 20:46 program* <---s属性が重要
-rw-r--r-- 1 program users 235 Dec 24 20:46 program.c
s属性は起動したプロセスをオーナーにすることができます。この場合、オーナーをrootにしていますので、
プロセスをrootにする事ができます。