我正在閱讀:https : //en.wikipedia.org/wiki/Time-of-check_to_time-of-use
他們顯示這段代碼有問題,我完全理解為什么會這樣:
if (access("file", W_OK) != 0) {
exit(1);
}
// Attacker: symlink("/etc/passwd", "file");
fd = open("file", O_WRONLY);
// Actually writing over /etc/passwd
write(fd, buffer, sizeof(buffer));
但真正的問題是如何防范此類攻擊?
uj5u.com熱心網友回復:
您可以使用該O_NOFOLLOW標志。open如果basename路徑是符號鏈接,它將導致失敗。這將解決所描述的攻擊。
要覆寫目錄路徑中的鏈接,您可以檢查是否frealpath(fd, ...)與您期望的匹配。
另一種防止行程被覆寫的方法/etc/passwd是以非 root 身份運行它,這樣它就沒有權限。或者,您可以使用 chroot - 或者更一般地說,一個容器 - 來防止主機系統/etc/passwd對行程可見。
更普遍的是,檔案系統 TOCTOU 目前在 Linux 上無法解決。您將需要檔案系統或系統呼叫級別的事務支持 - 這是缺乏的。
uj5u.com熱心網友回復:
沒有萬無一失的解決方案。
還要注意賴斯定理。它可能是相關的。
但是您可以采用系統范圍的約定(并記錄下來),即每個訪問給定檔案的程式都使用諸如flock(2) 之類的鎖定設施 。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/317384.html
