Trend Micro 把這個部落格標記為 Disease Vector——鎖定確切 URL 重新分類後解決了

Trend Micro 的 Site Safety Center 把這個部落格的 Service Worker 判定為 Disease Vector。交叉比對另外五個服務並重新分類確切網址後解決了。

接近黑色的卡片上有白色 PWA 標誌,P、W、A 共用筆畫,連成一體的稜角字樣
本頁目錄

引言

我自己也在用 Trend Micro,所以搜尋結果旁的標記我一向會多看一眼。某天我在 Google 的搜尋結果發現這個部落格被標記為灰色,而不是我平常熟悉的安全綠色標記。

兩則 oharu tech blog 的 Google 搜尋結果,每則列表旁都顯示灰色圓形問號標記,而不是綠色勾勾

我想要的是綠色勾勾,於是把網域提交給 Trend Micro 的 Site Safety Center 申請重新分類, 結果卻比原本更糟糕,評等變成 Dangerous,內容類型被歸類為 Disease Vector。

Trend Micro Site Safety Center 寄來的郵件,顯示 oharu121.com 的重新分類結果:新的安全評等為 Dangerous,新的內容類型為 Disease Vector

兩則 oharu tech blog 的 Google 搜尋結果,皆以紅色標示,顯示紅色 X 圖示,而不是綠色勾勾或灰色問號

這篇文章記錄了後續的調查過程,以及最終把評等改回 Safe 的解決方法。

實測結果:91 家廠商中有 0 家判定為惡意

在繼續調查之前,我想先確認網站是否真的遭到入侵,於是把 https://oharu121.com/ 丟進 VirusTotal 檢查,它會一次比對 91 家獨立的資安廠商。結果每一家都判定為乾淨:91 家中有 0 家認為有問題。

oharu121.com 的 VirusTotal 報告,社群分數為 91 分之 0,列出的每家資安廠商都顯示「Clean」

這解答了一個疑問,卻帶出另一個更棘手的問題:為什麼只有 Trend Micro 的判定跟其他所有 服務都不一樣。

逐一檢查其他分類服務:Google、Trellix、McAfee 與 Microsoft

VirusTotal 的 91 家廠商都是惡意程式掃描引擎,跟會在搜尋結果旁顯示標記的信譽與分類資料庫 (Trend Micro 的 Site Safety Center 也是其中之一)並不是同一回事。這些服務跑在各自獨立 的基礎架構上,審核流程也各不相同。所以我一家一家分別去查。

Google Safe Browsing

Google Safe Browsing 決定了 Chrome、Firefox 與 Safari 顯示的警告頁面,對一般訪客來說 影響最大,而 Search Console 的安全性問題報告與公開的 Transparency Report,兩者的結果 一致:沒有偵測到問題,也沒有發現不安全的內容。

Google Transparency Report 的 Safe Browsing 網站狀態頁面,顯示 oharu121.com 目前狀態為「未發現不安全內容」

Trellix 與 McAfee:分家後的兩個資料庫

McAfee 的網頁信譽資料庫 以前只有這一個,但在 2024 年企業版部門獨立成 Trellix 之後,就不再跟 消費版的 McAfee 品牌共用資料,因此查了其中一邊,並不代表另一邊也是同樣的判定。

Trellix 的 TrustedSource 把這個網域標記為「Uncategorized URL」,風險等級「Medium Risk」,而分家後獨立出來的 McAfee 自家 Site Lookup,則顯示「Uncategorized」,信任等級 「Unverified」。兩邊都沒有判定為危險,但也都完全沒有這個網域的資料。

Trellix TrustedSource 的 Customer URL Ticketing System 畫面,顯示 oharu121.com 為「Uncategorized URL」,信譽為「Medium Risk」

Trellix 的資料庫。

McAfee 的 Customer URL Ticketing System 畫面,顯示 oharu121.com 為「Uncategorized URL」,信任等級為「Unverified」

McAfee 獨立出來的資料庫,不受上方 Trellix 結果影響。

Microsoft SmartScreen:沒有主動申請的管道

Microsoft 的檔案提交入口一開始看起來像是正確的申請管道,但 wdsi/filesubmission 是設計來 分析執行檔惡意程式的,而不是拿來分析給網址用的。

網站回報表單其實是針對使用者已經看過的警告所設計的申訴機制,沒有任何管道可以主動請 Microsoft 為一個還沒被標記的網站背書,證明它可信。

SmartScreen 本身的信譽是被動累積的,依據網域註冊時間、憑證有效性與爬取歷史而定,所以 既沒有東西可以申訴,也沒有管道可以提交。

自動掃描工具眼中的 Service Worker

前面的檢查都沒能解釋為什麼只有 Trend Micro 把這個部落格標記成危險網站。於是我去分析了離線 閱讀功能背後的程式碼:Service Worker 本身,以及它的註冊腳本。

fetch 處理常式在做任何事之前,會先過濾出同源請求:

scripts/sw/service-worker.js
if (url.origin !== self.location.origin) return;

這段程式碼完全不會呼叫第三方伺服器、注入腳本,也不會執行 eval,只會快取網站自己的 頁面與資源,僅此而已。不過,註冊腳本還會要求永久儲存空間,好讓離線快取撐過 Safari 七天 閒置就清除的機制:

src/components/ServiceWorkerRegistration.astro
if (!storage?.persist) return;
if (await storage.persisted?.()) return;
storage.persist().catch(() => {});

不管背後是為了離線閱讀而快取文章的 PWA,還是想在分頁關閉後繼續存活的詐騙頁面, 註冊一個 Service Worker、要求永久儲存空間、再提供一個安裝提示,寫出來的程式碼長得 一模一樣。

直接點名 sw.js 的封鎖記錄

幾週後這個猜想得到證實:我自己電腦上那套 Trend Micro 真的擋下了一次連線,而封鎖 記錄明確點名了是哪個資源:

欄位值
URLhttps://oharu121.com/sw.js
威脅類型不正プログラム配信(惡意程式散布)
掃描類型Web レピュテーションの評価(Web 信譽評估)
處理ブロック(封鎖)

Trend Micro 本機記錄檢視器,顯示一筆 Web 威脅防護記錄:2026 年 9 月 21 日凌晨 1 點 51 分 11 秒,oharu121.com/sw.js 遭到封鎖

同一次封鎖,在防毒軟體自己的歷史記錄裡的樣子。

這是第一次有檢查工具點名具體的檔案,而不是整個網域;而我第一次提交的重新分類申請是針對 根網域,完全沒有動到 Trend Micro 資料庫裡屬於這個檔案的那筆紀錄。

重新分類的是檔案,不是網域

於是我提交了第二次重新分類申請,這次直接針對 https://oharu121.com/sw.js。備註欄裡 附上了 VirusTotal 的結果,以及這個檔案功能的簡單說明。

申請目標結果
第一次,9 月 2 日https://oharu121.com/Dangerous、Disease Vector
第二次,9 月 3 日https://oharu121.com/sw.jsSafe、Computers/Internet;Noteworthy

Trend Micro Site Safety Center 寄來的郵件,顯示 oharu121.com/sw.js 的重新分類結果:新的安全評等為 Safe,新的內容類型為 Computers/Internet;Noteworthy

改變結果的關鍵,是鎖定確切被標記的資源,而不是整個網域。

總結

PWA 的 Service Worker 被誤判為「惡意程式散布」,追根究柢是特徵比對出了問題,而不是真的 遭到感染。註冊 Service Worker、要求永久儲存空間、提供安裝提示,這些行為在掃描工具眼 中,不管背後是為了離線閱讀還是詐騙頁面想賴著不走,看起來都一樣。

跟其他信譽服務一一比對之後,可以確認這個標記只出現在 Trend Micro,並不是真的遭到 入侵;而最後真正有效的解決方法,範圍比第一次嘗試更窄:重新分類掃描工具點名的那個確切 檔案,而不是它所在的網域。

參考連結

分享這篇文章