以神奇寶貝月精靈為名的 Umbreon Rootkit , 攻擊 x86 和 ARM 處理器的 Linux 系統
趨勢科技前瞻威脅研究 (FTR) 團隊最近取得了一個新的 Rootkit家族樣本。此 Rootkit 家族的名字叫做「Umbreon」(與第 197 號神奇寶貝「月精靈」同名),會攻擊 Intel 和 ARM 處理器的 Linux 系統,因此一些內嵌式裝置也可能遭殃。(註:此 Rootkit 還真符合這隻神奇寶貝的特性,因為月精靈喜歡躲在黑漆漆的夜裡,所以與 Rootkit 的特性吻合。)
我們已針對這個 Rootkit 進行了詳細分析,並且將樣本提供給業界來協助資安界攔截此威脅。
編按: Rootkit是一種技術,用途在修改系統核心以便隱藏特定的檔案或是處理程序,甚至是登錄值.也因此常常會被病毒拿來利用作為躲避追查的手法之一
Umbreon 的發展始於 2015 年初,但其作者至少從 2013 年起即活躍於網路犯罪地下網路。根據一些駭客在地下論壇和 IRC 頻道上的說法,Umbreon 非常難以偵測。我們的研究已找出該 Rootkit 的運作方式以及它如何躲藏在 Linux 系統當中。
Umbreon 是經由駭客手動安裝到受害裝置或伺服器上。安裝之後,駭客即可經由該程式來遙控受害裝置。
何謂 Ring 3 Rootkit?
Rootkit 是一種難以偵測及發現的持續性威脅。它的功用就是要讓自己 (與其他惡意程式) 能夠躲過系統管理員、資安分析師、使用者、掃瞄引擎、鑑識分析以及系統工具的偵測。此外,它也可用來開啟一道後門,或者透過幕後操縱 (C&C) 伺服器讓駭客從遠端暗中遙控及監控受害機器。
這類程式有幾種執行模式,分別具備不同的存取權限:
- 使用者模式 (Ring 3)
- 核心模式 (Ring 0)
- 虛擬化監管程式 (Hypervisor) 模式 (Ring -1)
- 系統管理模式 (SMM) (Ring -2)
此外,一些研究也發展出一種在主機板或其他裝置的某些晶片上執行的 Rookit,這類 Rootkit 的執行模式為 Ring -3。在越底層執行的 Rootkit 就越難偵測及處理,但這並不表示 Ring 3 的 Rootkit 就很容易清除。
Ring 3 (也就是在使用者模式執行的) Rootkit 雖不會在系統上安裝一些系統核心物件,但卻會攔截 (hook) 系統的核心函式庫,這些函式庫是一般程式呼叫系統重要功能的介面,例如:讀/寫檔案、產生執行程序、傳送網路封包。因此,就算是在使用者模式下執行,這類 Rootkit 也可能有辦法監控甚至改變作業系統的運作。
在 Linux 系統上,當某個程式呼叫 printf() 這個函式時,該函式會再呼叫同一函式庫內一連串的其他函式,如:_IO_printf() 和 vprintf()。而這些函式最終會呼叫 write() 這個系統呼叫 (syscall)。一個 Ring 0 的 Rootkit 會直接在核心模式下攔截這個系統呼叫 (但這需要在系統當中插入核心物件/模組),反觀一個 Ring 3 的 Rootkit 只需攔截使用者模式下的某些中間函式,不需撰寫核心模式下的原生程式碼 (因為這有相當的難度)。
跨平台功能
Umbreon 可在三個不同平台上執行:x86、x86-64 和 ARM (Raspberry Pi)。這套 Rootkit 的可攜性非常高,因為它並未用到任何綁定平台的程式碼:這套 Rootkit 除了一些輔助工具是以 Python 和 Bash 等腳本語言撰寫之外,純粹是以 C 語言撰寫。
趨勢科技判斷作者應該是刻意這麼做,好讓 Umbreon輕鬆支援前述三種平台。
後門認證機制
Umbreon 在安裝過程當中會在 Linux 系統上建立一個使用者帳號讓駭客經由後門進出受害的系統。這個後門帳號可經由 Linux 支援的任何認證機制 (如 SSH) 來存取,只需透過一個外掛的認證模組 (PAM) 即可。
該使用者帳號的群組識別碼 GID (group ID) 很特別,因此可讓 Rootkit 判斷試圖經由它進入系統的是不是駭客本人。由於 Umbreon 已攔截了 libc 函式庫內的函式,因此系統管理員無法在 /etc/passwd 檔案中看到這個使用者帳號。下圖顯示透過 SSH 來存取此後門帳號時會看到的畫面:
圖 1:SSH 登入畫面。
Espeon 後門元件
這是一個以 libpcap 網路流量擷取函式庫為基礎所開發的後門程式,採用 C 語言撰寫,當使用者連上它並通過認證之後,就會進入一個指令列介面 (shell)。(同樣地,Espeon 也一隻神奇寶貝的名稱,中文叫「太陽精靈」)。駭客可指示 Espeon 建立一個對外連線到駭客的電腦,形成一種反向的指令列介面,如此便可穿透防火牆的阻擋。
Espeon 會擷取受害電腦主要乙太網路介面所收到的所有 TCP 流量。一旦它收到含有特定欄位值的特殊 TCP 封包時,就會連線至該 TCP 封包的來源 IP 位址。以下是 Espeon 所監控的欄位值 (16 進位):
- SEQ (序號):0xc4
- ACK (回授碼):0xc500
- IP ID (識別碼):0x0fb1
駭客會在封包的這些欄位當中設好對應的數值,然後將封包發送至受害的電腦。當後門程式發現欄位數值吻合的封包時,就會建立連線至該封包的來源 IP 位址。以下是 got_packet() 函式解譯後的程式碼,圖中顯示的正是這段數值比較的動作:
圖 2:程式碼範例。
隱藏預先載入的設定檔以防止系統呼叫被追蹤
系統呼叫追蹤 (syscall trace) 是 strace 這個 Linux 熱門指令列工具所用的一種技巧。該程式會透過 ptrace() 系統呼叫來檢查某執行檔案所做的系統呼叫之參數與回傳值。由於 Umbreon 利用了一個名為「/etc/ld.so.<random>」的檔案來指示系統的程式載入器在載入其他 ELF 函式庫之前先將它載入,因此它能夠攔截 vprintf()、__vfprintf_chk() 和 fputs_unlocked() 等函式來讓使用 strace 的系統管理員看不到它的資料,因為各家系統上的 strace 都是使用這些函式來將結果輸出到某個檔案。下圖顯示 strace.so 元件中的 vprintf() 程式碼:
圖 3:程式碼範例。
wrapper_200da0_6b0 最後會呼叫 strstr() 函式。此處系統預先載入的檔案是「/etc/ld.so.NfitFd2」 (Rootkit 的版本),所以任何傳入 vprintf() 函式的資料當中若包含這串文字,都會被替換成「/etc/ld.so.preload」(正常版本)。因此,分析人員會以為程式載入的檔案是後者,因此看不出異樣。下圖顯示此函式看到的字串:
圖 4:程式碼範例。
此元件還會修改 LD_PRELOAD 環境變數,讓資安分析人員無法攔截惡意的函式。
隱藏封包
除此之外,Umbreon 還會攔截 libpcap 函式庫當中的 got_packet() 和 pcap_loop() 兩個函式,讓這些函式在遇到連接埠位於其設定檔指定範圍內的封包時,不要傳回任何 TCP 封包資訊。如此一來,當資安分析人員在受害的電腦上使用 tcpdump 這類網路流量擷取工具時,根本無法看到後門程式的流量。
Umbreon 程式的實作
Umbreon 基本上扮演了類似 glibc (GNU C 函式庫) 的角色。它會在系統產生一個叫做「/etc/ld.so.<random>」的檔案,根據 Linux 系統說明文件,該檔案的功能如下:
/etc/ld.so.preload 檔案內含一個以空白分隔的清單,記載著要在程式之前預先載入的 ELF 共用物件。
原本,ELF 載入器要載入的檔案應該是「/etc/ld.so.preload」。但 Umbreon 也會修改載入器的函式庫 (如:「/lib/x86_64-linux-gnu/ld-2.19.so」即是其中之一),讓它載入「/etc/ld.so.<random>」檔案,<random> 部分是一串 7 個字元的亂數,與「preload」的長度相同。
此檔案當中所列的每個函式庫,都會在任何其他 ELF 程式啟動之前預先載入系統。因此 Umbreon才會將它自己的主函式庫列在該檔案內,而函式庫內即含有與 glibc 內的函式名稱相同的函式。Umbreon的主函式庫位於下列路徑:
- /usr/share/libc.so.<random>.${PLATFORM}.ld-2.22.so
${PLATFORM} 部分隨系統的架構而異,有下列幾種可能:
- /usr/share/libc.so.<random>.v6l.ld-2.22.so (ARM)
- /usr/share/libc.so.<random>.x86_64.ld-2.22.so (x86-64)
- /usr/share/libc.so.<random>.i686.ld-2.22.so (x86)
不過,由於 Umbreon 是透過手動方式安裝到目標電腦上,因此其路徑也有可能與上述不同。Umbreon 主函式庫當中實作的函式如下:
- __fxstat
- __fxstat64
- __lxstat
- __lxstat64
- __syslog_chk
- __xstat
- __xstat64
- access
- audit_log_acct_message
- audit_log_user_message
- audit_send
- chdir
- check_and_fix_ldso
- checkpw
- chmod
- chown
- cleanup
- dlinfo
- dlsym
- esh
- execve
- execvp
- fake_preload_fail
- fchmod
- fchown
- fchownat
- fdopendir
- filesize
- find_dlsym
- find_sym
- fopen
- fopen64
- fstat
- fstat64
- get_hideports
- get_my_procname
- get_procname
- getpath
- getpgid
- getpriority
- getpwnam
- getpwnam_r
- getpwuid
- getsid
- getspnam
- is_dynamic
- is_hideport
- is_ldso32
- is_ldso64
- is_really
- kill
- lchown
- link
- login
- lstat
- lstat64
- netstat
- open
- open64
- openat
- opendir
- pam_acct_mgmt
- pam_authenticate
- pam_open_session
- pam_prompt
- pam_vprompt
- pcap_loop
- procstatus
- procstatus_o
- pututline
- pututxline
- rclocal
- read
- readdir
- readdir64
- readlink
- recover_dirname
- recover_filename
- reinstall_self
- rename
- rmdir
- sched_getaffinity
- sched_getparam
- sched_getscheduler
- sched_rr_get_interval
- setgid
- setregid
- setresgid
- socket
- spoof_maps
- spoof_smaps
- stat
- stat64
- sxor
- symlink
- sysinfo
- syslog
- unfuck_linkmap
- unlink
- unlinkat
- write
上述函式當中有許多都是 libc 內出現的函式。當某個執行檔啟動時,由於 Umbreon 的函式庫的載入順序會比任何其他使用者函式庫更早,因此程式載入器會將這些函式對應到 Umbreon 函式庫中的函式,而非 libc 當中的函式。藉由這樣的方式,Umbreon 就能自然而然讓執行檔呼叫其惡意的函式而不自知。
但這些惡意函式只是空殼,當程式呼叫它們時,它們會先檢查程式傳來的參數資料,然後再呼叫系統函式庫中真正做事的函式。同樣地,每個系統指令的輸出結果都可能已遭到這些函式修改之後才顯示在使用者面前。基本上,這類似所謂的「中間人攻擊」,系統函式的輸入和輸出事實上都會遭到竄改。所以,使用者不能相信某些系統指令所輸出的內容,例如:ps、ls、top 與 pstree 等等。因為這些指令都用到了 libc 當中的函式,所有輸出結果都已遭竄改。
如何偵測 Umbreon
Linux 系統當中絕大多數的工具都是用 C 語言撰寫。甚至一些使用 Perl、Python、Ruby、PHP 和其他腳本語言所撰寫的程式,最後還是呼叫經過包裝的 GNU C 函式,因為這些腳本語言的解譯器也是用 C 語言撰寫。正因為 Umbreon 的函式庫會攔截 libc 的函式,因此,要製作一個能夠偵測 Umbreon 的可靠工具,就不能用到 libc 函式庫。
有一個方法可以寫出可列出 Umbreon Rootkit 預設目錄內容的小工具,那就是直接使用 Linux 核心的系統呼叫。這樣就能避開 Umbreon 在系統上安裝的任何 C 函式庫。一旦該工具列出任何以「libc.so 」字樣開頭然後跟著一串隨機整數字串結尾的檔案名稱,那就是系統可能感染 Umbreon 的徵兆。
此外,我們也建立了一組 YARA 規則來偵測 Umbreon,請至這裡下載。
Rootkit 清除步驟
Umbreon 是一個 Ring 3 (使用者層級) 的 Rootkit,因此是有辦法可以清除的。不過還是有點麻煩,而且經驗不足的使用者可能會不小心毀了系統,讓系統無法復原。若您有足夠的勇氣想試試看的話,最簡單的方法是使用 Linux LiveCD 來重新開機,然後依照下列步驟執行:
- 掛載 /usr 目錄所在的硬碟分割 (需要寫入權限)。
- 在進行任何變更之前,先備份所有檔案。
- 移除「/etc/ld.so.<random>」檔案。
- 移除「/usr/lib/libc.so.<random>」目錄。
- 復原所有「/usr/share/libc.so.<random>.<arch>.*.so 檔案的屬性,然後將它們也全數移除。
- 修正程式載入器使用的函式庫,恢復成原來使用的/etc/ld.so.preload。
- 卸載硬碟分割,然後將系統正常重新開機。
以下是一個真實的清除步驟範例 (請注意,檔案名稱不一定和您看到的相同,因為這些亂數碼是惡意程式產生的)。在下面的範例中,/dev/sda1 是 /usr 目錄所在的磁碟分割。
# mount /dev/sda1 /mnt
# rm -f /mnt/etc/ld.so.khVrkEQ
# rm -rf /mnt/usr/lib/libc.so.41762810374176281037/
# chattr -ai /mnt/usr/share/libc.so.4176281037.*
# rm -f /mnt/usr/share/libc.so.4176281037.*
# sed -i ‘s:/etc/ld\.so\.khVrkEQ:/etc/ld.so.preload:’ /lib/x86_64-linux-gnu/ld-2.19.so
# umount /mnt
# reboot
在此範例中,使用 chattr 指令是必要的步驟,因為 Umbreon 函式庫的檔案屬性設定了「a」(只能追加) 和「i」(不可修改) 屬性。
入侵指標資料
以下是與此威脅相關的檔案樣本:
- b5e68f8e23115bdbe868d19d09c90eb535184acd — /.bashrc
- 73ddcd21bf05a9edc7c85d1efd5304eea039d3cb — /bin/pkg
- 48a6e43af0cb40d4f92b38062012117081b6774e — /bin/espeon-shell (detected as BKDR_UMREON.A)
- 88aea4bb5e68c1afe1fb11d55a190dddb8b1586f —/bin/unhide-self
- 73ddcd21bf05a9edc7c85d1efd5304eea039d3cb — /bin/zypper and ./bin/emerge
- 42802085c28c0712ac0679c100886be3bcf07341 — /bin/umbreon.py
- 66d246e02492821f7e5bbaeb8156ece44c101bbc — /bin/espeon (detected as ELF_UMREON.A)
- 73ddcd21bf05a9edc7c85d1efd5304eea039d3cb —/bin/yum
- 4f6c6d42bdf93f4ccf68d888ce7f98bcd929fc72 — /bin/spytty
- 73ddcd21bf05a9edc7c85d1efd5304eea039d3cb — /bin/apt-get
- 1f1ab0a8e9ec43d154cd7ab39bfaaa1eada4ad5e — /bin/.x
- 81ad3260c0fc38a3b0f65687f7c606cb66c525a8 — /.init-append
- 7b10bf8187100cdc2e1d59536c19454b0c0da46f — /.umbreon-ascii
- 96d5e513b6900e23b18149a516fb7e1425334a44 — /.profile
- 851b7f07736be6789cbcc617efd6dcb682e0ce54 — /usr/share/libc.so.2284441204.i686.ld-2.22.so (detected as ELF_UMREON.A)
- e2bc8945f0d7ca8986b4223ed9ba13686a798446 — /usr/share/libc.so.2284441204.x86_64.ld-2.22.so (detected as ELF_UMREON.A)
- 17b42374795295f776536b86aa571a721b041c38 — /.ldso/strace.so (detected as ELF_UMREON.A)
- 394fae7d40b0c54c16d7ff3c3ff0d247409bd28f —/promptlog
- 738ac5f6a443f925b3198143488365c5edf73679 —/hideports
- 022be09c68a410f6bed15c98b63e15bb57e920a9 — espeon (ARM version, detected as ELF_UMREON.B)
- 3762c537801c21f68f9eac858ecc8d436927c77a — pkg (ARM version, detected as ELF_UMREON.B)
- 2cd24c5701a7af76ab6673502c80109b6ce650c6 — strace.so (ARM version, detected as ELF_UMREON.B)
- 358afd4bd02de3ce1db43970de5e4cb0c38c2848 — umbreon.so (ARM version, detected as ELF_UMREON.B)原文出處: Pokémon-themed Umbreon Linux Rootkit Hits x86, ARM Systems 作者:Fernando Mercês (資深威脅研究員)