數(shù)據(jù)庫系統(tǒng)安全之漏洞發(fā)掘

字號:

如今,在病毒肆虐、黑客無處不在的網(wǎng)絡(luò)環(huán)境里,軟件的安全性已成為一個備受關(guān)注的話題。傳統(tǒng)的軟件安全性關(guān)注的主要在于權(quán)限與角色的管理,如訪問控制,或是數(shù)據(jù)的機密性與完整性,如加密解密。但是一個軟件系統(tǒng)在應(yīng)用了這些安全措施之后就能確保其萬無一失了嗎?答案似乎并不那么簡單,其中一個重要(甚至可以說致命)的問題在于軟件系統(tǒng)中的漏洞。常常在一個看似牢不可破的系統(tǒng)中,僅僅是因為存在一個小小的漏洞,導致整個安全體系被黑客輕易地攻破,整個系統(tǒng)的控制權(quán)徹底喪失。
    所謂漏洞,通常是指軟件中存在的一些bug,但這種bug又不同于普通軟件測試中的bug。普通軟件測試中的bug指的是功能性或邏輯性的錯誤,如對話框彈出出錯、系統(tǒng)執(zhí)行某功能失敗等。這些bug影響的只是用戶的使用體驗,并不對系統(tǒng)的安全構(gòu)成威脅。而軟件的安全漏洞指的是某些別有用心的用戶非正常的使用軟件,讓軟件執(zhí)行一些自己精心設(shè)計的惡意代碼,或解析畸形文件,當軟件中存在安全漏洞的時候,程序的正常執(zhí)行流程被改變,從而達到獲取系統(tǒng)的控制權(quán)或竊取機密數(shù)據(jù)的目的。
    數(shù)據(jù)庫系統(tǒng)是在操作系統(tǒng)平臺之上的最重要的系統(tǒng)軟件,數(shù)據(jù)庫系統(tǒng)的安全可以說是十分重要的。曾經(jīng)有句話這樣說:如果網(wǎng)絡(luò)遍地是金錢,那么金錢就在數(shù)據(jù)庫服務(wù)器中。隨著無紙化業(yè)務(wù)環(huán)境的不斷擴大,人們在數(shù)據(jù)庫中存儲著越來越多的敏感信息:銀行賬戶、醫(yī)療記錄、政府文件、軍事機密等等,數(shù)據(jù)庫系統(tǒng)就成為越來越有價值的攻擊目標,因此確保數(shù)據(jù)庫系統(tǒng)的安全也越來越重要。
    作為一種大型的系統(tǒng)軟件,數(shù)據(jù)庫系統(tǒng)中也存在著各種各樣的安全漏洞,其中危害性較大的有緩沖區(qū)溢出、堆溢出和SQL注入等。
    1.緩沖區(qū)溢出
    緩沖區(qū)溢出是一種很常見也很古老的安全漏洞。早在上個世紀80年代,緩沖區(qū)溢出就已經(jīng)為人所知,但時至今日,大量的緩沖區(qū)溢出漏洞仍被發(fā)現(xiàn)。最的Morris蠕蟲就是利用Unix系統(tǒng)上fingerd程序的緩沖區(qū)溢出漏洞。在Oracle 9i發(fā)布之初,Oarcle公司曾宣稱他的數(shù)據(jù)庫是“ unbreakable ”的,但不到幾個月的時間,就暴出Oracle 9i中oracle.exe、XDB等程序存在多個緩沖區(qū)溢出漏洞。
    在C語言中最常見的緩沖區(qū)就是字符數(shù)組,而操縱字符數(shù)組的函數(shù)有g(shù)ets、strcpy、sprintf等。這些函數(shù)在執(zhí)行字符串拷貝的過程中沒有對字符串進行長度檢查,這樣就很容易發(fā)生超長的字符串溢出緩沖區(qū)的情況。當初這樣設(shè)計是出于效率的考慮,但現(xiàn)在看來,這些函數(shù)的使用已成為C語言軟件脆弱的一個重要因素。如果程序員沒有良好的編程習慣,時刻注意函數(shù)調(diào)用過程中是否拷貝了超過緩沖區(qū)長度的字符串,那么緩沖區(qū)溢出就不可避免。對于一個有緩沖區(qū)溢出漏洞的程序,當普通用戶輸入超長字符串時,通常只會使該程序崩潰。例如對于下面一小段代碼:
    以下是引用片段:
    /* vulprog */
    #include
    int main(int argc , char * argv[])
    {
    char buff[8];
    strcpy(buff, argv[1]);
    }
    如果用戶執(zhí)行 ./vulprog AAAAAAAAAAAAAAAA,在Linux上會出現(xiàn)段錯誤,因為用戶輸入了超長的字符串,除了填滿了緩沖區(qū),還覆蓋了其他一些程序正常退出所需要的數(shù)據(jù)。為了研究這個問題,就需要了解Linux系統(tǒng)中進程的內(nèi)存空間。