如何看待小米路由進行 404 網頁劫持?
http://bbs.xiaomi.cn/thread-11315111-1-1.html
小米路由最近的一個更新, 4xx,5xx 網頁錯誤,直接跳小米的廣告也,美其名曰: 提升用戶體驗.
這種明目張胆的網頁劫持,明顯是有問題的吧?
以前就想過,智能路由廠商,某天會不會,為了滅掉競爭對手,直接屏蔽對競爭對手的網頁訪問
現在網頁劫持出現了,我覺得,我之前想的東西,某天可能說不定就出現了
小米路由器404錯誤頁面美化功能將用戶訪問鏈接提交到伺服器已是毫無疑問,那麼就請大家回答一下這個問題:
出於什麼樣的目的,小米路由器404錯誤頁面美化功能將用戶訪問鏈接提交到小米伺服器? - 小米科技
「404錯誤頁面美化」不僅僅是響應頁面被修改,更嚴重的問題是用戶訪問鏈接被發送到了小米的伺服器,這就涉及個人隱私泄露問題。我做了一個實驗,通過在小米路由器上抓包,獲取了頁面重定向和美化頁面相關的HTTP請求信息。
以PlayBoy官網為例,先在瀏覽器地址欄輸入網址,發現現在PlayBoy主頁很素。於是想試探一下,有沒有隱藏的內容,於是把首頁地址後面加了naked/。(思想不健康)
然而naked目錄並不存在,於是出現了小米的「404錯誤美化頁面」。
用wireshark打開tcpdump抓包文件,看到了HTTP請求報文:
在重定向頁面請求報文中發現向小米伺服器提交的URL中含有剛才訪問的鏈接信息。
這是最終的404錯誤美化頁面請求報文,鏈接中含有一段BASE64編碼的信息,在瀏覽器地址欄里也能看到這段信息。
通過在線解碼網站得到BASE64解碼信息,其中包含了用戶的路由器設備ID和訪問鏈接。
通過以上實驗,我們可以看出:小米路由器向伺服器報告了用戶訪問的鏈接,並與唯一的設備ID關聯。如果用戶正在訪問了敏感網站,或者鏈接中含有敏感信息,遇到404錯誤時,這些信息將被發送到小米伺服器,導致個人隱私泄露。這才是小米路由器「404錯誤頁面美化」功能最危險之處。7月1日補充一個實驗:
某網站沒有使用https協議,某天網站維護員在升級時出現差錯,導致用戶登錄時出現404錯誤,我們來看看小米路由器是如何美化網頁。
測試的網站是:http://www.weixinto.com/,在登錄頁面里輸入用戶名:admin,密碼:1234567890,如下圖所示。
點擊「Login」按鈕後出現了小米路由器的404錯誤美化頁面,我們留意到頁面鏈接的域名api.miwifi.com,是小米公司的伺服器。完整鏈接是:http://api.miwifi.com/error-page.html?data=ZGV2aWNlX2lkPWZhNjlkMmMzLTIwNTktNGIxOC1hYThmLWE2ZmM4NThjZDdiNiZyb209JmhhcmR3YXJlPSZjaGFubmVsPSZlcnJvcl90eXBlPTEmc2M9NDA0JnVybD1odHRwJTNBJTJGJTJGd3d3LndlaXhpbnRvLmNvbSUyRmxvZ2luJTJGJTNGdXNlciUzRGFkbWluJTI2cGFzcyUzRDEyMzQ1Njc4OTAmdHBsPWRlZmF1bHQerror_type=1
404錯誤頁面截圖如下:
將鏈接中從data=後到error_type=1之間的字元串複製,然後貼到在線Base64編碼/解碼器里解碼,得到:device_id=fa69d2c3-2059-4b18-aa8f-a6fc858cd7b6rom=hardware=channel=error_type=1sc=404url=http%3A%2F%2Fwww.weixinto.com%2Flogin%2F%3Fuser%3Dadmin%26pass%3D1234567890tpl=default
看到了在登錄頁面中輸入的admin和1234567890,還有路由器的設備ID,這些信息已提交到了小米的伺服器。
6月29日更新:
上面的實驗只是通過抓包了解到小米路由器404錯誤頁面劫持情況,接下來以1T硬碟版小米2.2.9穩定版固件為例,分析其工作原理。
- 啟動腳本 /etc/rc.d/S99http_status_stat 符號鏈接到 /etc/init.d/http_status_stat,在這個腳本文件的start()中載入幾個與404錯誤頁面相關的內核模塊(.ko文件)。
- start()首先判別http_status_stat.settings.enabled參數是否為1,如果不為1就退出。也就是通過這個參數關閉404錯誤頁面劫持。
- start()接著判斷nvram參數CountryCode (國家代碼)是否為CN,如果不是CN就退出。由此可見,小米不敢在其他國家使用404錯誤頁面劫持。
start() {
config_load "http_status_stat"
local switch
switch=`uci get http_status_stat.settings.enabled -q`
if [ $switch -ne "1" ]; then
return 0
fi
local cc=$(nvram get CountryCode)
cc=${cc:-"CN"}
if [ $cc != "CN" ]; then
echo "http_stat: Bad Country!"
return 0
fi
fastpath=`uci get misc.http_proxy.fastpath -q`
[ -z $fastpath ] return 0
if [ $fastpath == "ctf" ]; then
if [ -f $APP_CTF_MGR ]; then
$APP_CTF_MGR http_stat http on
fi
elif [ $fastpath == "hwnat" ]; then
echo "http status can work with hw_nat."
else
echo "http_status_stat.init: unknown fastpath type! Treat as std!"
fi
insmod nf_conn_ext_http &>/dev/null 2&>1
insmod nf_tcp_proxy &>/dev/null 2&>1
#echo "open and set proxy action to kernel"
echo "ADD 5 $LIP $PROXY_PORT" &> $CFG_PATH
# ensure start switch
echo "1" &> $SWITCH_PATH
insmod http_status_code_proxy &>/dev/null 2&>1
[ -f $REFERER_PATH ] echo $REFERER_STR &> $REFERER_PATH 2&>/dev/null
return 0
}
下一步要弄清楚三個內核模塊在幹什麼?
nf_conn_ext_http.ko
nf_tcp_proxy.ko
http_status_code_proxy.ko
這些字元串含有hijack,請英語達人給翻譯一下hijack的中文意思。
tcp_hijack_func
security_hijack
http_response_hijack
http_response_hijack
security_hijack
%s, security hijack successd!
%s, security hijack failed for some reason!
%s, syn ack but can NOT hijack!!
nf_tcp_proxy.ko的大致功能:
向內核的netfilter掛鉤子,監視經過路由器的TCP報文。將HTTP報文通知
http_status_code_proxy,http_identify,http_match,http_content_type_mark這些模塊。這些模塊解析http報文,如果需要劫持,就調用nf_tcp_proxy中的相關函數,讓nf_tcp_proxy生成相關TCP報文,然後注入到TCP會話中。由此可見,這就是TCP會話劫持。
下面是在nf_tcp_proxy.ko中發現的一段字元串,這是跳轉404錯誤頁面時注入的HTTP響應報文的模板。
GET /error-page?error_type=1sc=
Host: api.miwifi.com
Connection: keep-alive
Cache-Control: no-cache
Accept: */*
Pragma: no-cache
User-Agent: HTTP/1.1
Padding:
調用nf_register_hooks函數,註冊2個鉤子函數:
NF_IP_PRE_ROUTING ipv4_tcpproxy_pre_hook
NF_IP_POST_ROUTING ipv4_tcpproxy_post_hook
這2個鉤子函數位於netfilter的最前和最後,前端用於監視,後端用於注入或重定向。借用一張圖來說明鉤子函數所處的位置。
關於netfilter hook,可參考:(十五)洞悉linux下的Netfilteriptables:開發自己的hook函數【實戰】...
2015/7/7 更新一點個人的感想:
所謂的「智能」路由器的「智能」是為了更好的服務用戶的,而不是反過來自作主張的以「我這麼做是為了你好」為理由胡亂作為的,這種「智能」過頭了的東西讓我想起了失控的人工智慧,
比如
美劇:《真實的人類》(Humans)
電影:《機械姬》(Ex Machina)、《黑客帝國》(The Matrix)。。。
事實上,被公司/企業控制的智能設備何嘗不是一種失控?因為本來路由器這種家庭私有的設備的控制權就應該是完全屬於個人的。
--------------------------------------------------------------------------------------------------------------------------------
小米路由器這麼做現在可能看起來沒什麼,但是作為一個中立的網路設備:路由器,隨意篡改用戶的網路數據,這已經是超越底限的行為,路由器只是一個數據中轉站,不應該去篡改經過它的用戶的網路數據,更不用說最近在豆瓣影視、天天美劇等影視資源網站底部注入js來推廣他們的路由器app的噁心行為了,何況這個js還是引用的放在他們伺服器上的js文件,裡面寫什麼代碼控制權完全在他們手裡,今天他們可以借著404、500給你展示他們自己的頁面,明天他們就可以在這個頁面上放廣告!今天他們可以在頁面里注入js來推廣app,明天你就不知道他們會往裡面注入什麼代碼!要知道,流氓總是會得寸進尺的!
對小米404頁面暗含百度聯盟的「搜索推廣」代碼的分析:小米路由器被曝「劫持」404頁面
烏雲上的扒皮:小米路由器劫持用戶瀏覽器事件回顧
不奇怪,今天修改你網頁顯示廣告,明天偷你帶寬做bt肉機種子,後天替換你的下載程序捆綁上他們的流氓插件,大後天你到百度下載的遊戲都變成小米應用商店的遊戲來提高他們的遊戲收入分成了,再往後就開始收集你的淘寶記錄和上網記錄了。
國內所謂互聯網思維做智能硬體的,都是這副操行,用加速和低價來欺騙消費者,再打著 「為你好」 和 「改善體驗」 的名義來為所欲為。就像大街上跑過一個人幫你扣鼻屎,邊扣邊跟你說 「為你好」 「扣扣更健康」 你啥反應呀?早一腳踹上去了,是不是呀?-------
作為網路體系中與其它設備按照標準協議通信的一個路由設備,今天能篡改應用層協議,明天就敢篡改其它更底層的協議...
這已經不是路由器了,這是iot時代的智能路由木馬計。
不做漂亮點,不賣便宜點,不每天製造各種話題刷存在感,誰會把木馬請回家呢?
人要沒底線,什麼事都幹得出來。小米不敢去美國,還是挺有自知之明的。
小米終於還是把內褲脫掉了,曾經標榜節操的傅盛獵豹和雷軍小米,最終也變成了自己最討厭的人。我也買過很多小米的產品,但這次小米還是讓我失望了。
此外,我發現一個很詭異的事情...
稍有常識的人應該知道,電信、聯通等寬頻運營商早在十年前就已經干小米路由器干過的事情了,比如DNS劫持、默認搜索頁劫持、空白頁(404)劫持、寬頻運營商捆綁定向彈窗廣告等...
大概是汶川地震那年左右,因為電信給我彈廣告,憤青的我就跟當地電信掐了起來。無奈當時微博啥的也木有,只能用電話和面訪訴諸我的不滿。更詭異的是電信的客服妹子以及客服經理,對我的投訴竟然很驚訝。好像在他們眼裡這樣的事情就是理所應當的,為什麼還有人來投訴?
面對這種荒唐的反應,最終找了當地比較有名的報社和一家新聞門戶,把我寫的一篇關於電信寬頻運營商未經用戶許可,擅自惡意推送彈窗廣告的文章掛在了網站的頭條和報紙的社會生活版(沒想到評論區有看過當年這篇報道的知友,緣分吶~)。結果當天電信的工作人員就給我打電話了,把我的彈窗廣告都撤銷掉了。然而在我投訴之前,他們跟我說的是「無法撤銷,我們這邊是撤銷不了的,這是全國統一的」,呵,騙誰呀?
然而,我堅信他只撤銷了我一個人的,還有茫茫多的小白鼠被寬頻運營商暗地裡剝奪著隱私與利益。
今天的小米的做法,無疑會形成行業帶頭作用,連小米都這麼做了,其他老牌和新軍憑什麼不跟進?這麼大塊的硬體級入口蛋糕,你不吃,別人就吃了,那麼有什麼理由不吃?
上面有知友說,趁現在趕緊換一款良心的路由器吧。說真的,我對換路由器這件事不抱太大的信心。尤其是對於大多數不懂路由器與網路安全知識的人來說,換什麼都是一樣,哪天神不知鬼不覺給你背後來一刀,你該中招還是會中招。以寡敵眾,勢單力薄,被吞噬是遲早的。
有人說無商不奸,商業固然沒錯,但商業也是有規則的,也是得遵循規則才可以生存的,不是么?
所以個人希望這事兒能引起更多人與更多有良心的媒體關注,公眾信息安全與個人隱私是重大課題,一個國家、一個廠商,不論是在APP軟體層,還是通過路由器手機等硬體層,試圖破壞侵犯用戶的隱私與選擇,這都是不可原諒的。要知道用戶選擇你的產品,就是把信任交付給了你們!
未來,不僅是小米,任何一家試圖干這事兒的廠商,都應該拉出來曝曝光。管你是數字、鵝廠、熊廠,還是其他打著「智能」旗號卻干著強姦用戶的硬體廠商。用戶一定要堅定站隊,表明自己的立場與態度,不論是通過輿論聲討還是其他手段,都要不遺餘力的捍衛自己的合法權益。
Ps:有人說你只說小米不說其他家,那麼可以看看之前的兩家,有時候真別怪米粉變米黑:
360免費wifi的原理是什麼?有無竊取手機記錄的wifi數據? - 知乎用戶的回答 如何讓可能嚴重侵害公眾利益的 「WiFi 萬能鑰匙」App 消失? - 知乎用戶的回答
最後看到這篇小米的官方聲明,我只能說「別有用心」、「惡意誇大」、「製造恐慌」、「煽動用戶」的帽子扣的好大。拜託小米能誠懇一些么?掩耳盜鈴真的能掩蓋真實意圖?如果真正的在為用戶著想,那麼你們真正的在意過用戶的意見嗎?尊重用戶的選擇了嗎?
如果你對互聯網產品或數碼設備有一些匪夷所思的經歷或內幕,可以微信里告訴我:
1. 更加友善的呈現方式。
當遇到404錯誤頁面時,不再呆板的顯示錯誤代碼。
友善嗎,不覺得
2. 快捷的搜索按鈕。
因為引起404的很大一部分原因,是直接在地址欄輸入要搜索的內容,而沒有先訪問百度。
掩耳盜鈴,誰不知道用的是推廣鏈接
3. 常用的網站導航。
在訪問常用網站時敲錯地址,也會發生404,快捷導航帶你直達頁面。
優化網站返回的404錯誤頁面,讓網頁更友善,上網更方便,新功能大家覺得怎麼樣?
更方便嗎,並不方便
附上某小米路由器用戶帖子
今天來發表了個問題,瞬間對小米無愛了,附帶1.0rom官方鏈接
現在能對HTTP403和404劫持,對第三方網頁進行JS注入推廣小米陸遊器app
將來呢
小米態度可見一斑
不買小米陸遊器,從我做起
TP-LINK官方網站
Cisco
說一點技術細節,不是在IP協議層之下做了劫持,而是通過了內建的Nginx伺服器做了一個透明代理,不僅對404頁面代理,還對特定域名實行JS廣告注入。
以下轉自V2EX,原作者:mac2man
鏈接:https://www.v2ex.com/t/199701
今天仔細研究了小米路由的一些配置文件:
1. 首先發現nginx進程,看到一個配置文件 /tmp/sysapihttpdconf/sysapihttpd.conf
其中有一段引起了我的好奇, 當然其他配置也很可疑,但這段看上去就像是V友描述的頁眉廣告:
miwifi_toolbar_config miwifi_toolbar_zone 1M "/tmp/rr/directive_body";
server {
listen 8380;
resolver localhost;
location / {
set $device_id "58cd969a-6bdf-4997-88cc";
set $rom_version "2.3.31";
set $hardware "R1D";
set $channel "stable";
include "/tmp/rr/footer";
miwifi_toolbar miwifi_toolbar_zone;
proxy_pass $scheme://$host$request_uri;
proxy_ignore_client_abort off;
proxy_connect_timeout 30s;
proxy_read_timeout 30s;
proxy_send_timeout 30s;
proxy_buffering off;
proxy_set_header Accept-Encoding "";
proxy_max_temp_file_size 0;
proxy_set_header Host $http_host;
}
2. 配置文件中提到了文件 /tmp/rr/directive_body,繼續看這個文件(先貼一段,後面有完整的):
ts 1434688147041
footer
hannel=${channel}">&&