看「The trouble with symbolic links」這篇的時候看到的專有名詞:「TOCTOU (Time-of-check to time-of-use)」,直翻是「先檢查再使用」,算是一個常見的 security (hole) pattern,因為檢查完後有可能被其他人改變,接著使用的時候就有可能產生安全漏洞。
在資料庫這類環境下,有 isolation (ACID 裡的 I
) 可以確保不會發生這類問題 (需要 REPEATABLE-READ
或是更高的 isolation level)。
但在檔案系統裡面看起來不太順利,2004 年的時候研究出來沒有 portable 的方式可以確保避免 TOCTOU 的問題發生:
In the context of file system TOCTOU race conditions, the fundamental challenge is ensuring that the file system cannot be changed between two system calls. In 2004, an impossibility result was published, showing that there was no portable, deterministic technique for avoiding TOCTOU race conditions.
其中一種 mitigation 是針對 fd 監控:
Since this impossibility result, libraries for tracking file descriptors and ensuring correctness have been proposed by researchers.
然後另外一種方式 (比較治本) 是檔案系統的 API 支援 transaction,但看起來不被主流接受?
An alternative solution proposed in the research community is for UNIX systems to adopt transactions in the file system or the OS kernel. Transactions provide a concurrency control abstraction for the OS, and can be used to prevent TOCTOU races. While no production UNIX kernel has yet adopted transactions, proof-of-concept research prototypes have been developed for Linux, including the Valor file system and the TxOS kernel. Microsoft Windows has added transactions to its NTFS file system, but Microsoft discourages their use, and has indicated that they may be removed in a future version of Windows.
目前看起來的問題是沒有一個讓 Linux community 能接受的 API 設計?