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


分享到:


相關文章: