1. 程式人生 > >Informix和DB2符號連結漏洞解析

Informix和DB2符號連結漏洞解析

前言

IBM下有兩款大型關係型資料庫,分別是Informix和DB2。早在2001年和2003年兩款資料庫就被爆出存在符號鏈***提權的問題。尤其2003年Snosoft一口氣釋出了DB2數個關鍵工具存在符號連結***提權的問題。

符號鏈***雖然是一種本地***,但符號鏈***會造成非常嚴重的安全問題。例如:替換SSH公鑰檔案、作業系統敏感資訊洩露甚至直接奪取作業系統root許可權。

經過十餘年的發展IBM本應該消滅了符號鏈***問題。但根據我們安華金和***實驗室研究,發現各種“姿勢”的IBM資料庫符號連結漏洞。我們發現的典型漏洞分別是CVE-2017-1508、CVE-2018-1799、CVE-2018-1780、CVE-2018-1781和CVE-2018-1784

1、符號連結簡介

符號連結最早出現在4.2的BSD版本中,發展至今日,基本所有的主流作業系統都在某種程度上支援符號連結。符號連結(也稱為軟連結)是用來讓使用者建立指向另一個檔案或目錄的檔案或目錄。例如管理員可以建立一個名為test的符號鏈指向系統檔案/etc/hosts檔案。管理員訪問test,等於訪問/etc/hosts檔案。

符號連結檔案實際上是一種檔案系統中的特殊小檔案。他們的inode(簡單可以認為是linux系統中檔案的唯一編號)被標為符號連結型別。他們的實際檔案內容其實是檔案路徑。當核心解析路徑名時,如果遇到符號連結檔案,他會讀取符號連結中的檔案路徑,跟隨一層一層的符號連結檔案路徑,最終到達檔案。從而獲得到目標檔案的路徑。

整個符號連結流程如下圖所示:第一步訪問符號連結test.txt。第二步從符號連結中讀取到檔案的路徑。第三步基於第二步拿到的路徑訪問下一個軟連結或檔案。第四步經過層層抽絲剝繭最終獲得真實路徑。第五步在獲得真實路徑後根據真實路徑跳轉到上級目錄。第六步再從上層目錄跳入下層目錄訪問到要訪問的真實檔案。

 01.jpg

2、符號連結***

符號連結***的本質就是欺騙程式訪問不應該訪問的檔案。最常見的是用來獲取敏感資訊。有時候經過精妙的設計可以突破許可權的限制,最終達到覆蓋檔案或奪取更高許可權的效果。

假設有如下一段程式碼,此程式碼是用來在主目錄中檢視該使用者是否有.optconfig檔案。如果檔案存在,程式將開啟該檔案並讀入配置條目。大多數程式設計師會認為只要parse_opt_file()的檔案解析功能是安全的,這種行為就是安全可靠的

02.jpg

但如果***者在. Optconfig上做一些手腳。使用命令建立到/etc/shadow(存作業系統密碼的檔案) 的軟連結(ln -s /etc/shadow ~/.optconfig)。此時***者在使用上述程式。程式會去解析. Optconfig檔案。由於. Optconfig是一個符號連結,所以最終檔案解析的是存有密碼hash值的/etc/shadow檔案。***者很容易通過這種手段拿到密碼的hash值。威脅整個作業系統的安全。

3、提權C位-粘滯位

一次完美的符號連結***,除了必須有符號連結外,更重要的是要有提權的渠道。利用程式的粘滯位,是常見的提權方法。粘滯位加符號連結有機會造成一次本地提權***。

要解釋清楚懂粘滯位。首先簡單介紹幾個linux許可權。SUID 是 Set User ID,作用是讓程式執行者具有該程式所有者的許可權;如果沒有設定,程式執行者具有執行使用者的許可權。SUID 位可以通過 chmod u+s 設定。

舉個例子,在Linux中,所有賬號的密碼記錄在 /etc/shadow檔案中,並且只有root可以讀寫這個檔案。那麼,一個普通使用者通過命令 passwd 修改自己密碼的過程中肯定就需要寫 /etc/shadow這個檔案,之所以能這麼做是因為 /usr/bin/passwd 設定了SUID位:

-rwsr-xr-x. 1 root root 30768 Feb 22  2012 /usr/bin/passwd

Linux 核心主要是根據 EUID(effective user id) 和 EGID(effective group id) 來確定程序對資源的訪問許可權。 如果程序對應的程式沒有設定 SUID 或 SGID 位,則 euid=uid egid=gid,分別是執行這個程式的使用者的 uid 和 gid;反之,則 euid 和 egid 變為程式所有者的 uid和 gid。

因此如果能攔截有粘滯位的程式在降低許可權之前,實施越權訪問或操作,就很有可能最終獲得root許可權或以root身份進行越權操作。

4、經典案例剖析(CVE-2017-1508)

理解了粘滯位和符號連結***的原理後,咱們剖析一個informix的符號連結漏洞,來深入理解下這類漏洞的利用“姿勢”。CVE-2017-1508是一個標準的,通過低許可權使用者越權非法寫檔案,最終奪取作業系統root許可權例子。

Informix中使用oninit程式可以啟動資料庫。Oninit啟動資料庫的時候會開啟一個固定名稱為/tmp/jvp.log的檔案。如果在這個被我們用符號鏈替換,就可能造成一次符號連結***。更關鍵的是這個程式有粘滯位(下圖中許可權S)。粘滯位是為了幫助程式在啟動時可以使用root許可權完成一些操作。

 03.jpg

除了上述兩點外最重要的是oninit在訪問/tmp/jvp.log時。並未進行降權處理。於是基於粘滯位、符號連結***和未及時降權。我們可以對oninit實施符號連結***。

根據逆向結果,可以看到訪問/tmp/jvp.log需要開啟環境變數GLSLOG = “on”。同時在開啟fopen的時候未做符號連結檔案的判斷。通過符號連結***我們可以以root許可權讀取或寫入任意檔案。

 04.jpg

5、符號連結***提權

至此符號連結***主要還停留在建立、讀取和替換檔案內容階段。雖然符號連結可以通過讀取/etc/shadow獲得hash值。再嘗試通過字典來破解root密碼,但這種方法極不穩定又麻煩。這裡我給大家演示一種穩定提權到root的方法。

Linux 系統有一個特點,為了方便的給基礎庫或函快速修改的機會。所以在載入器上開了一個後門。載入器除了載入一個程式的動態庫外還會額外載入系統檔案/etc/ld.so.preload 中的動態庫。而如果在額外載入動態庫中寫入和系統函式同名的函式。又會因為ld.so.preload比其他庫早載入,最終導致ld.so.preload中庫的同名函式函式覆蓋真正系統上的同名函式。

05.jpg

由於可以覆蓋同名庫函式,所以我們就可以實現自己想要實現的任意功能。有粘滯位的程式基本都會使用geteuid獲取當前euid值。我們只要替換掉系統的geteuid。就可以在系統中實現自己想要執行的任意程式碼。

如下例利用geteuid實現一個永久的bash_shell

06.jpg

6、符號連結***的防護手段

從符號連結漏洞到最終獲得root shell。經歷了兩個關鍵點:1.存在粘滯位。2.訪問檔案前,未檢查是否是符號連結。

第一點:粘滯位的問題主要看是否存在必要性如果無必要性就不要使用。SUID尤其是 SUID Root 程式是存在很大風險的。如果程式確實需要設定 SUID 位,程式碼中不再需要高許可權時儘快通過呼叫 setuid() 降低許可權,也就是使 euid=uid egid=gid。儘量縮短,危險程式碼的時間。

第二點:在需要寫檔案時,應該先判斷要寫的檔案是否是已經存在的符號連結或硬連結檔案。如果使用open() 函式,oflag 設定成O_NOFOLLOW。可以保證如果是符號連結檔案,函式就會返回失敗。防止被符號連結***。如果使用fopen()函式就必須在使用之前利用lstat() 判斷檔案的型別。防止被符號連結***。

做到上述兩點檢查,可以完全避免符號連結的***。至少也能把符號連結***限定在一個非常有限的範圍內。