案發現場:被注入的軟體及 ORA-600 16703 災難的恢復
最近幫助一個客戶恢復資料庫,遇到了如下這個問題。讓我們再一次驚醒於數據安全,如果不做好防範,問題總是會來得猝不及防。
客戶在嘗試啟動資料庫時,是這樣一個 ORA-600 錯誤映入眼帘,反覆重試無法消除問題,歷史備份,同樣存在問題,客戶毫無防範的,陷入一場資料庫災難:
SQL*Plus: Release 11.2.0.4.0 Production on Fri Jul 20 22:12:34 2018
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Connected to an idle instance.
SQL> startup mount;
ORACLE instance started.
Database mounted.
SQL> alter database open;
alter database open
*
ERROR at line 1:
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: 1236
Session ID: 1 Serial number: 5
按照我的思路,第一步是啟用 10046 跟蹤一下問題的出現位置:
從跟蹤文件中,可以找到如下信息,最後執行的是 obj$ 的對象訪問,綁定變數傳入值是 20 ,
PARSING IN CURSOR #605191324len=188 dep=1 uid=0 oct=1 lid=0 tim=77597981 hv=4006182593 ad="23987650" sqlid="32r4f1brckzq1"
create table bootstrap$ (
END OF STMT
PARSE #605191324:c=0,e=372,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,plh=0,tim=77597979
EXEC #605191324:c=0,e=78,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=4,plh=0,tim=77598086
CLOSE #605191324:c=0,e=4,dep=1,type=0,tim=77598125
在這個遞歸過程中,取得所有引導資料庫啟動所需SQL,然後再順序載入內容,完成內存初始化。
最後出現錯誤之處是 20 號對象,在資料庫中是 ICOL$ 對象:
SQL> select object_name from dba_objects where object_id=20;
OBJECT_NAME
--------------------------------------------------------------
ICOL$
在 bootstrap$ 中,可以找到這條記錄,在初始化這個對象的過程中,資料庫在 TAB$ 中找不到這條記錄,就出現了 16703 的錯誤:
CREATE TABLE ICOL$("OBJ#" NUMBER NOT NULL,"BO#" NUMBER NOT NULL,"COL#" NUMBER NOT NULL,"POS#" NUMBER NOT NULL,"SEGCOL#" NUMBER NOT NULL,"SEGCOLLENGTH" NUMBER NOT NULL,"OFFSET" NUMBER NOT NULL,"INTCOL#" NUMBER NOT NULL,"SPARE1" NUMBER,"SPARE2" NUMBER,"SPARE3" NUMBER,"SPARE4" VARCHAR2(1000),"SPARE5" VARCHAR2(1000),"SPARE6" DATE) STORAGE (OBJNO 20 TABNO 4) CLUSTER C_OBJ#(BO#)
在進程的轉儲文件中,也可以看懂對於 TAB$ 的遞歸訪問,綁定變數是 20 :
再來看看 ORA-600 錯誤,幾個參數含義如下:1403 指記錄未發現;20 指對象號:
ORA-00600: internal error code, arguments: [16703], [1403], [20], [], [], [],
[], [], [], [], [], []
$ 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.
所以,現在問題很清楚了,是因為 20 號對象遞歸時找不到,這是被惡意刪除了。
這就是此前曾經被披露的,資料庫安裝介質被注入的問題,惜分飛曾經記錄過這個問題。
強烈警示:在下載Oracle安裝介質時,一定要從可靠來源下載,Oracle 官網是最佳途徑。當從未知來源獲得安裝軟體時,你就可能面臨著注入風險。這一次的客戶就是遭遇到了這個問題的威脅。
※觸類旁通:那些關於 TBL$OR$IDX$PART$NUM 的詭異案例和知識
TAG:雲和恩墨 |