如今,在病毒肆虐、黑客無處不在的網路環境裡,軟體的安全性已成為乙個備受關注的話題。傳統的軟體安全性關注的主要在於許可權與角色的管理,如訪問控制,或是資料的機密性與完整性,如加密解密。但是乙個軟體系統在應用了這些安全措施之後就能確保其萬無一失了嗎?答案似乎並不那麼簡單,其中乙個重要(甚至可以說致命)的問題在於軟體系統中的漏洞。常常在乙個看似牢不可破的系統中,僅僅是因為存在乙個小小的漏洞,導致整個安全體系被黑客輕易地攻破,整個系統的控制權徹底喪失。
所謂漏洞,通常是指軟體中存在的一些bug,但這種bug又不同於普通軟體測試中的bug。普通軟體測試中的bug指的是功能性或邏輯性的錯誤,如對話方塊彈出出錯、系統執行某功能失敗等。這些bug影響的只是使用者的使用體驗,並不對系統的安全構成威脅。而軟體的安全漏洞指的是某些別有用心的使用者非正常的使用軟體,讓軟體執行一些自己精心設計的惡意**,或解析畸形檔案,當軟體中存在安全漏洞的時候,程式的正常執行流程被改變,從而達到獲取系統的控制權或竊取機密資料的目的。
資料庫系統是在作業系統平台之上的最重要的系統軟體,資料庫系統的安全可以說是十分重要的。曾經有句話這樣說:如果網路遍地是金錢,那麼金錢就在資料庫伺服器中。隨著無紙化業務環境的不斷擴大,人們在資料庫中儲存著越來越多的敏感資訊:銀行賬戶、醫療記錄、**檔案、軍事機密等等,資料庫系統就成為越來越有價值的攻擊目標,因此確保資料庫系統的安全也越來越重要。
作為一種大型的系統軟體,資料庫系統中也存在著各種各樣的安全漏洞,其中危害性較大的有緩衝區溢位、堆溢位和sql注入等。
1.緩衝區溢位
緩衝區溢位是一種很常見也很古老的安全漏洞。早在上個世紀80年代,緩衝區溢位就已經為人所知,但時至今日,大量的緩衝區溢位漏洞仍被發現。最著名的morris蠕蟲就是利用unix系統上fingerd程式的緩衝區溢位漏洞。在oracle 9i發布之初,oarcle公司曾宣稱他的資料庫是「 unbreakable 」的,但不到幾個月的時間,就暴出oracle 9i中oracle.exe、xdb等程式存在多個緩衝區溢位漏洞。
在c語言中最常見的緩衝區就是字元陣列,而操縱字元陣列的函式有gets、strcpy、sprintf等。這些函式在執行字串拷貝的過程中沒有對字串進行長度檢查,這樣就很容易發生超長的字串溢位緩衝區的情況。當初這樣設計是出於效率的考慮,但現在看來,這些函式的使用已成為c語言軟體脆弱的乙個重要因素。如果程式設計師沒有良好的程式設計習慣,時刻注意函式呼叫過程中是否拷貝了超過緩衝區長度的字串,那麼緩衝區溢位就不可避免。對於乙個有緩衝區溢位漏洞的程式,當普通使用者輸入超長字串時,通常只會使該程式崩潰。例如對於下面一小段**:
/* vulprog */
#include
int main(int argc , char * argv)
如果使用者執行 ./vulprog aaaaaaaaaaaaaaaa,在linux上會出現段錯誤,因為使用者輸入了超長的字串,除了填滿了緩衝區,還覆蓋了其他一些程式正常退出所需要的資料。為了研究這個問題,就需要了解linux系統中程序的記憶體空間。
從圖中可以看出棧結構是從高位址增長到低位址,而進行函式呼叫時系統所作的「序幕」工作就是將函式的返回位址和ebp壓棧,再將esp賦給ebp使其成為區域性基指標,最後esp減去一定的值為區域性變數留出空間。這樣當程式將過長的字串拷貝到緩衝區時就會依次覆蓋ebp和返回位址。當用aaaa覆蓋返回位址,函式退棧時系統就將0x41414141(a的16進製制ascii碼)賦給eip去執行,由於是乙個非法的記憶體位址,故程式崩潰。但如果用乙個實際存在的位址覆蓋返回位址,那麼程式就轉而去執行該位址處的指令,通常黑客會在這個位址植入所謂的shellcode,由shellcode產生乙個shell,如果被攻擊程式設定了suid位,那麼產生的shell就是root shell,黑客也就獲得了系統的最高控制權,這一過程就是基本的緩衝區溢位攻擊。
覆蓋函式的返回位址是比較常見的攻擊方式,但緩衝區溢位攻擊的手法是靈活多樣的,往往在程式設計中的乙個小小紕漏就可能導致被攻擊,下面簡單介紹一下幾種較為高階的攻擊方式。
(1)通過覆蓋函式指標進行攻擊:
/* vulprog */
int main(int argc , char * argv)
上面這個程式在執行拷貝時沒有檢查邊界,這樣使用者資料就有可能覆蓋函式指標fp,如果用shllcode的位址去覆蓋fp,那麼函式指標呼叫時就會去執行shellcode。
這種覆蓋函式指標的方式是一種較直接的覆蓋方式(因為函式指標就在緩衝區上面),還有一種間接的覆蓋方式,就是當函式指標不直接在緩衝區上面時,通過覆蓋另外乙個指標來覆蓋函式指標,再將shellcode的位址填充函式指標。
/* vulprog */
int main(int argc ,char * argv)
雖然這個程式沒有函式指標,但在執行第二個拷貝時,可以將任意的資料拷貝到任意的位址中(這個位址由第乙個拷貝指定),這時就可以選擇用 .dtors區的位址覆蓋指標pbuf,在執行第二個拷貝時將shellcode的位址拷貝至.dtors區,那麼在函式退出時shellcode就會被執行。
其實針對這個程式,攻擊者不僅可以覆蓋.dtors區的位址,還可以覆蓋got(全域性偏移表)中exit的位址,或__deregister_frame_info的位址。
從上面的這些例子可以看出,如果程式設計中不注意緩衝區邊界的檢查,就很可能導致被溢位攻擊。
由於緩衝區溢位攻擊的頻繁爆發,迫使很多作業系統廠商推出了不可執行堆疊、更新c庫函式等措施。這些措施一定程度上遏制了普通的緩衝區溢位,但道高一尺,魔高一丈,黑客們很快就將注意力轉移到新的溢位攻擊上,如堆溢位。從最初的溢位重要變數(如函式指標、檔案指標)到dlmalloc中malloc-free型別的堆溢位到ptmalloc中的堆溢位,層出不窮。其實不管這些手法有多高明,最終的根源只有乙個:利用程式中未對緩衝區邊界進行有效檢查。
2.sql注入》
資料庫系統除了可能受到緩衝區溢位的攻擊外,近幾年又出現了sql注入的攻擊方式,這種攻擊方式被稱為 「 sysdba的惡夢」。sql注入可能導致資料庫系統中的普通使用者竊取機密資料(如獲得sysdba密碼)、進行許可權提公升(如獲得sysdba特權)等,而這種攻擊方式又不需要太多計算機方面的知識,一般只要能熟練使用 sql語言即可,因此對資料庫的安全構成了很大的威脅。
sql注入的攻擊方式比較簡單,一般是將一些特權語句注入到有漏洞的儲存過程或觸發器中導致這些語句被非法執行。例如在oracle中由sys建立如下儲存過程並將執行許可權授予普通使用者:
create or replace procedure proc1 ( input varchar2) as
... ...
stmt:='select titles from books where author =''' || input || '''';
execute immediate stmt;
... ...
正常情況下使用者可以通過執行:exec sys.proc1('dickens')來查詢dickens的著作,但如果惡意使用者這樣執行該儲存過程:
exec sys.proc1( 'dickens'' union select password from users_table where ''a'' = ''a'),那麼他就非法地查出了所有使用者的密碼。
雖然這只是乙個簡單的例子,但它表明在編寫系統儲存過程、函式和觸發器時一定要注意防止sql注入的可能。
資料庫是資訊系統的基石,一旦被黑客入侵,後果將不堪設想。而抵抗黑客入侵的最好辦法就是克服軟體程式設計中存在的各種漏洞,讓黑客無機可乘。通過原始碼審計、漏洞跟蹤等方式可以較好的修正現存系統中的各種安全隱患。目前我們正在達夢資料庫中積極開展漏洞發掘的相關工作,努力使達夢資料庫成為真正牢不可破的資料庫,為國家的資訊保安構築堅強的基石。
初步了解 資料庫系統
最近在看自考書 資料庫系統原理。學習計算機也有兩年了,前前後後做了 3次系統,都用到了資料庫。可以說對資料庫一些基本的操作比較熟悉了,但是一些抽象的理論概念,還是很模糊,好在,有了自考,我們可以在理論上更為鞏固一下。資料庫系統原理這本書的第一章就是像我們大家介紹了資料庫系統的一些基本概念。包括資料描...
深入講解資料庫中User和Schema的關係
深入講解資料庫中user和schema的關係 user 和schema 究竟是什麼關係,首先必須了解一下資料庫中 user 和schema 到底是什麼概念。在 sql server2000 中,由於架構的原因,user 和schema 總有一層隱含的關係,讓我們很少意識到其實 user 和schem...
深入講解資料庫中User和Schema的關係
究竟是什麼關係,首先必須了解一下資料庫中user和schema到底是什麼概念。在sql server2000中,由於架構的原因,user和schema總有一層隱含的關係,讓我們很少意識到其實user和schema是兩種完全不同的概念,不過在sql server2005中這種架構被打破了,user和s...