10 月 31 日,開發者 MeT 發帖說了一件事:他朋友接到當地公安的電話,對方要求他把手機裏的 X 和 Telegram 卸掉。MeT 順着這通電話往下查,查到的不是哪個 App 漏了信息,而是他朋友手機裏一個出廠就裝好的系統組件。這個組件會把他朋友這臺手機過去 24 小時用過哪些應用、每個應用用了多久,一起打包發往中國聯通的服務器。
你現在的主力機上,裝着 Telegram 或者代理工具嗎?如果裝了,那麼這臺機器的系統應用列表,你有沒有從頭到尾翻過一遍?
MeT 的朋友那臺手機是小米 14,系統是澎湃 OS 3,裏面插的是中國移動的卡,而且已經 root 過。MeT 在 root 之後用電腦把他朋友手機裏可疑的組件提取出來,藉助 GPT 輔助反編譯,最後鎖定了兩個會上報應用信息的組件。
一個是小米自己的系統安全組件,它把第三方應用的清單報給小米的反詐服務器。另一個叫 SystemHelper,它報的東西更多,而且收件方是中國聯通。
順帶把一件容易混的事分清:網上熱議的「每隔幾秒錄一段屏」,屬於小米那個系統安全組件,不是 SystemHelper。這一篇只講 SystemHelper,因爲只有它被人完整拆開過,字段一個一個從代碼裏數清楚了,拿它正好能把 VPN 能擋住什麼、擋不住什麼講明白。
11 月 5 日,V2EX 上一篇帖子把這件事彙總了出來,標題是「能不能給人留點隱私」,下面跟了 171 條回覆。帖子把事情的經過講完了,但有兩個問題它沒有回答:開了 VPN 擋不擋得住,還有,這一份數據到底能拼出什麼。
SystemHelper 的歸屬與去向
SystemHelper 不是小米寫的,它是中國聯通的設備管理客戶端,業內叫 DM 客戶端。聯通自己的《Android 終端 DM 適配使用指南》裏就寫着它的預置路徑,手冊還特意要求,不要阻止它開機自啓。
它在手機裏的位置是系統特權目錄,用的也是平臺簽名,所以普通應用沒有的權限,它出廠就全拿到了。所謂平臺簽名,就是它是用手機廠商手裏的平臺密鑰籤的名,安卓因此把它當作簽名級特權的系統應用來對待。它在桌面上沒有圖標,普通的應用列表裏也翻不到它。因爲它裝在系統分區裏,所以沒有 root 的話,用戶既卸不掉它,也沒有辦法把它的安裝包提取出來分析。
它回連的地址寫在代碼裏,缺省值是聯通設備管理平臺的一個網址,用的還是明文的 HTTP。它實際發出去的那份數據,在發送之前,要先在代碼裏過一遍應用層加密處理。地址走的是明文,可是那份數據先過了這一遍處理,所以半路上誰能看到什麼,沒有定論。這個問題我留在最後一節講,到時候把能確認的和不能確認的分開說。
上報的字段
11 月 4 日前後,另一位審計者把一臺 Redmi 上的這個組件完整拆了一遍,字段是一個一個從代碼裏數出來的。一份完整的上報大致由三部分拼成,我按部分列出來:
-
設備與電話卡:兩張卡的 IMEI、IMSI、ICCID 和運營商網絡代碼,手機當前連着的小區編號(CID、PCI、TAC)與網絡類型,還有 5G 與 VoLTE 的開關狀態、廠商、機型、硬件與軟件版本,一共約 40 個字段。
-
信號與位置:這一部分會把兩張卡的編號再帶一遍,並且在小區編號之外補上信道號(ARFCN)和信號指標(RSRP、RSRQ、SINR)。這一部分裏還有內置的百度定位給出的經緯度,同時給出海拔、速度和方向。而且只有連着中國境內網絡時,這一類記錄纔會往本地存。
-
應用使用:每個應用的包名和顯示名、在前臺被用了多久,以及它在兩張 SIM 卡和 WiFi 上分別走了多少流量。過濾規則在代碼裏只有一個條件:包名以 com.android 開頭的應用會被跳過。廠商自己預裝的應用不落在這個條件裏面,所以它們照樣會被統計進去。
MeT 在他朋友的小米 14 上看到的統計口徑是過去 24 小時。換句話說,它報的還包括這 24 小時裏的使用記錄。
換成任何一臺裝了這個組件的手機,記下來的也是同一套:機主實際用過哪些應用,每個應用在前臺一共待了多久,還有各應用在兩張 SIM 卡和 WiFi 上分別走了多少流量。它記的只有總量,沒有時間點:一個應用總共用了多久有數,機主是在幾點打開它的,記錄裏沒有。這份記錄裏的每一項,都帶着手機本身的編號和兩張電話卡的編號。
它醒來的時機也寫在代碼裏。開機、換卡或者網絡變化,都會把它叫醒。另外還有定時的鬧鐘:定位採集的週期是一小時,鬧鐘用的還是能穿透休眠的精確鬧鐘,所以手機息屏放着,它也會照點醒來採集。上報失敗的數據會先存在手機本地,等下一次再補發。
發送之前還有一個同意開關的判斷。代碼裏這個變量在日誌中叫「用戶許可是否打開」,但是在代碼裏專門給小米手機用的那一部分裏,它實際只檢查一件事:新手機的首次設置走完了沒有。所以你在設置裏把相關開關關掉,這個判斷照樣通過。
VPN 的盲區
VPN 在安卓上管的是網絡層的事。它通過系統的 VpnService 建一條隧道,改變的是數據包出門走哪條路。它能藏住的,是你的流量去了哪裏,以及在旁人眼裏你是從哪個地址出來的。
但是 SystemHelper 的採集根本不經過網絡。它拿着系統特權,在手機本地直接調用系統的接口:讀全部已安裝應用靠一個權限,讀每個應用的使用時長靠另一個權限,讀 IMEI 和電話卡編號再靠一個權限。這些讀取發生在數據包出現之前,所以隧道修得再嚴,也管不到同一臺機器內部的接口調用。

這三項讀取對普通應用各有各的門檻,卡住它們的方式還不一樣。手機和電話卡的編號這一項,從安卓 10 開始普通應用就拿不到 IMEI、IMSI 和 ICCID 了,只有帶簽名級特權權限的預裝應用能讀。裝了哪些應用這一項,枚舉全部已安裝應用靠的也是簽名級特權權限,普通應用同樣過不去。
每個應用用了多久這一項,普通應用想讀,得由用戶自己去設置裏手動打開「使用情況訪問」,不是裝上之後就能自己讀到的。三項門檻攔的都是普通應用。SystemHelper 出廠就預裝在系統裏,又帶着平臺簽名,所以這三項它全都夠得着,問題正在這裏。
就算只看發送這一步,隧道也不是沒有辦法繞過去。安卓的 VPN 機制本身就允許按應用分流,也允許應用把自己綁到指定的網絡上、完全不進隧道。系統組件的流量走不走你的 VPN,你作爲用戶是沒辦法決定的,這是系統本身默認的機制,用戶一般無法修改,也不好判斷。
而且就算它老老實實走了 VPN,隧道能換掉的,也只有這次連接在旁人眼裏的源地址。可是服務器把數據收下來、解開之後,看到的還是同一份記錄,裏面帶着 IMEI 和電話卡編號。所以你的源地址變沒變,對它認出這份數據是誰的,沒有任何影響。
不過,發送這一步並不是完全沒有辦法。這一份數據在手機裏打包好之後,總要發出去,纔到得了聯通。一部分 VPN 和帶防火牆功能的工具,允許用戶自己設攔截規則,把指定的目標地址攔下來。如果這份上報的流量確實從這個工具裏過,而用戶又把上報服務器的地址設進了規則,那麼在規則生效的這段時間裏,這份數據就發不到聯通手裏。
只是這條路有前提:攔截規則只能攔得住從這個工具裏過的流量,而這份流量走不走你的隧道,前面已經說了,用戶沒辦法決定,也不好判斷。
它也有限度:攔住的只是發送,不是採集。這個組件照樣在手機本地讀、照樣打包。發送失敗的數據會先存在手機本地,等着下一次補發,所以哪天規則撤了,或者換了一個網絡環境,攢下來的數據還是可能被髮出去。
還有一個難處在動手之前:要攔,總得先知道該攔哪個地址。現在能確認的只有代碼裏寫的那個缺省地址,商店裏買來的手機實際連的是哪一臺,沒有人證實過,所以就算把缺省地址設進規則,也可能攔不住它真正要連的那一臺。
拼合後的完整檔案
單看應用清單,它就是一份關於興趣和身份的指紋。比如你裝的是哪一家的手機銀行,裝沒裝看病的應用,裝沒裝約會的應用。要看出這些事,根本不需要打開任何一個應用去看內容,因爲光是這份清單本身,就把這些事擺在明處了。

再加上使用時長,能看出來的是你的時間分給了誰。過去 24 小時裏,哪個應用在前臺待得最久、哪個只打開了一小會兒,總量記得清清楚楚。所以一個人的注意力主要落在哪幾個服務上、哪幾個服務佔用的時間最多,從這些總量裏就能看出來。不過它記的只有總量,沒有時間點:幾點打開、幾點關上,都不在記錄裏。所以幾點睡、幾點起,單靠使用記錄看不出來,那要靠位置記錄才拼得出來。
流量這一項更容易被低估。它是按應用分開統計的,WiFi 上的流量還單獨分開統計。這意味着哪怕你在家連着 WiFi、流量根本沒走運營商的網絡,每個應用在 WiFi 上走了多少流量,照樣一筆一筆都記在這份記錄裏。
最後再加上位置。這份上報裏既有基站編號,也有定位給出的經緯度。基站只能圈出一個大概的範圍,經緯度給出的就是具體的點。而且定位採集在代碼裏的週期是一小時,點會一個接一個攢下來。攢上幾天之後,晚上過夜的點和白天待得最久的點會從這串點裏顯出來,所以住址和單位不用再猜。定位數據裏還帶着速度和方向,所以你每天上下班走哪條路,也能順着這串點描出來。作息和行蹤靠的是位置記錄。
這四部分如果分散在四個地方,問題還有限。但是在這一份上報裏,它們從一開始就是拼好的。同一批記錄裏,應用、時長、流量和位置這四樣,每一項都帶着同一組 IMEI 和 ICCID。而在國內,電話卡是實名登記的,所以這組編號再往下查,落點就是一個具體的人。
運營商本來就握有的數據
話說回來,你自己的運營商本來就合法握着不少東西。你的實名登記、手機入網時的 IMEI、你連過哪些基站,它都有記錄。你的流量去了哪些地址、花了多少,它同樣有記錄。這些是入網和計費繞不開的數據,換到哪個國家都差不多。
所以新增的,是運營商從網絡那一側永遠看不到的那部分。它看不到你裝了哪些應用,也看不到每個應用在屏幕前用了多久;WiFi 上走了多少流量,它看不到,定位給出的經緯度更不在它手裏。更何況這份數據報給的是聯通。開頭提到的他朋友那臺手機,插的明明是移動的卡,所以收集數據的一方和手機的主人之間,連一份合同都沒有。
DM 這套制度本身,也不是小米或者聯通偷偷發明的。三大運營商對入庫機型都強制要求做 DM 適配,所以這個組件出現在很多品牌的國行機裏。代碼中的適配分支包括 OPPO、vivo、三星和中興等廠商,這一串名單裏沒有華爲和榮耀。
不過,其他品牌的情況和小米的情況還不能畫等號。目前被完整拆開、字段一個一個數清楚的,只有小米的樣本。其他品牌目前能坐實的只有兩點:有這個組件,握有這些權限。它們是不是同樣在上報,上報的字段一不一樣,還沒有人公開拆過,所以不能直接把小米的結論搬過去。
自查與移除
先查它在不在。打開設置裏的應用管理,打開「顯示系統應用」,搜 SystemHelper,能搜到就是有。會用電腦的,可以用 adb 查一遍包名,或者用開源工具 NOIR 把整臺機器的應用和權限審計一遍,這個工具不需要 root。
查出來有,又想處理,可以用 adb 把它對當前用戶卸載,同樣不需要 root。但是有兩點要先知道:這只是對當前用戶卸載,恢復出廠設置之後它還會回來;另外,網上有一份愛好者維護的精簡清單,專門列哪些預裝應用可以刪,清單裏只說了它和雙卡功能有關,沒有說清卸掉之後具體會影響什麼,所以卸完要先檢查兩張卡的通話和上網正不正常。後悔了,也有一條命令可以把它原樣裝回來。
但是有兩件事做了也白做。一件是去關設置裏的相關同意開關,前面已經說了,小米手機用的那一部分代碼根本不看那個開關。另一件是隻開一個普通的 VPN,讓流量換一條路走。換路換掉的只有源地址,採集和打包都在手機本地完成,所以單靠換路沒有用。帶攔截規則的工具不算這一件:把上報服務器的地址設進攔截規則裏,數據就暫時發不出去,它的前提和限度,前面那一節已經講過了。
還沒人回答的問題
到 11 月 5 日爲止,小米和中國聯通都沒有就這一輪爆料發過公開聲明。這份數據在聯通那邊存多久、誰能查、查的時候要走什麼手續,目前沒有任何公開材料能回答。
還有一處細節沒人能證實:實機連的到底是哪一臺服務器。服務器地址存在這個組件自己的配置裏,沒有 root 讀不出來,所以現在能確認的只有代碼裏的缺省地址。拆開那臺 Redmi 的那位審計者在短時間的觀測裏,也沒抓到它實際發出的流量,所以上報的真實頻率同樣沒有定論。
前面留下的那個問題也在這裏交代:半路上誰能看到什麼,同樣沒有定論。代碼裏寫死的缺省上報地址是明文的 HTTP,它的應用清單文件(AndroidManifest)裏也寫明瞭允許發明文流量。但是那份要發出去的數據,在發送之前,要先在代碼裏經過 AES 和 RSA 的應用層加密處理,所以地址是明文,不等於數據本身也攤在明處。
只是到現在爲止,沒有第三方公開過把真實抓包解開的結果,像 /register(上報地址裏用來註冊的那個路徑)這樣的路徑是不是也走了同一道處理,也沒有被單獨證實過。這幾件事放在一起,誰能在半路上看到什麼、能看到多少,沒人能說定。
開頭那通公安電話,也得在這一節裏把話說清。這份上報和那通電話之間,現在能確認的只有先後:數據先在往上報,電話後來打了過來。中間是不是這份數據觸發了那通電話,沒有任何證據能把這條線連起來,能拿出來的只有當事人自己的推斷。所以這一篇只把那通電話當作他起意排查的原因,不把它當作這份數據已經證實的後果。
如果你平時就在主力機上用 Telegram、用代理工具,我的建議很直接:先花上十分鐘,把自己的機器查一遍。如果查出來有,就按上面的辦法處理。如果一時處理不了,就先用帶攔截規則的工具把上報服務器的地址攔下來,讓數據暫時發不出去。如果連這個也做不到,那就把敏感的應用挪到另一臺機器上。別讓一份你看不見的檔案,天天替你記着你用過哪些應用、去過哪些地方。
這類把系統層拆開看的文章,我還會接着寫。覺得有用的話,歡迎訂閱這個博客,或者先收藏起來。後面我還會接着寫 AI、安全和開源方面的內容,都是像這一篇一樣拆開看的那種。
來源:V2EX 原帖《能不能給人留點隱私》(https://www.v2ex.com/t/1254629 );GitHub 獨立審計 LING71671/systemhelper-privapp-audit;證據彙編 beibing173/chinaphone;MeT(@MeTerminator666)2026-10-31 原帖及後續整理。