除了基本的 rwx 權限,Linux 提供三種**附加權限**改變程式執行身份或目錄刪除規則:
passwd 讓一般用戶修改 /etc/shadow)。/tmp)。
| 權限 | 符號模式 | 八進位 | ls 輸出顯示位置 |
|---|---|---|---|
| SUID | u+s | 4 (最高位) | 擁有者執行位:x→s (有執行權) / S (無執行權) |
| SGID | g+s | 2 (次高位) | 群組執行位:x→s / S |
| Sticky | o+t | 1 (最低位) | 其他執行位:x→t / T |
kuqlan.sh 逐步加權限# 初始狀態
-rwxr-xr-x 1 root root 17 kuqlan.sh
# 加 SUID (4755)
chmod 4755 kuqlan.sh
-rwsr-xr-x 1 root root 17 kuqlan.sh # 擁有者 x 變 s
# 加 SGID (2755)
chmod 2755 kuqlan.sh
-rwxr-sr-x 1 root root 17 kuqlan.sh # 群組 x 變 s
# 同時加 SUID+SGID (6755)
chmod 6755 kuqlan.sh
-rwsr-sr-x 1 root root 17 kuqlan.sh # 兩處皆為 s
# 目錄加 Sticky Bit (1777)
chmod 1777 /tmp/shared
drwxrwxrwt 2 root root 4096 /tmp/shared # 其他 x 變 t
# 建立測試程式:顯示實際 UID/EUID
cat > /tmp/showid.c <<'EOF'
#include
#include
int main() { printf("UID=%d EUID=%d\\n", getuid(), geteuid()); return 0; }
EOF
gcc -o /tmp/showid /tmp/showid.c
chown root:root /tmp/showid
chmod 4755 /tmp/showid
# 一般用戶執行
sudo -u nobody /tmp/showid
# 輸出:UID=65534 EUID=0 (EUID 為 root,證明 SUID 生效)
mkdir /tmp/team
chown root:dev /tmp/team
chmod 2775 /tmp/team # SGID on directory
sudo -u alice touch /tmp/team/alice.txt
ls -l /tmp/team/
# -rw-r--r-- 1 alice dev 0 ... alice.txt (群組自動為 dev)
chmod 1777 /tmp/public
sudo -u alice touch /tmp/public/a.txt
sudo -u bob rm /tmp/public/a.txt
# rm: cannot remove '/tmp/public/a.txt': Operation not permitted
# bob 無法刪除 alice 的檔案
find / -perm /6000 -type f。echo > file 清空內容,無法防內容竄改。掌握三種附加權限的設定、驗證與風險,即可在團隊協作、系統工具提權、共享目錄保護等場景精準施策。