污點檢驗
污點檢驗(英語: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" (頁面存檔備份,存於互聯網檔案館).