數(shù)據(jù)安全治理關(guān)鍵技術(shù)之?dāng)?shù)據(jù)庫脫敏技術(shù)詳解
數(shù)據(jù)安全治理之API監(jiān)測(cè)系統(tǒng) ,解決API接口安全問題【安華金和】
新一代數(shù)據(jù)庫脫敏技術(shù),為敏感數(shù)據(jù)建立保護(hù)盾!
數(shù)據(jù)庫脫敏系統(tǒng)與金融行業(yè)案例解讀
數(shù)據(jù)安全治理建設(shè)思路的著力點(diǎn)——數(shù)據(jù)安全咨詢服務(wù)【安華金和】
數(shù)據(jù)庫防火墻功能有哪些?-數(shù)據(jù)安全-安華金和
數(shù)據(jù)安全關(guān)鍵技術(shù)之?dāng)?shù)據(jù)庫脫敏技術(shù)詳解【安華金和】
中國(guó)數(shù)據(jù)安全治理落地指導(dǎo)書籍《數(shù)據(jù)安全治理白皮書5.0》正式發(fā)布(附下載)
IBM下有兩款大型關(guān)系型數(shù)據(jù)庫,分別是Informix和DB2。早在2001年和2003年兩款數(shù)據(jù)庫就被爆出存在符號(hào)鏈攻擊提權(quán)的問題。尤其2003年Snosoft一口氣發(fā)布了DB2數(shù)個(gè)關(guān)鍵工具存在符號(hào)鏈接攻擊提權(quán)的問題。
符號(hào)鏈攻擊雖然是一種本地攻擊,但符號(hào)鏈攻擊會(huì)造成非常嚴(yán)重的安全問題。例如:替換SSH公鑰文件、操作系統(tǒng)敏感信息泄露甚至直接奪取操作系統(tǒng)root權(quán)限。
經(jīng)過十余年的發(fā)展IBM本應(yīng)該消滅了符號(hào)鏈攻擊問題。但根據(jù)我們安華金和攻防實(shí)驗(yàn)室研究,發(fā)現(xiàn)各種“姿勢(shì)”的IBM數(shù)據(jù)庫符號(hào)鏈接漏洞。我們發(fā)現(xiàn)的典型漏洞分別是CVE-2017-1508、CVE-2018-1799、CVE-2018-1780、CVE-2018-1781和CVE-2018-1784
符號(hào)鏈接最早出現(xiàn)在4.2的BSD版本中,發(fā)展至今日,基本所有的主流操作系統(tǒng)都在某種程度上支持符號(hào)鏈接。符號(hào)鏈接(也稱為軟鏈接)是用來讓用戶創(chuàng)建指向另一個(gè)文件或目錄的文件或目錄。例如管理員可以創(chuàng)建一個(gè)名為test的符號(hào)鏈指向系統(tǒng)文件/etc/hosts文件。管理員訪問test,等于訪問/etc/hosts文件。
符號(hào)鏈接文件實(shí)際上是一種文件系統(tǒng)中的特殊小文件。他們的inode(簡(jiǎn)單可以認(rèn)為是linux系統(tǒng)中文件的唯一編號(hào))被標(biāo)為符號(hào)鏈接類型。他們的實(shí)際文件內(nèi)容其實(shí)是文件路徑。當(dāng)內(nèi)核解析路徑名時(shí),如果遇到符號(hào)鏈接文件,他會(huì)讀取符號(hào)鏈接中的文件路徑,跟隨一層一層的符號(hào)鏈接文件路徑,最終到達(dá)文件。從而獲得到目標(biāo)文件的路徑。
整個(gè)符號(hào)鏈接流程如下圖所示:第一步訪問符號(hào)鏈接test.txt。第二步從符號(hào)鏈接中讀取到文件的路徑。第三步基于第二步拿到的路徑訪問下一個(gè)軟鏈接或文件。第四步經(jīng)過層層抽絲剝繭最終獲得真實(shí)路徑。第五步在獲得真實(shí)路徑后根據(jù)真實(shí)路徑跳轉(zhuǎn)到上級(jí)目錄。第六步再從上層目錄跳入下層目錄訪問到要訪問的真實(shí)文件。
符號(hào)鏈接攻擊的本質(zhì)就是欺騙程序訪問不應(yīng)該訪問的文件。最常見的是用來獲取敏感信息。有時(shí)候經(jīng)過精妙的設(shè)計(jì)可以突破權(quán)限的限制,最終達(dá)到覆蓋文件或奪取更高權(quán)限的效果。
假設(shè)有如下一段代碼,此代碼是用來在主目錄中查看該用戶是否有.optconfig文件。如果文件存在,程序?qū)⒋蜷_該文件并讀入配置條目。大多數(shù)程序員會(huì)認(rèn)為只要parse_opt_file()的文件解析功能是安全的,這種行為就是安全可靠的
但如果攻擊者在. Optconfig上做一些手腳。使用命令建立到/etc/shadow(存操作系統(tǒng)密碼的文件) 的軟鏈接(ln -s /etc/shadow ~/.optconfig)。此時(shí)攻擊者在使用上述程序。程序會(huì)去解析. Optconfig文件。由于. Optconfig是一個(gè)符號(hào)鏈接,所以最終文件解析的是存有密碼hash值的/etc/shadow文件。攻擊者很容易通過這種手段拿到密碼的hash值。威脅整個(gè)操作系統(tǒng)的安全。
一次完美的符號(hào)鏈接攻擊,除了必須有符號(hào)鏈接外,更重要的是要有提權(quán)的渠道。利用程序的粘滯位,是常見的提權(quán)方法。粘滯位加符號(hào)鏈接有機(jī)會(huì)造成一次本地提權(quán)攻擊。
要解釋清楚懂粘滯位。首先簡(jiǎn)單介紹幾個(gè)linux權(quán)限。SUID 是 Set User ID,作用是讓程序執(zhí)行者具有該程序所有者的權(quán)限;如果沒有設(shè)置,程序執(zhí)行者具有執(zhí)行用戶的權(quán)限。SUID 位可以通過 chmod u+s 設(shè)置。
舉個(gè)例子,在Linux中,所有賬號(hào)的密碼記錄在 /etc/shadow文件中,并且只有root可以讀寫這個(gè)文件。那么,一個(gè)普通用戶通過命令 passwd 修改自己密碼的過程中肯定就需要寫 /etc/shadow這個(gè)文件,之所以能這么做是因?yàn)?/usr/bin/passwd 設(shè)置了SUID位:
-rwsr-xr-x. 1 root root 30768 Feb 22 2012 /usr/bin/passwd
Linux 內(nèi)核主要是根據(jù) EUID(effective user id) 和 EGID(effective group id) 來確定進(jìn)程對(duì)資源的訪問權(quán)限。 如果進(jìn)程對(duì)應(yīng)的程序沒有設(shè)置 SUID 或 SGID 位,則 euid=uid egid=gid,分別是執(zhí)行這個(gè)程序的用戶的 uid 和 gid;反之,則 euid 和 egid 變?yōu)槌绦蛩姓叩?uid和 gid。
因此如果能攔截有粘滯位的程序在降低權(quán)限之前,實(shí)施越權(quán)訪問或操作,就很有可能最終獲得root權(quán)限或以root身份進(jìn)行越權(quán)操作。
理解了粘滯位和符號(hào)鏈接攻擊的原理后,咱們剖析一個(gè)informix的符號(hào)鏈接漏洞,來深入理解下這類漏洞的利用“姿勢(shì)”。CVE-2017-1508是一個(gè)標(biāo)準(zhǔn)的,通過低權(quán)限用戶越權(quán)非法寫文件,最終奪取操作系統(tǒng)root權(quán)限例子。
Informix中使用oninit程序可以啟動(dòng)數(shù)據(jù)庫。Oninit啟動(dòng)數(shù)據(jù)庫的時(shí)候會(huì)打開一個(gè)固定名稱為/tmp/jvp.log的文件。如果在這個(gè)被我們用符號(hào)鏈替換,就可能造成一次符號(hào)鏈接攻擊。更關(guān)鍵的是這個(gè)程序有粘滯位(下圖中權(quán)限S)。粘滯位是為了幫助程序在啟動(dòng)時(shí)可以使用root權(quán)限完成一些操作。
除了上述兩點(diǎn)外最重要的是oninit在訪問/tmp/jvp.log時(shí)。并未進(jìn)行降權(quán)處理。于是基于粘滯位、符號(hào)鏈接攻擊和未及時(shí)降權(quán)。我們可以對(duì)oninit實(shí)施符號(hào)鏈接攻擊。
根據(jù)逆向結(jié)果,可以看到訪問/tmp/jvp.log需要開啟環(huán)境變量GLSLOG = “on”。同時(shí)在打開fopen的時(shí)候未做符號(hào)鏈接文件的判斷。通過符號(hào)鏈接攻擊我們可以以root權(quán)限讀取或?qū)懭肴我馕募?/p>
至此符號(hào)鏈接攻擊主要還停留在創(chuàng)建、讀取和替換文件內(nèi)容階段。雖然符號(hào)鏈接可以通過讀取/etc/shadow獲得hash值。再嘗試通過字典來破解root密碼,但這種方法極不穩(wěn)定又麻煩。這里我給大家演示一種穩(wěn)定提權(quán)到root的方法。
Linux 系統(tǒng)有一個(gè)特點(diǎn),為了方便的給基礎(chǔ)庫或函快速修改的機(jī)會(huì)。所以在加載器上開了一個(gè)后門。加載器除了加載一個(gè)程序的動(dòng)態(tài)庫外還會(huì)額外加載系統(tǒng)文件/etc/ld.so.preload 中的動(dòng)態(tài)庫。而如果在額外加載動(dòng)態(tài)庫中寫入和系統(tǒng)函數(shù)同名的函數(shù)。又會(huì)因?yàn)閘d.so.preload比其他庫早加載,最終導(dǎo)致ld.so.preload中庫的同名函數(shù)函數(shù)覆蓋真正系統(tǒng)上的同名函數(shù)。
由于可以覆蓋同名庫函數(shù),所以我們就可以實(shí)現(xiàn)自己想要實(shí)現(xiàn)的任意功能。有粘滯位的程序基本都會(huì)使用geteuid獲取當(dāng)前euid值。我們只要替換掉系統(tǒng)的geteuid。就可以在系統(tǒng)中實(shí)現(xiàn)自己想要執(zhí)行的任意代碼。
如下例利用geteuid實(shí)現(xiàn)一個(gè)永久的bash_shell
從符號(hào)鏈接漏洞到最終獲得root shell。經(jīng)歷了兩個(gè)關(guān)鍵點(diǎn):1.存在粘滯位。2.訪問文件前,未檢查是否是符號(hào)鏈接。
第一點(diǎn):粘滯位的問題主要看是否存在必要性如果無必要性就不要使用。SUID尤其是 SUID Root 程序是存在很大風(fēng)險(xiǎn)的。如果程序確實(shí)需要設(shè)置 SUID 位,代碼中不再需要高權(quán)限時(shí)盡快通過調(diào)用 setuid() 降低權(quán)限,也就是使 euid=uid egid=gid。盡量縮短,危險(xiǎn)代碼的時(shí)間。
第二點(diǎn):在需要寫文件時(shí),應(yīng)該先判斷要寫的文件是否是已經(jīng)存在的符號(hào)鏈接或硬鏈接文件。如果使用open() 函數(shù),oflag 設(shè)置成O_NOFOLLOW。可以保證如果是符號(hào)鏈接文件,函數(shù)就會(huì)返回失敗。防止被符號(hào)鏈接攻擊。如果使用fopen()函數(shù)就必須在使用之前利用lstat() 判斷文件的類型。防止被符號(hào)鏈接攻擊。
做到上述兩點(diǎn)檢查,可以完全避免符號(hào)鏈接的攻擊。至少也能把符號(hào)鏈接攻擊限定在一個(gè)非常有限的范圍內(nèi)。
試用申請(qǐng)
在線咨詢
咨詢電話
TOP