Oracle軟件的安裝介質被注入惡意程序事件分析與防禦

由於傳播、利用此文所提供的信息而造成的任何直接或者間接的後果及損失,均由使用者本人負責,雷神眾測以及文章作者不為此承擔任何責任。雷神眾測擁有對此文章的修改和解釋權。如欲轉載或傳播此文章,必須保證此文章的完整性,包括版權聲明等全部內容。未經雷神眾測允許,不得任意修改或者增減此文章內容,不得以任何方式將其用於商業目的。

No.2

前言

去年分析過Oracle比特幣勒索事件,通過在各大下載平臺上傳惡意pl/sql安裝包。詳細鏈接如下:

http://greatagain.dbappsecurity.com.cn/#/book?id=196&type_id=1

接下來分析的事件與上述事件類似,但又有不同。

同時在各下載平臺上傳Oracle軟件的安裝介質,從而替換惡意文件prvtsupp.plb,達到實現了惡意代碼的注入,從而實現了數據庫300天之後重啟之後無法正常啟動而是出現類似ORA-00600: internal error code, arguments: [16703], [1403], [20], [], [], [], [], [], [], [], [], []的錯誤。

No.3

故障現象

客戶對數據庫進程重啟,重啟之後數據庫就無法啟動,後臺alert日誌就報ORA-00600 [16703]錯誤。

Oracle軟件的安裝介質被注入惡意程序事件分析與防禦

進一步通過10046分析,可以發現數據庫在啟動過程中訪問tab$和I_OBJ$的時候出現了問題。

Oracle軟件的安裝介質被注入惡意程序事件分析與防禦

No.4

故障原理

通過分析,發現和最近爆發的Oracle安裝介質被注入惡意代碼有關。

檢查Oracle數據庫安裝目錄,發現文件prvtsupp.plb文件正常和異常的多出來下面的代碼:

正常的:

Oracle軟件的安裝介質被注入惡意程序事件分析與防禦

異常的:

Oracle軟件的安裝介質被注入惡意程序事件分析與防禦

可以看到異常的安裝介質包中$ORACLE_HOME/rdbms/admin/prvtsupp.plb被人注入了多餘的代碼,創建了一個startup觸發器,當數據庫重啟的時候,就會觸發該動作。該動作會去執行一個叫DBMS_SUPPORT_DBMONITORP的存儲過程。該存儲過程是加密的存儲過程。使用解密工具可以查看到該存儲過程的內容,如下:

Oracle軟件的安裝介質被注入惡意程序事件分析與防禦

可以看到這段代碼的內容就是當系統的當前日誌>創建日期300天,就創建一個叫ORACHK開頭的表對sys.tab$執行備份。同時再刪除sys.tab$表。

這段代碼是毀滅性的,數據庫重啟之後就把基表tab$刪除了。再也啟動不了。

No.5

解決辦法

目前解決辦法有兩種:

1.通過bbed來恢復,這種恢復方法相當複雜。可以看到病毒對tab$表做了備份,可以通過bbed來讀到ORACHK表中的塊的數據,然後在還原到tab$表中的數據塊上。

EXECUTE IMMEDIATE 'create table ORACHK'||SUBSTr(SYS_GUID,10)||' tablespace system as select * from sys.tab$';

2.通過DUL等抽取工具來抽取。數據量大非常耗費時間。

3.使用備份的system.dbf文件強行推進scn打開數據庫,然後把數據導出來。

alter system set

"_system_trig_enabled"=false scope=both;

alter database open ;

drop TRIGGER

DBMS_SUPPORT_DBMONITOR;

drop PROCEDURE

DBMS_SUPPORT_DBMONITORP;

No.6

預防措施

1.根據軟件注入的原理,需要檢查文件$ORACLE_HOME/rdbms/admin/prvtsupp.plb,看看是否裡面包含多餘的創建觸發器的代碼。如果存在,需要將問題觸發器和存儲過程刪除。

2.檢查是否包含觸發器

DBMS_SUPPORT_DBMONITOR和存儲過程

DBMS_SUPPORT_DBMONITORP。

定期監控語句更新如下:

select 'DROP TRIGGER

'||owner||'."'||TRIGGER_NAME||'";'

from dba_triggers where

TRIGGER_NAME like

'DBMS_%_INTERNAL% '

or TRIGGER_NAME like

'DBMS_SUPPORT_DBMONITOR% '

union all

select 'DROP PROCEDURE

'||owner||'."'||a.object_name||'";'

from dba_procedures a

where a.object_name like

'DBMS_%_INTERNAL% ' or

a.object_name like

'DBMS_SUPPORT_DBMONITOR% ';

參考:http://www.xifenfei.com/2017/07/oracle-software-malicious-injection.html


分享到:


相關文章: