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