PHP 配置選項 open_basedir 存在一個設計缺陷,使該選項容易發生文件訪問 race condition,從而可能使攻擊者繞過 file system 上的 access control 檢查。
如果啟用 open_basedir 配置選項,該選項會試圖阻止 PHP 程序對 php.ini 文件中所指定的目錄結構以外的文件進行操作。盡管 open_basedir 選項從總體上有利于保證安全性,但它的實施效果卻受到 race condition 的不利影響,這種狀況可能會允許攻擊者在某些情況下繞過該選項所定義的限制條件 [2]。在 PHP 執行訪問權限檢查與打開文件的兩個時刻之間,存在一種 TOCTOU(檢查時間,使用時間)race condition。與其他語言中 file system 的 race condition 一樣,這一漏洞會導致攻擊者能夠將指向一個通過 access control 檢查的文件的 symlink 替換為另一個本不能通過測試的文件,從而獲得對受保護文件的訪問權限。
這種攻擊針對的漏洞大小取決于執行訪問檢查與打開文件這兩個時刻之間的時間間隙。即使連續執行調用,現今的操作系統也無法確保在進程讓出 CPU 之前將執行的代碼數量。攻擊者掌握了多種擴大該時間間隙的技術,以便更加容易地發起攻擊,但即使是一段很短的間隙,該攻擊企圖也可以不斷地重復,直到成功為止。
[1] Standards Mapping - Security Technical Implementation Guide Version 3 - (STIG 3) APP3630.1 CAT II
[2] Standards Mapping - Security Technical Implementation Guide Version 3.4 - (STIG 3.4) APP3630.1 CAT II
[3] Standards Mapping - Common Weakness Enumeration - (CWE) CWE ID 362, CWE ID 367
[4] Standards Mapping - SANS Top 25 2009 - (SANS 2009) Insecure Interaction - CWE ID 362
[5] Standards Mapping - SANS Top 25 2010 - (SANS 2010) Insecure Interaction - CWE ID 362
[6] Stefan Esser open_basedir Confusion
[7] M. Achour et al. PHP Manual
[8] Stefan Esser PHP open_basedir Race Condition Vulnerability
[9] Artur Maj Securing PHP
[10] Emmanuel Dreyfus Securing Systems with Chroot