我有一個全域可寫的 (s|g)uid 檔案:
ls -lh suid_bin.sh
-rwsr-srwx 1 root root 168 mai 23 16:46 suid_bin.sh
使用非 root 使用者帳號登入。我使用 vi (或其他編輯器)修改“suid_bin.sh”。儲存新內容後,(s|g)uid 位元被取消設定:
ls -lh suid_bin.sh
-rwxr-xrwx 1 root root 168 mai 23 16:46 suid_bin.sh
為什麼?有沒有辦法在修改後保留 (s|g)uid 位元?
答案1
如果有人意外地在 setuid 文件上設定群組或世界可寫位,Unix 權限允許寫入文件,但不允許陌生人變更此類文件的擁有者和群組 ID。
因此,修改後核心會從檔案中刪除 setuid/setgid 位,以確保沒有惡意程式碼寫入檔案。
root 使用者當然可以恢復 setuid 位,但是普通使用者如果由於某人的錯誤而獲得了對特權可執行檔案的寫入存取權限,則將無法利用它。
而且,了解該區域的核心部分,我不確定您是否可以在不編輯內核原始程式碼並重新編譯的情況下停用它。
請注意,Linux 中的setuid 腳本在執行後不會獲得setuid 狀態,因為實際上內核啟動腳本解釋器,沒有setuid 狀態,並將腳本的完整路徑作為最後解析的參數,然後解釋器將腳本作為普通文件讀取。但這在其他 Unix 系統上可能會有所不同。