污點檢驗
污點檢驗(英語:Taint checking),是某些程序語言所擁有的特性,例如Perl[1]和Ruby[2],可用於增加安全性和避免惡意用戶在主機上執行命令。污點會檢驗突出的安全風險,一般來說這些風險與那些使用SQL注入或緩衝區溢出攻擊的網站相關。
污點檢驗的原理是任何變量(例如在網頁表單區域的一個變量集)能夠被外部用戶修改,從而造成了潛在的安全危險。如果該變量被一個表達式賦值給第二個變量,那麼第二變量也是可疑的。污點檢驗工具在變量間傳遞運行,直到外部輸入潛在地影響到所有的變量。如果這些變量中任何一個變量被用於執行危險命令(例如對SQL數據庫或主機操作系統的直接命令),污點檢檢驗工具將警告該程序正在使用有潛在危險的污點變量。程序員可以通過重新設計程序來避免因危險的輸入而導致的安全問題。
污點檢驗能夠被視為一個無界面全面驗證的保守近似或者是更一般化的安全信息流[3]概念。因為系統中的信息流不能通過檢驗一個簡單的執行追蹤而被驗證[4],污點分析的結果將必然地反映關於該系統信息流特徵的近似信息[5]。
例子
以下危險的Perl代碼在沒有檢驗$name變量的值情況下,啟動了一個大型SQL注入漏洞:
#!/usr/bin/perl
my $name = $cgi->param("name"); # Get the name from the browser
...
$dbh->TaintIn = 1;
$dbh->execute("SELECT * FROM users WHERE name = '$name';"); # Execute a SQL query
如果開啟污點檢驗,那麼Perl將會拒絕運行命令,顯示錯誤信息並退出,因為一個污點變量正在SQL查詢中被使用。沒有污點檢驗,用戶能輸入foo'; DROP TABLE users --,因此運行命令將刪除全部的數據庫表。更安全的方法是將$name的污點值編碼到一個SQL字符串字面值和使用SQL查詢的結果,這保證了沒有嵌入在$name的危險命令會被執行。另一方法是使用預處理語句去淨化所有變量輸入。
需要注意的是Perl DBI需要設定數據庫句柄的TaintIn屬性,才允許污點模式去檢驗該SQL字符串。
歷史
Perl從至少1989年當T switch[6]加入到Perl 3的時候開始支持污點化[7]。
在1996年,網景同時在網景通訊服務器的服務器端JavaScript和客戶端的網景瀏覽器3[8]上實現數據污點化。然而,自從客戶端支持被當作實驗性功能,該功能被禁用(要求用戶手動激活),而且需要頁面作者修改腳本才能使用。而其他瀏覽器從未實現這個功能,通訊服務器也沒有大體完成,微軟後來成了新的互聯網信息提供商。
參見
- ^ perlsec - Perl security (頁面存檔備份,存於網際網路檔案館).
- ^ Programming Ruby --- The Pragmatic Programmer's Guide (頁面存檔備份,存於網際網路檔案館).
- ^ A. Sabelfeld and A. C. Myers, "Language-based information-flow security", IEEE Journal on Selected Areas in Communications, 2003.
- ^ J. Ligatti, L. Bauer, D. Walker.
- ^ T. Terauchi and A. Aiken.
- ^ Contact details. "perlsec" (頁面存檔備份,存於網際網路檔案館). perldoc.perl.org.
- ^ Perl in a Nutshell, Second Edition, Patwardhan, Siever and Spainhour, ISBN 0-596-00241-6
- ^ "JavaScript: The Definitive Guide" (頁面存檔備份,存於網際網路檔案館).