F2FS 檔案系統漏洞可能導致 Android 和 Linux 記憶體資料損毀

Android 八月份安全性公告包含了三個趨勢科技研究人員發現的檔案系統漏洞 (CVE-2017-10663CVE-2017-10662CVE-2017-0750)。這些漏洞可能造成裝置記憶體中的資料損毀,讓惡意程式在系統核心內執行惡意程式碼,進而存取並掌握更多資料。歹徒可利用惡意程式來掛載一個 F2FS (Flash-Friendly File System) 格式的磁碟來觸發這項漏洞,這個磁碟可以是實體磁碟或虛擬磁碟映像。

F2FS 是一種專門針對快閃記憶體 (NAND) 裝置 (如隨身碟) 而最佳化的檔案系統。任何可掛載 F2FS 檔案系統的裝置都存在這項潛在風險。就 Android 而言,最危險的是那些預設使用 F2FS 檔案系統的裝置,例如:Motorola、Huawei 和 OnePlus 的手機,因此有數以百萬計的用戶都可能遭駭。不過,這項攻擊技巧要能成功,駭客必須先駭入某個具備檔案系統掛載權限的執行程序才行。

至於 Linux,問題就更加嚴重。Linux 核心從 2013 年發表的 3.8 版起就開始支援 F2FS 檔案系統。因此,該版本之後的所有 Linux 裝置都存在這項潛在危險。只不過,並非所有 Linux 發行版本都會預設啟用 F2FS 功能。而那些在插入 USB 隨身碟時會自動掛載該磁碟的裝置風險最高,因為駭客只需將一個含有 F2FS 漏洞攻擊程式的隨身碟插入系統就能觸發這項漏洞。

技術細節

這項漏洞出在讀取 F2FS 檔案系統結構的程式碼:駭客只要在含有漏洞的系統上使用 losetup 來掛載一個惡意的磁碟或本地端磁碟映像檔,即可造成系統記憶體資料損毀,進而讓惡意程式在系統核心內部執行惡意程式碼。前面發布的三項漏洞都可能讓惡意程式寫入正常範圍之外的記憶體,促使系統執行其惡意程式碼。

第一個漏洞 (CVE-2017-10663) 的形成原因是某行原始程式碼沒有做好適當的緩衝區邊界檢查:

__set_sit_entry_type(sbi, type, curseg->segno, modified);

這行程式碼中的 curseg->segno 呼叫可能因為型態不正確而導致資料寫超出緩衝區的範圍之外。

第二個漏洞 (CVE-2017-10662) 是一個整數溢位漏洞:

sit_i->sentries = vzalloc(MAIN_SEGS(sbi) * sizeof(struct seg_entry));

在一個 32 位元作業系統上,MAIN_SEGS(sbi) * sizeof(struct seg_entry) 這段程式碼計算出來的數值可能大於 32 位元正整數可表示的數值,反而讓該數值回過頭來變成一個很小的數字,導致系統配置的記憶體緩衝區太小。接著,當程式碼寫入緩衝區時,就可能超出緩衝區的邊界。

第三個漏洞 (CVE-2017-0750) 同樣也是程式碼未做好適當緩衝區邊界檢查而造成。此問題已在 Linux 核心 4.4.73 版當中修正,加入了以下檢查:

/* check log blocks per segment */
if (le32_to_cpu(raw_super->log_blocks_per_seg) != 9) {
f2fs_msg(sb, KERN_INFO,
“Invalid log blocks per segment (%u)\n”,
le32_to_cpu(raw_super->log_blocks_per_seg));
return 1;
}

然而,絕大多數的 Android 裝置都早於這個版本,因此其程式碼仍有寫出緩衝區之外的漏洞:

last_offset = sbi->blocks_per_seg;
addr = START_BLOCK(sbi, segno);
sum_entry = &sum->entries[0];
for (i = 0; !err && i < last_offset; i += nrpages, addr += nrpages) {
nrpages = min(last_offset – i, bio_blocks);
/* readahead node pages */
nrpages = ra_sum_pages(sbi, pages, addr, nrpages);

因應對策

對於桌上型電腦或伺服器使用者來說,只要升級至最新版本的 Linux 核心即可修正上述漏洞。當然,系統管理員也可自行重新組譯 Linux 核心,或者等到其使用的 Linux 發行版本釋出更新。同時,我們也建議使用者在掛載 F2FS 格式的裝置時要特別小心。

就行動裝置而言,預設使用 F2FS 檔案系統的裝置所面臨的風險最大,因此使用者在下載應用程式到裝置上時要格外小心,因為如果遇到惡意應用程式,它可能會挾帶一個虛擬磁碟映像檔,然後將該磁碟掛載到系統上來觸發前述漏洞。除此之外,使用者可也安裝趨勢科技行動安全防護 (TMMS) 來偵測攻擊上述漏洞的應用程式。