安華金和全面適配國產(chǎn)化操作系統(tǒng)及芯片CPU
數(shù)據(jù)安全治理關(guān)鍵技術(shù)之?dāng)?shù)據(jù)庫脫敏技術(shù)詳解
數(shù)據(jù)安全治理之API監(jiān)測系統(tǒng) ,解決API接口安全問題【安華金和】
新一代數(shù)據(jù)庫脫敏技術(shù),為敏感數(shù)據(jù)建立保護盾!
數(shù)據(jù)庫脫敏系統(tǒng)與金融行業(yè)案例解讀
數(shù)據(jù)安全治理建設(shè)思路的著力點——數(shù)據(jù)安全咨詢服務(wù)【安華金和】
數(shù)據(jù)庫防火墻功能有哪些?-數(shù)據(jù)安全-安華金和
數(shù)據(jù)安全關(guān)鍵技術(shù)之?dāng)?shù)據(jù)庫脫敏技術(shù)詳解【安華金和】
中國數(shù)據(jù)安全治理落地指導(dǎo)書籍《數(shù)據(jù)安全治理白皮書5.0》正式發(fā)布(附下載)
Oracle 12c及Oracle 18c組件jssu程序存在漏洞,易受符號鏈接攻擊影響,攻擊者可利用此漏洞獲得服務(wù)器root權(quán)限,此漏洞由安華金和公司安全實驗室發(fā)現(xiàn),CVE編號為CVE-2019-2444。本文將詳細(xì)說明漏洞涉及的技術(shù)細(xì)節(jié),并介紹與此漏洞相關(guān)的攻擊手段。
漏洞點
程序jssu是為Oracle Scheduler提供服務(wù)的組件,保存于Oracle主安裝目錄的bin文件夾下。在使用了credential的情況下,Scheduler會使用jssu程序來登錄系統(tǒng)進行操作。不過,jssu程序之所以會受到符號攻擊影響,原因與其功能關(guān)系不大,而是以下幾個方面:
首先是jssu程序本身的屬主及權(quán)限。默認(rèn)情況下,程序所屬用戶是root,而用戶組是oinstall,與oralce用戶的用戶組相同。程序權(quán)限為4750,即所屬用戶組可讀可執(zhí)行,且設(shè)置了suid位。
其次,jssu程序運行時會在工作目錄下生成一個日志文件,并向其中寫入內(nèi)容。該文件由程序的進程ID命名,具有固定的格式,即已知進程ID,就可推測出日志文件的文件名。生成的日志文件,其所屬用戶和用戶組與jssu程序相同,且其權(quán)限可被實際登錄用戶當(dāng)前設(shè)置的umask控制。
總結(jié)這兩點,我們現(xiàn)在擁有一個以oracle用戶即可執(zhí)行,所屬用戶為root,設(shè)置了suid位,且可向當(dāng)前工作目錄輸出文件的程序。由此,產(chǎn)生了一個符號鏈接攻擊思路。
作為攻擊者,我們以oracle用戶登錄,并啟動jssu。如果能在jssu寫入日志前,將輸出文件定義成一個指向我們所需位置的符號鏈接,由于jssu程序運行時具有root用戶權(quán)限,這樣我們就得了向任意位置寫入文件的能力。且此文件所屬用戶為root,用戶組為oinstall,讀寫權(quán)限可控。也就是說,得到的文件可以被oracle用戶修改。由此延伸,將符號鏈接指向/etc/ld.so.preload,文件產(chǎn)生后,我們就可以用oracle用戶修改這個文件。/etc/ld.so.preload文件可以控制系統(tǒng)中所有進程啟動時預(yù)先加載的動態(tài)鏈接庫,正常情況下只有root用戶可以修改。而攻擊成功后,oracle用戶就可以修改這個文件,指定一個由我們控制的動態(tài)鏈接庫文件,我們就可以通過這個動態(tài)鏈接庫拿一個root用戶的shell,更詳細(xì)的說明請見下一節(jié)。
攻擊流程
1.作為準(zhǔn)備,復(fù)制一個shell程序(/bin/bash)作為備份,在后面步驟中將會修改這個備份的權(quán)限,使執(zhí)行者可以拿一個root用戶權(quán)限的shell。
2.構(gòu)建一個動態(tài)鏈接庫,即“攻擊思路”中提到的將要通過/etc/ld.so.preload加載到所有進程中的動態(tài)鏈接庫。使用我們定義的函數(shù)”覆蓋“默認(rèn)的geteuid函數(shù),新函數(shù)的邏輯非常簡單,判斷當(dāng)前進程的有效用戶是否為root,如果是則修改之前準(zhǔn)備好的shell程序備份的權(quán)限為04777(所有用戶可讀寫,suid位已設(shè)置),修改所屬用戶和用戶組為root。
3.構(gòu)建一個可執(zhí)行程序,完成調(diào)用jssu和制作符號鏈接的工作。程序主體首先設(shè)置umask為0000,然后使用fork創(chuàng)建一個子進程。子進程啟動jssu程序;父進程則通過子進程ID,構(gòu)造出jssu將要寫入的日志文件名,提前使用這個文件名生成一個指向/etc/ld.so.preload的符號鏈接。父進程等待一段時間(保證jssu有輸出),殺掉子進程。如一切順利,此時/etc/ld.so.preload已經(jīng)被創(chuàng)建,所屬用戶root,所屬用戶組oinstall,權(quán)限0666,內(nèi)容為jssu的輸出日志。
4.修改/etc/ld.so.preload,將已準(zhǔn)備好的動態(tài)鏈接庫路徑寫入,覆蓋所有jssu的輸出。
5.等待一個root權(quán)限進程調(diào)用geteuid函數(shù),觸發(fā)我們準(zhǔn)備的動態(tài)鏈接庫中的代碼。這一步我們可以直接在命令行運行“sudo 2>/dev/null >/dev/null”,這個程序滿足我們的需求,結(jié)束后動態(tài)鏈接庫中的代碼已經(jīng)被執(zhí)行,我們準(zhǔn)備的shell程序備份的運行權(quán)限和所屬用戶已經(jīng)按我們的需求做了修改。此時,任意用戶都可以通過在命令行運行這個shell備份獲得一個root權(quán)限的shell。
6.運行已經(jīng)修改好的shell程序備份,拿到root權(quán)限shell。
完整的攻擊鏈
總結(jié)CVE-2019-2444漏洞技術(shù)細(xì)節(jié),其實現(xiàn)的是在本地將oracle用戶權(quán)限提升為root用戶權(quán)限。在現(xiàn)實環(huán)境中,運行Oracle數(shù)據(jù)庫的服務(wù)器上,oracle用戶也是一個很高權(quán)限用戶,并不會輕易泄露,那這個漏洞利用是不是就沒有價值了呢?
并非如此,CVE-2019-2444漏洞的利用只是完成了一個攻擊鏈的最后一步,即拿到root權(quán)限,達到完全控制。實際上,在相同版本的Oracle數(shù)據(jù)庫中還存在著的其他的漏洞,可以與CVE-2019-2444配合,組成一個完整的攻擊鏈。例如:cve-2018-3004,此漏洞利用可通過Java反序列化向量繞過Oracle JVM內(nèi)置的安全機制,達到提升用戶權(quán)限的目的。在漏洞細(xì)節(jié)已在互聯(lián)網(wǎng)公布,本文只梳理其關(guān)鍵技術(shù)點,具體細(xì)節(jié)可參考以下鏈接:
http://obtruse.syfrtext.com/2018/07/oracle-privilege-escalation-via.html
關(guān)于CVE-2018-3004
Oracle內(nèi)置了Java虛擬機,用戶可以使用Java語言來構(gòu)建存儲過程,但出于安全原因,Oracle JVM會嚴(yán)格限制低權(quán)限用戶對于文件系統(tǒng)的使用,例如使用java執(zhí)行本地程序,訪問本地文件等。而CVE-2018-3004漏洞,借助Java的XML反序列化方法,繞過了Oracle JVM的限制,從而可以直接訪問數(shù)據(jù)庫本地文件系統(tǒng) 。
Java的序列化和反序列化的作用是將JVM運行時存在于內(nèi)存中的Object轉(zhuǎn)化成能夠長期保存的字節(jié)流,在將來所需時,可以將字節(jié)流重新組裝得到原先的Object。序列化和反序列化可以將Java的Object“持久”化,擺脫JVM生存周期的限制 ,也可以用來在主機間進行傳輸。XML反序列化就是一種以XML格式來保存Java Object的標(biāo)準(zhǔn),相關(guān)描述可見如下鏈接:
https://www.oracle.com/technetwork/java/persistence3-139471.html
XML反序列化,可以描述一個Java Object,以及用來構(gòu)建Object時所需要調(diào)用的方法和相關(guān)參數(shù)。在Oracle中,使用XMLDecoder類重新組裝XML序列化后的對象,而在組裝過程中所調(diào)用的對象方法,沒有被Oracle JVM限制權(quán)限。因此,可以使用XML反序列化構(gòu)建一個FileWriter對象,并調(diào)用其write方法,就可以實現(xiàn)文件寫入操作。
文件寫入就是CVE-2018-3004的核心,利用此漏洞,低權(quán)限用戶可以任意寫入、追加或者覆蓋oracle用戶擁有寫入權(quán)限的文件。在ssh服務(wù)已經(jīng)開啟的服務(wù)器上,如果向oracle用戶ssh配置中authorized_key文件中寫入一個由攻擊者構(gòu)造的公鑰,此時,攻擊者就可以直接ssh登錄服務(wù)器的oracle用戶。
總結(jié)
CVE-2019-2444是一個使用符號鏈接攻擊手段,達到本地提權(quán)效果的漏洞,攻擊者可由oracle用戶權(quán)限提升至root用戶權(quán)限 ;CVE-2018-3004是一個使用Java反序列化攻擊手段達到遠(yuǎn)程提權(quán)登錄效果的漏洞,擁有數(shù)據(jù)庫普通用戶權(quán)限且可遠(yuǎn)程登錄的攻擊者可借由此漏洞ssh遠(yuǎn)程連接數(shù)據(jù)庫服務(wù)器,并以oracle用戶登錄。兩個漏洞結(jié)合起來,就可以讓一個普通的數(shù)據(jù)庫使用者獲得數(shù)據(jù)庫所在服務(wù)器的root權(quán)限。