Oracle Database Server 'TNS Listener'遠端資料投毒漏洞

strivechao發表於2019-04-25

關於CVE-2012-1675

綠盟掃描系統,報告了一個安全漏洞,研究了下

Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE

oracle 安全警告

在安全警告CVE-2012-1675中進行了描述:

http://www.oracle.com/technetwork/topics/security/alert-cve-2012-1675-1608180.html


這個漏洞的發現者和描述

該漏洞主要影響監聽器。

最主要的危害為,攻擊者可以自行建立一個和當前生產資料庫同名的資料庫,將其向生產資料庫的監聽註冊。

這樣將導致使用者連線被路由指向攻擊者建立的例項,造成業務響應中斷

應用程式報告 ORA-12545: Connect failed because target host or object does not exist

 

受到影響的版本

雖然安全警告描述的是10203開始,但是實際是從8i開始的任何版本

 

如何查詢攻擊者

如果遭遇到攻擊,檢視攻擊者機器不太方便。

當時測試出可行的方法為關閉資料庫例項和所有的連線,檢查仍然連線到1521埠的機器

監聽日誌中沒有註冊者的IP和主機名資訊

TRC 監聽無法找到註冊監聽者的IP和主機名

  如何避免受該安全漏洞影響?

1.     設定監聽器不接受動態註冊,所有例項靜態註冊(單例項以及不做load_balance的RAC)

 

2.     設定只允許特定的IP訪問監聽器

 

3.     設定Class of Secure Transport,用來只允許本機例項或特定機器的例項註冊到監聽器。

 

該特性是10203引入,但存在Bug 12880299 - TCP handlers block if listener registration is restricted to IPC with COST [ID 12880299.8]

 

如果不安裝補丁,只允許限制IPC協議的動態監聽註冊,無法限制預設的TCP協議動態監聽註冊

 

如果監聽與資料庫間使用TCP協議,需要安裝Patch12880299,各版本最新的PSU中都有包含(10203不包含)

 11.2.0.4.   Patch Set Update

11.2.0.3.3 Patch Set Update

11.2.0.2.7 Patch Set Update

11.1.0.7.12 Patch Set Update

10.2.0.5.8 Patch Set Update

10.2.0.4.13 Patch Set Update 

 

單例項,不準備啟用服務端負載均衡的RAC,參考

Using Class of Secure Transport (COST) to Restrict Instance Registration [ID 1453883.1]

 

需要服務端負載均衡的RAC,參考

Using Class of Secure Transport (COST) to Restrict Instance Registration in Oracle RAC [ID 1340831.1]



•1.確定解決方案

•2.應用解決方案

•3.驗證修補情況

•4.Reference

1.確定解決方案

安全廠家給出的解決辦法:

連結: http://www.oracle.com/technetwork/topics/security/alert-cve-2012-1675-1608180.html

根據此連結得到解決方法:


1
2
3
4
Solution
Recommendations for protecting against this vulnerability can be found at :
My Oracle Support Note 1340831.1 for Oracle Database deployments that use Oracle Real Application Clusters (RAC).
My Oracle Support Note 1453883.1 for Oracle Database deployments that do not use RAC.

目前這裡環境不是RAC,參考文件1453883.1:

Using Class of Secure Transport (COST) to Restrict Instance Registration (文件 ID 1453883.1)

找到兩種解決方案:

1
2
3
4
5
6
7
SOLUTION
There are two methods that can be used to protect the listener using COST "SECURE_REGISTER_listener_name =" in stand alone database installations.
1) Restricting registration to the TCP protocol (Requires the fix for BUG:12880299)
- or -
2) Restricting registration to the IPC protocol (The patch for BUG:12880299 is NOT required for the IPC method)
Either method accomplishes the same goal but it is your choice which type to implement subject to the restriction* noted below. Both methods will be discussed.
•The second method (using IPC) cannot be used if the database is a member of an Oracle Data Guard broker configuration.

我這裡選擇第一種解決方案:

1) Restricting registration to the TCP protocol (Requires the fix for BUG:12880299)。

2.應用解決方案

2.1 確定現狀

監聽配置檔案:listener.ora

存放路徑:cd %ORACLE_HOME%/network/admin

內容(保證安全,所有IP相關資訊已二次處理):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# listener.ora Network Configuration File: E:\oracle\product\10.2.0\db_1\NETWORK\ADMIN\listener.ora
# Generated by Oracle configuration tools.
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)( KEY = EXTPROC1521))
(ADDRESS = (PROTOCOL = TCP)(HOST =192.168.1.138)(PORT = 1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = E:\oracle\product\10.2.0\db_1)
(PROGRAM = extproc)
(ENVS = "EXTPROC_DLLS=ANY" )
)
(SID_DESC =
( GLOBAL = orcl)
(ORACLE_HOME = E:\oracle\product\10.2.0\db_1)
(SID_NAME = orcl)
)
)
ADR_BASE_LISTENER = E:\oracle

資料庫監聽資訊,原始都是空值:

1
2
3
4
5
6
7
8
9
SQL> show parameter local_listener
NAME TYPE VALUE
------------------------------------ ----------- ---------------------------
local_listener string
SQL> show parameter remote_listener;
NAME TYPE VALUE
------------------------------------ ----------- ---------------------------
remote_listener string
SQL>

2.2 嘗試應用解決方案

2.2.1 停止監聽

lsnrctl stop listener

2.2.2 修改監聽配置檔案


1
2
Add the COST TCP protocol restriction "SECURE_REGISTER_[listener_name] = (TCP)" to the listener.ora.
Match the COST parameter variable listener_name with the name of the listener you are using in the listener.ora, e.g., If your listener name is "LISTENER_PROD" then use SECURE_REGISTER_LISTENER_PROD = (TCP)

實際修改過程:

切換到監聽配置檔案所在路徑:

cd %ORACLE_HOME%/network/admin

直接修改listener.ora檔案,在檔案的末尾新增一行:


1
SECURE_REGISTER_LISTENER = (TCP)

2.2.3 啟動監聽

啟動監聽:


1
lsnrctl start listener

立即註冊動態監聽:


1
SQL> alter system register;

2.2.4 設定local_listener


1
2
alter system set local_listener= '(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST =192.168.1.138)(PORT = 1521)))' scope = both;
show parameter local_listener

2.2.5 檢視監聽服務資訊


1
2
3
4
5
lsnrctl services listener
E:\oracle\product\10.2.0\db_1\network\ADMIN>lsnrctl services listener
LSNRCTL for 32- bit Windows: Version 10.2.0.3.0 - Production on 21-9月 -2016 10:2
2:02
Copyright (c) 1991, 2006, Oracle. All rights reserved.

1
2
3
4
5
6
7
8
9
10
11
12
13
正在連線到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)( KEY =EXTPROC1521)))
服務摘要..
服務 "PLSExtProc" 包含 1 個例程。
例程 "PLSExtProc" , 狀態 UNKNOWN, 包含此服務的 1 個處理程式...
處理程式:
"DEDICATED" 已建立:0 已被拒絕:0
LOCAL SERVER
服務 "orcl" 包含 1 個例程。
例程 "orcl" , 狀態 UNKNOWN, 包含此服務的 1 個處理程式...
處理程式:
"DEDICATED" 已建立:3 已被拒絕:0
LOCAL SERVER
命令執行成功

3.驗證修補情況

3.1 註釋COST規則驗證監聽情況

3.1.1 註釋掉listener.ora檔案的COST規則並重啟監聽


1
Comment the COST rule in listener.ora and restart the listener.

直接修改listener.ora檔案,在之前新增的一行前面加上"#"註釋此行。


1
#SECURE_REGISTER_LISTENER = (TCP)

重啟監聽:


1
2
lsnrctl stop listener
lsnrctl start listener

3.1.2 設定remote_listener後檢視監聽服務資訊

設定remote_listener:


1
2
SQL> alter system set remote_listener= '(ADDRESS = (PROTOCOL = TCP)(HOST =192.168.1.138)(PORT = 1521))' scope=memory;
SQL> show parameter remote_listener

快速動態監聽註冊:


1
SQL> alter system register;

檢視監聽服務資訊,發現有“REMOTE SERVER”字樣,說明此時漏洞存在:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
E:\oracle\product\10.2.0\db_1\network\ADMIN>lsnrctl services listener
 
LSNRCTL for 32- bit Windows: Version 10.2.0.3.0 - Production on 21-9月 -2016 10:4
4:18
 
Copyright (c) 1991, 2006, Oracle. All rights reserved.
 
正在連線到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)( KEY =EXTPROC1521)))
服務摘要..
服務 "PLSExtProc" 包含 1 個例程。
例程 "PLSExtProc" , 狀態 UNKNOWN, 包含此服務的 1 個處理程式...
處理程式:
"DEDICATED" 已建立:0 已被拒絕:0
LOCAL SERVER
服務 "orcl" 包含 2 個例程。
例程 "orcl" , 狀態 UNKNOWN, 包含此服務的 1 個處理程式...
處理程式:
"DEDICATED" 已建立:0 已被拒絕:0
LOCAL SERVER
例程 "orcl" , 狀態 READY, 包含此服務的 2 個處理程式...
處理程式:
"DEDICATED" 已建立:0 已拒絕:0 狀態:ready
LOCAL SERVER
"DEDICATED" 已建立:0 已拒絕:0 狀態:ready
REMOTE SERVER
(DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)( KEY =EXTPROC1521)))
服務 "orclXDB" 包含 1 個例程。
例程 "orcl" , 狀態 READY, 包含此服務的 1 個處理程式...
處理程式:
"D000" 已建立:0 已被拒絕:0 當前: 0 最大: 1002 狀態: ready
DISPATCHER <machine: INSPUR-IRMS-138, pid: 6728>
(ADDRESS=(PROTOCOL=tcp)(HOST=INSPUR-IRMS-138)(PORT=52676))
服務 "orcl_XPT" 包含 1 個例程。
例程 "orcl" , 狀態 READY, 包含此服務的 2 個處理程式...
處理程式:
"DEDICATED" 已建立:0 已拒絕:0 狀態:ready
LOCAL SERVER
"DEDICATED" 已建立:0 已拒絕:0 狀態:ready
REMOTE SERVER
(DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)( KEY =EXTPROC1521)))
命令執行成功

3.2 取消註釋COST規則驗證監聽情況

3.2.1 取消註釋COST規則重啟監聽並快速註冊,驗證監聽服務資訊

去掉監聽檔案末尾行前的“#”號:


1
SECURE_REGISTER_LISTENER = (TCP)

重啟監聽:


1
2
lsnrctl stop listener
lsnrctl start listener

快速註冊動態監聽:


1
SQL> alter system register;

驗證監聽服務資訊,按官檔描述,正常應該沒有“REMOTE SERVER”字樣:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
E:\oracle\product\10.2.0\db_1\network\ADMIN>lsnrctl services listener
 
LSNRCTL for 32- bit Windows: Version 10.2.0.3.0 - Production on 21-9月 -2016 11:0
0:23
 
Copyright (c) 1991, 2006, Oracle. All rights reserved.
 
正在連線到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)( KEY =EXTPROC1521)))
服務摘要..
服務 "PLSExtProc" 包含 1 個例程。
例程 "PLSExtProc" , 狀態 UNKNOWN, 包含此服務的 1 個處理程式...
處理程式:
"DEDICATED" 已建立:0 已被拒絕:0
LOCAL SERVER
服務 "orcl" 包含 2 個例程。
例程 "orcl" , 狀態 UNKNOWN, 包含此服務的 1 個處理程式...
處理程式:
"DEDICATED" 已建立:1 已被拒絕:0
LOCAL SERVER
例程 "orcl" , 狀態 READY, 包含此服務的 1 個處理程式...
處理程式:
"DEDICATED" 已建立:0 已拒絕:0 狀態:blocked
REMOTE SERVER
(DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)( KEY =EXTPROC1521)))
服務 "orclXDB" 包含 1 個例程。
例程 "orcl" , 狀態 READY, 包含此服務的 1 個處理程式...
處理程式:
"D000" 已建立:0 已被拒絕:0 當前: 0 最大: 1002 狀態: ready
DISPATCHER <machine: INSPUR-IRMS-138, pid: 6728>
(ADDRESS=(PROTOCOL=tcp)(HOST=INSPUR-IRMS-138)(PORT=52676))
服務 "orcl_XPT" 包含 1 個例程。
例程 "orcl" , 狀態 READY, 包含此服務的 1 個處理程式...
處理程式:
"DEDICATED" 已建立:0 已拒絕:0 狀態:blocked
REMOTE SERVER
(DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)( KEY =EXTPROC1521)))
命令執行成功
實際發現有“REMOTE SERVER”字樣,但是對應的監聽都是blocked.

3.2.2 檢視監聽日誌

cd %ORACLE_HOME%/network/log

listener.log日誌檔案已經有TNS-01194資訊,跟官檔一致:


1
2
3
4
5
6
7
21-9月 -2016 11:00:23 * (CONNECT_DATA=(CID=(PROGRAM=)(HOST=)( USER =Administrator))(COMMAND=services)(ARGUMENTS=64)(SERVICE=listener)(VERSION=169870080)) * services * 0
21-9月 -2016 11:00:54 * service_register_NSGR * 1194
TNS-01194: 監聽程式命令未到達安全傳輸
21-9月 -2016 11:01:54 * service_register_NSGR * 1194
TNS-01194: 監聽程式命令未到達安全傳輸
21-9月 -2016 11:02:54 * service_register_NSGR * 1194
TNS-01194: 監聽程式命令未到達安全傳輸

 3.2.3 還原remote_listener設定

測試完成,還原remote_listener設定


1
2
alter system set remote_listener= '' scope=memory;
SQL> alter system set remote_listener= '' scope=memory;

3.2.4 檢視監聽服務資訊


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
E:\oracle\product\10.2.0\db_1\network\ADMIN>lsnrctl services listener
LSNRCTL for 32- bit Windows: Version 10.2.0.3.0 - Production on 21-9月 -2016 11:2
2:17
Copyright (c) 1991, 2006, Oracle. All rights reserved.
正在連線到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)( KEY =EXTPROC1521)))
服務摘要..
服務 "PLSExtProc" 包含 1 個例程。
例程 "PLSExtProc" , 狀態 UNKNOWN, 包含此服務的 1 個處理程式...
處理程式:
"DEDICATED" 已建立:0 已被拒絕:0
LOCAL SERVER
服務 "orcl" 包含 1 個例程。
例程 "orcl" , 狀態 UNKNOWN, 包含此服務的 1 個處理程式...
處理程式:
"DEDICATED" 已建立:1 已被拒絕:0
LOCAL SERVER
命令執行成功

4.Reference

•Using Class of Secure Transport (COST) to Restrict Instance Registration (文件 ID 1453883.1)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25469263/viewspace-2642451/,如需轉載,請註明出處,否則將追究法律責任。

相關文章