隨著《政府采購法實施條例》正式實施,雖然安全行業迎來了數據庫國產化的春天,但現今Oracle依舊是中國政府機關使用最廣泛的數據庫。其安全性受到廣泛關注。
Oracle數據庫必須使用TNS Listener(數據庫監聽器)來完成數據庫和客戶端之間的通訊。因此TNS Listener的漏洞成了很多黑客的主要目標。這些TNS Listener的漏洞如果不及時處理,將對用戶的信息資產造成重大損失,同時也使許多敏感信息處于危險境地。本文主要對TNS Listener的漏洞帶來的安全威脅和防護措施進行介紹,希望管理者和數據庫的維護人員能夠提高警惕,加強針對TNS Listener漏洞的防護措施。
根據安華金和數據庫安全實驗室統計,2001年至2012年間,針對TNS LISTENER的漏洞有15個,其中高危漏洞9個,中危漏洞6個。TNS Listener漏洞總數并不多,但其具備威脅大,跨越數據庫版本多,適合通過網絡遠程攻擊的特點。本文將針對這15個TNS漏洞按照攻擊原理進行分類,并最終給出對應防護技術。
TNS Listener作為ORACLE的必備組件,TNS Listener不僅定義了數據庫和客戶端之間的通訊協議,更負責對客戶端進行身份驗證(確認客戶端用于通訊的用戶名和密碼是否合法)。根據TNS這2條主要功能可以把漏洞分成三大類:
第一類漏洞,TNS Listener被觸發緩沖區重寫,導致服務器無法響應客戶端。造成通訊失敗。簡單說就是使TNS Listener崩潰。例如漏洞CVE-2007-5507就是這個類型的代表。
第二類漏洞,繞過TNS身份驗證,獲得合法數據庫賬號和密碼。這個類型具體可以分三種:
1.通過劫持TNS信息,把oracle的登錄信息劫持到攻擊者機器,獲取敏感信息,甚至獲取oracle管理員賬號密碼。具體請參考安華金和數據庫安全實驗室發表的《Oracle數據庫漏洞隱患無需user/password快速入侵 》一文。
2.直接對在TNS中加密的oracle登錄密鑰進行破解具體請參考安華金和數據庫安全實驗室發表《破解oracle9i、oracle10g、oracle11g密碼》一文。
3.在遠程登陸過程中對服務器進行sql注入。利用某些特殊函數,創建新的數據庫賬號,并為新賬號創建DBA權限。例如漏洞CVE-2006-0552就是這個類型的代表。
第三類漏洞,通過緩沖區溢出控制數據庫所在操作系統。這個類型具體可分兩種方式:
1.直接通過向TNS Listener發送含有異常字段的包,當oracle調用含有異常字段的包的時候,觸發緩沖區溢出。具體可以參考安華金和數據庫安全實驗室發表《通過OracleTNS漏洞攻占oracle所在操作系統,進而入侵oracle》一文。
2.向TNS Listener發送含有異常數據的包,直接觸發緩沖區溢出,奪取數據庫所在操作系統控制權限。例如漏洞CVE-2002-0965就是這個類型的代表。
其中第三類漏洞在15個漏洞中分布最廣泛。下面我們按照類型進行原理介紹。
第一類漏洞中的代表是CVE-2007-5507。GIOP格式的消息中的DWORD被用來描述后面的字段的長度。當DWORD被惡意的修改后,如果DWORD所指出的長度比實際的字段的長度要長。TNS Listener會按照DWORD的數值來分配內存,把實際的字段考入。再讀取的時候按照DWPRD的長度去讀取,就會導致讀取失敗。TNS Listener服務崩潰,無法接受客戶端的請求。導致服務器無法響應客戶端。
該問題幾乎存在于Oracle的所有版本,并且Oracle至今僅是發布了警告性通知,并未提供解決方案。TNS劫持的核心點在于監聽會按照目標數據庫名遞送到名稱正確的數據庫。通過遠程注冊的方法可以讓一個監聽下同時存在2個同名數據庫(1個黑客的機器1個目標機器)。監聽將自動按照負載均衡把每次訪問發送到負載低的數據庫上,進行連接訪問。也就是說有高過一半的幾率TNS Listener有可能把客戶端的請求錯誤的發送到黑客的機器上。黑客的機器再配置listener_name=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=tcp)(HOST=目標機器IP)(PORT=目標機器端口)))
就可以變成客戶端和目標機器的中間站。自己發送信息給目標機器,讓目標機器誤以為是客戶端發送的信息。
雖然11g在登錄信息加密上做了較大改善。但算法主體思想還是客戶端和數據庫分別以Oracle_hash為基礎生成S_AUTH_SESSKEY和C_AUTH_SESSKEY。客戶端對傳過來的S_AUTH_SESSKEY。做AES192解密處理拿到server_sesskey。把server_sesskey和自己的client_sesskey做md5生成combine。用combine生成AUTH_PASSWORD。服務器端最后用combine對AUTH_PASSWORD解密。對比密碼,如果一致登陸成功。所以oracle的默認加密算法基本已經被破。一旦登錄包被截獲則可能直接被離線暴力破解出用戶名和密碼。
這種漏洞是利用的協議認證的機制,在Oracle Database的登錄過程時,遠程攻擊者在登錄過程中對服務器進行SQL注入攻擊。協議認證由兩個步驟組成,包含有兩個不同的客戶端請求和兩個服務器響應。第一個請求僅包含有用戶名,而第二個請求包含有用戶名和亂碼的口令。第二個請求(下圖)還包含有”名稱-值”對列表,描述客戶端的各種屬性,其中AUTH_ALTER_SESSION就是這個sql注入的目標。AUTH_ALTER_SESSION的值中可以包含有任意SQL語句。并且AUTH_ALTER_SESSION是以Oracle訪問控制機制之外的SYS用戶環境執行的,因此通過將AUTH_ALTER_SESSION值改為創建用戶語句,并給予新用戶DBA權限。簡單說就是,攻擊者可以通過這類的漏洞創建新的數據庫帳號并為帳號創建DBA權限。
通過緩沖區溢出攻占數據庫所在操作系統的控制權。以CVE-2002-0965為例,
上圖為正常的的會話,CVE-2002-0965就是把上圖中的SERVICE_NAME用超過20字節的字符串代替。導致TNS在調RVICE_NAME的時候出現緩沖區溢出,緩沖區溢出后調用寫好的shellcode。奪取操作系統權限(具體可以參考安華金和數據庫實驗室發辮的《windows緩沖區溢出原理(棧)》一文)。
buff=”超過20字節的串”
sploit=”(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=#{rhost}(PORT=#{rport}))(CONNECT_DATA=(SERVICE_NAME=#{buff})(CID=(PROGRAM=MSF))))”
上面按照2001年到2012年間15個漏洞,總結了TNS Listener漏洞主要被利用的5種方式。(類型3的2種子類方式一樣,只是緩沖區溢出的用法有差別,這里就不作區分了)
TNS Listener作為oracle的核心組件和安全門戶。如果被黑客用上述任何一種方式入侵都很可能產生,類似2013年CSDN公司用戶信息大規模泄漏事件。而且由于TNS Listener位置的特殊性,對TNS Listener的防護手段有別于其他數據庫組件的安全防護手段。對TNS Listener的防護手段主要分為四個層次:
第一層是:通過數據庫弱口令掃描產品和定期更換安全密碼進行預防。
第二層是:對TNS Listener進行密碼設置防止遠程注冊被黑客利用。(阻止來自網絡的非法注冊)
最三層是:通過下載官方補丁或者使用含有VPATH的防火墻產品對已知漏洞進行修復。
最后一層:是通過數據局保險箱對數據庫進行全庫或者敏感字段加密。保證即便TNS Listener被攻破,核心數據依舊不會泄露。
大多數黑客通過TNS Listener入侵數據庫并非因為漏洞,而是通過默認口令、弱口令、撞庫等方式。數據庫弱口令掃描工具就是專門用來檢測oracle的賬號口令安全強度。利用探測到的賬號以數據庫管理員特權身份或其他特權身份進入被掃描的數據庫系統,從內部檢查數據庫的認證、授權與系統完整性等內部配置信息,全面地分析、評估數據庫的安全弱點和安全風險。
針對第二類第二種,截獲通訊包線下暴力破解。雖然這個密碼是通過模擬oracle加密的過程算出來的。但是本質上還是需要足夠大的密碼庫進行比對。所以只要定期更換長度和復雜度滿足oracle官方要求的密碼,就基本可以應付線下暴力破解問題。關鍵是不要用不滿足oracle的密碼,和長期不換密碼。
雖然TNS Listener默認是不設置密碼的,但是其本身是支持加密的。加密后可以杜絕外來黑客對TNS Listener進行的非法注冊。從根本上杜絕了第二類中的第一種漏洞。
TNS Listener加密方法如下:
LSNRCTL> start
LSNRCTL> change_password
Old password:
New password:
Reenter new password:
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=test)(PORT=1521)))
Password changed for listener_demo92
The command completed successfully
LSNRCTL> save_config
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=test)(PORT=1521)))
TNS-01169: The listener has not recognized the password
LSNRCTL> set password
TNS Listener是oracle 的重要組件,所以盡可能第一時間安裝Oracle公司會定期地公布的補丁包,這些補丁包也會修復TNS Listener中存在的漏洞。有些數據庫漏洞掃描工具能夠掃描出這些缺陷,并提醒用戶下載補丁包。當然更為安全的策略,是定期到Oracle官方網站上進行訪問,看是否有新的補丁包發布并進行安裝。
3.5、數據庫防火墻(第三層)
當然有些生產或測試環境因為種種原因無法對數據庫進行補丁升級,那么建議在數據庫服務器和應用服務器之間加入帶有虛擬補丁(可以起到打oracle升級包效果)功能的數據庫防火墻產品。這樣既不對數據庫服務器有任何變化,還同時能阻止黑客使用未修復的TNS Listener漏洞。數據庫防火墻還可以通過設置對SQL語句、客戶端IP地址、應用服務請求等進行人為禁止。為數據庫搭建可信的安全訪問環境。
當數據庫防火墻被部署于上圖所示的位置的時,將把數據庫從整個網絡環境中隔離出去。禁止一切對數據庫的非法偵測。
最壞的情況是黑客通過TNS Listener的漏洞,獲取了數據庫本地操作系統權限或是數據庫DBA權限。批量導出數據庫內存儲的核心信息。為了保護那些核心信息,我們可以通過數據庫保險箱對整個數據庫進行加密操作。只要未獲取加密時對應的KEY。即便是DBA權限也只能看到的是加密后的亂碼無法從中獲取有用信息。從源頭上保護了數據庫中存儲的敏感信息。
本文提供了四個層次的防護手段。這四個層次涵蓋了六種應對TNS Listener安全威脅的防護手段。如果管理者或管理員能把這六種防護手段結合使用,將杜絕TNS Listener帶來的安全威脅。
本文分析了TNS Listener漏洞帶來的五種安全威脅:TNS Listener服務崩潰漏洞(第一類)、TNS 劫持(第二類第一種)、破解TNS默認加密方式(第二類第二種)、遠程非法創建新DBA權限用戶(第二類第三種)、通過TNS奪取操作系統(第三類)。同時提出了四層防護手段:數據庫弱口令檢查、定期更換oracle推薦的密碼、TNS Listener加密、下載對應官方補丁包、數據庫防火墻、數據庫加密。當然對TNS Listener漏洞的安全威脅和防護的研究,需要持續不斷地進行下去,更關鍵的是要不斷地普及防護意識和技術,才能有效保護政府部門的信息安全。