テクニカルノート

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にする事ができます。