ATTENTION!!!ORACLE比特幣勒索病毒——處理過程詳解

病毒告警

某客戶核心業務系統中招ORACLE數據庫勒索病毒。 告警日誌出現自動任務執行錯誤,對象被鎖,並出現“你的數據庫已被SQL RUSH Team鎖死  發送5個比特幣到這個地址166xk1FXMB2g8JxBVF5T4Aw1Z5aZ6vSE (大小寫一致) 之後把你的Oracle SID郵寄地址 [email protected]我們將讓你知道如何解鎖你的數據庫”的信息(別發,數據丟失他們找不回來,病毒程序雲和恩墨可以處理)。當時的告警日誌如下:

事件處理

修改job參數,防止病毒程序自啓

alter system set job_queue_processes=0;

殺掉job進程,停止正在運行的病毒程序自動任務

ps -ef |grep j0|grep -v grep|awk '{print $2}'|xargs kill -9

禁用數據庫監聽自啓動,關閉監聽,防止攜帶病毒的客戶端再次連接

srvctl disable listener

srvctl disable scan_listener

srvctl stop listener

srvctl stop scan_listener

殺LOCAL=NO的會話

ps -ef|grep LOCAL=NO|grep -v grep|awk '{print $2}'|xargs kill -9

查找病毒程序

select owner,object_name from dba_objects where object_name like '%FUN9%'

select owner,created,object_name,OBJECT_TYPE from dba_objects where object_name like '%DBMS_CORE%';

select owner,created,object_name,OBJECT_TYPE from dba_objects where object_name like '%DBMS_SYSTEM_INTERNAL%’;

select owner,created,object_name,OBJECT_TYPE from dba_objects where object_name like '%DBMS_SUPPORT%';

 

OWNER                CREATED             OBJECT_NAME                    OBJECT_TYPE

-------------------- ------------------- ------------------------------ -------------------

APPUSER01          2019-05-24 10:58:06 DBMS_CORE_INTERNAL             PROCEDURE

APPUSER01          2019-05-24 10:58:06 DBMS_SYSTEM_INTERNAL             TRIGGER

APPUSER01          2019-05-24 10:58:05 DBMS_SUPPORT_INTERNAL          PROCEDURE

APPUSER01          2019-05-24 10:58:06 DBMS_SYSTEM_INTERNAL           PROCEDURE

APPUSER01          2019-05-24 10:58:06 DBMS_STANDARD_FUN9             PROCEDURE

刪除病毒程序的存儲過程、觸發器

--一般會跟9個空格,最好是通過sql拼湊drop語句

SQL> drop PROCEDURE APPUSER01."DBMS_CORE_INTERNAL         ";

 

Procedure dropped.

 

SQL> drop PROCEDURE "APPUSER01"."DBMS_SYSTEM_INTERNAL         ";

 

Procedure dropped.

SQL> drop PROCEDURE "APPUSER01"."DBMS_SUPPORT_INTERNAL         ";

 

Procedure dropped.

SQL> drop TRIGGER "APPUSER01"."DBMS_SYSTEM_INTERNAL         ";

 

Procedure dropped.

SQL> drop PROCEDURE "APPUSER01"."DBMS_STANDARD_FUN9";

 

Procedure dropped.

在啓動數據庫前,需要將出入病毒的連接IP查找出來加入黑名單,以防再次發生病毒注入。通過監聽日誌查找問題時間段的PLSQL連接

[oracle@host01 trace]$ fgrep "24-MAY-2019 10:5" dd1.log |fgrep "establish" | fgrep "plsql"

24-MAY-2019 10:50:05 * (CONNECT_DATA=(SERVICE_NAME=service1)(CID=(PROGRAM=C:\PLSQL Developer\plsqldev.exe)(HOST=host1)(USER=user1))) * (ADDRESS=(PROTOCOL=tcp)(HOST=10.xx.xx.xx)(PORT=xxx)) * establish * epmjc * 0

24-MAY-2019 10:51:01 * (CONNECT_DATA=(SERVICE_NAME= service1)(CID=(PROGRAM=C:\Program Files\PLSQL Developer\plsqldev.exe)(HOST=host1)(USER=user1))) * (ADDRESS=(PROTOCOL=tcp)(HOST=10.xx.xx.xxx)(PORT=xx)) * establish * epmjc * 0

查找所有節點的監聽日誌,發現疑似攜帶病毒的機器IP有5個,並同時檢查下面ip對應機器上的三方程序是否有異常。

檢查這些機器是否攜帶病毒需要時間,爲了及時恢復應用,將上述5個ip全部加入數據庫黑名單,sqlnet.ora添加配置示例如下

TCP.VALIDNODE_CHECKING=YES

tcp.excluded_nodes=(xxx.xx.xx.xx,xx.xx.xx.xx)

啓動監聽,檢查數據庫(注意:因爲還有job沒有刪除,job_queue_processes仍然爲0),聯繫應用驗證數據一致性和可用性。

 

 

數據丟失

APPUSER01用戶下的表丟失數據,通過數據庫歷史視圖查找數據庫truncate操作

SQL> select * from dba_hist_sqltext where upper(SQL_TEXT) like '%TRUNCATE TABLE%';

 

      DBID SQL_ID                     SQL_TEXT                                                                        COMMAND_TYPE

---------- -------------------------- -------------------------------------------------------------------------------- ------------

2584110390 b1undrf93t007              DECLARE job BINARY_INTEGER := 1; broken BOOLEAN := TRUE; next_date DATE := SYSDA           47

2584110390 48v643w2mr5ax              DECLARE job BINARY_INTEGER := 1; broken BOOLEAN := TRUE; next_date DATE := SYSDA           47

2584110390 9up4qgk4udmq3              DECLARE job BINARY_INTEGER := 1; broken BOOLEAN := TRUE; next_date DATE := SYSDA           47

108 rows selected.

從上面的歷史sql視圖反應,數據庫在注入病毒後,於2019年5月24日11:02分鐘左右病毒程序truncate了約108張表。(小廣告:數據庫中病毒或者數據丟失,可以聯繫雲和恩墨團隊進行專業處理)

 

 

Job的處理

檢查病毒相關job

select count(*) from dba_jobs where schema_user='APPUSER01' and what like '%truncate%';

count出來大概有4kw行,system表空間都要撐滿了

逐條刪除job需要花很多時間,可以使用並行來跑

begin

for i in (select job from dba_jobs

where schema_user='APPUSER01' and  what like '%truncate%' and mod(job,4)=0 )

loop

dbms_ijob.remove(i.job);

end loop;

end;

/

大概跑了20+小時,幹掉了這些病毒程序的job。

Remove操作有點類似delete,基表job$的段空間是沒有收縮的,水位線仍然是4kw的時候那麼高。雖然查詢dba_jobs很慢,但是出於安全考慮沒有降低基表的水位線,但是實測trunc是沒有問題的,可以備份jobs,然後trunc job$,再創建job應該就沒問題。注意:不要使用move,move會使job$上的索引失效,而且基本無法創建索引,也無法創建job。

原因分析

我們檢查了可疑IP中的4個,發現PLSQL中的AfterConnect.sql和login.sql都沒有異常。其中afterconnect.sql的大小應該是0字節,login.sql打開後只有一句註釋“- -Autostart Command Window script ”。如果這兩個文件裏有其他內容,應該懷疑是病毒。

但最後一個IP,沒有在本地,通過360掃描出了病毒程序

在2019年5月24日10:58:05該機器通過攜帶病毒的PLSQL連接到數據庫的APPUSER01用戶,導致了該數據庫被注入勒索病毒,2019年5月24日11:02該病毒程序刪除了APPUSER01下的部分數據,2019年5月27日11:15病毒程序阻止了數據庫會話登陸,拋出勒索比特幣告警信息,從而導致此次業務長時間中斷和數據丟失。

總結與建議

ORACLE比特幣勒索病毒可以追溯到2016年,國內很多用戶的Oracle 數據庫中病毒。時隔3年,勒索病毒似乎捲土重來。

本次故障直接造成業務長時間無法連接數據庫,造成數據永久丟失,原因就是不安全的PLSQL連接到了核心庫。

幾乎絕大多數客戶端工具,在訪問數據庫時,都可以通過腳本進行一定的功能定義,而這些腳本往往就是安全問題的漏洞之一,來歷不明的工具是數據庫管理大忌。通過此次數據庫勒索病毒事件可以看出,數據庫安全的重要性,不要抱着“不會發生在我身上”的想法管理數據庫,一切都是命運的安排。

爲了防止勒索病毒不再發生,提高數據安全性,建議如下:

1.嚴格管理權限。回收所有業務用戶的dba權限,在保障數據安全和應用可用的前提下,提供用戶最小權限。

2.排查三方工具。大範圍排查是否還可能有不明來源的第三方工具連接數據庫,必須從官方渠道獲取客戶端連接工具。以下列出了常見客戶端工具的腳本位置,需要引起注意

SQL*Plus: glogin.sql / login.sql

TOAD : toad.ini

PLSQLdeveloper: login.sql / afterconnect.sql

3.通過官方渠道下載補丁包。補丁包中也可能包含病毒程序,下載官方補丁包是基本規範操作。

4.設置白名單。限制IP登錄,非白名單中的IP不允許登錄數據庫,提高數據的安全性。

5.日常巡檢。把病毒掃描腳本加入日常巡檢中,早發現早處理。(小廣告,恩墨白求恩產品可以檢查出數據庫是否帶病毒,免費!(https://bethune.enmotech.com)

6.開啓數據庫審計。數據庫審計在跟蹤用戶操作上更加全面,審計會捕獲用戶登錄數據庫及登錄後的各項操作

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章