程序應該在操作結束后立即丟棄執行諸如 chroot() 一類的操作所需要的提高了的權限。
當程序調用一個受權限控制的函數時,比如 chroot(),它必須先獲取 root 權限。當受權限控制的操作完成后,程序應該馬上丟棄 root 權限并且返回調用它的用戶權限等級。
示例: 以下的代碼調用了 chroot() 函數,將應用程序限制在 APP_HOME 下的 file system 的子集中,以防止攻擊者通過程序訪問位于其他地方的未經授權的文件。然后,代碼打開一個由用戶指定的文件并處理文件的內容。
...
chroot(APP_HOME);
chdir("/");
FILE* data = fopen(argv[1], "r+");
...
setuid() 進行調用,意味著應用程序仍在使用沒有必要的 root 權限進行操作。任何由攻擊者對應用程序實施的成功盜取都會導致發生權限擴大的攻擊,因為所有的惡意操作都將以超級用戶的權限執行。如果應用程序把權限等級降低到一個非 root用戶,則會顯著減少很多潛在的破壞。
[1] Standards Mapping - Security Technical Implementation Guide Version 3 - (STIG 3) APP3500 CAT II
[2] Standards Mapping - Security Technical Implementation Guide Version 3.4 - (STIG 3.4) APP3500 CAT II
[3] Standards Mapping - Common Weakness Enumeration - (CWE) CWE ID 272
[4] Standards Mapping - Web Application Security Consortium 24 + 2 - (WASC 24 + 2) Insufficient Authorization
[5] Standards Mapping - Payment Card Industry Data Security Standard Version 1.2 - (PCI 1.2) Requirement 7.1.1
[6] Standards Mapping - Payment Card Industry Data Security Standard Version 2.0 - (PCI 2.0) Requirement 7.1.1
[7] A. Chuvakin Using Chroot Securely