初期状態
素のLinux Kernel + BusyBoxの環境では、最初のプロセス(PID 1)をUID 1で実行している。これは ps コマンドを使用することで確認することができる。
$ ps a
PID USER TIME COMMAND
1 0 0:01 /bin/sh
2 0 0:00 [kthreadd]
3 0 0:00 [pool_workqueue_]
他にも、id コマンドを使用することで、現在の UID や GID を確認することができる。
$ id
uid=0 gid=0
Kernel 側からしたら UID しか見ていないためユーザー名とかの名前解決は ユーザー空間 側で処理する必要がある。 また、UID 0 は root ユーザーということになっており、UID 0 の場合のみ特権がある状況となっている。
/etc/passwd が無い状態
/etc/passwd が無い状態では以下のような事象が発生する。
動かないこと
login: 認証に/etc/passwdと/etc/shadowが必要なので機能しないsu: UID 0 という実質rootというユーザーの ID は存在するが、rootというユーザー名は定義されていないので、実行されない。addgroup:/etc/groupもなければグループ操作もできない。
動くこと
- シェル自体は普通に使える(UID 0 で全権限があるため)
- ファイルの読み書き、プロセス起動、ネットワーク操作、すべてできる
ls -lするとファイルの所有者が名前ではなく数値で表示される(0や1000など)
改めて述べると、/etc/passwd が無い状態では、UID 0 で全部動いている状態。
セットアップ
まずは、BusyBoxの_installディレクトリ内で rootfs に関する準備を行う。
/etc/passwd に以下のように記述する。
root:x:0:0:root:/root:/bin/sh
totosuki:x:1000:1000::/home/totosuki:/bin/sh
コロンで区切られた各項目の設定は以下の通り。
ユーザー名:パスワード(xの場合は/etc/shadowを参照する):UID:GID:コメント:ホームディレクトリ:ログイン後に実行するプログラム
/etc/group に以下のように記述する。
root:x:0:
totosuki:x:1000:
コロンで区切られた各項目の設定は以下の通り。
グループ名:パスワード(xの場合は/etc/shadowを参照する):GID:メンバーリスト(このグループに追加するユーザー名をカンマ区切りで書く)
第4項目が空なのは、root が /etc/passwd 側で GID 0 をプライマリグループとして指定済みだc/からである。
(プライマリグループというのは、ユーザーが所属するメインのグループのこと)
/etc/shadow に各ユーザーに対するパスワードを設定する。例として root ユーザーのパスワードを設定する。
各パスワードはハッシュ化されている必要があるため、ハッシュ値をホストPC上で設定する。
openssl passwd -6 <PASSWORD>
/etc/shadow に以下のように記述する。
root:PASSWORD:0:0:99999:7:::
コロンで区切られた各項目の設定は以下の通り。
ユーザー名:パスワードハッシュ:最終変更日:最短変更感覚:最大有効期間:警告期間:猶予期間:アカウント有効期限:予約フィールド
また、initramfs の /init を以下のように設定することで、カーネル起動時にログインをすることができる。
setsid cttyhack /bin/login
initramfs で /bin/sh のジョブコントロール https://wiki.mma.club.uec.ac.jp/moba/cttyhack