Newshot
Account

劫持三星电视 Smart Hub 广告

Translation(model translation, not the source's own text)

文章标题:劫持 Samsung TV Smart Hub 广告

正文: 我有一台 2022 年的 Samsung 智能电视。不知从什么时候起,Smart Hub 开始展示广告。我认为这简直令人作呕:一台我花钱购买并拥有的设备,而且我并没有使用任何 Samsung 的“免费”附加服务,却强行向我投放广告,只是为了给 Samsung 从一台早已售出的设备上再榨取额外收入。之前我一直通过自己的 Pi-hole 实例拦截这些广告,直到不久前我在折腾自己的 homelab 和网络配置时弄坏了点东西。这让广告又重新出现了,也让我想起了它们的存在。

差不多同一时间,发生了 eMudhra CA 证书风波,那把“已泄露”的私钥被加进了 mitmproxy。mitmproxy 是一个用于检查、重放和修改 HTTP(S) 网络流量的开源项目。通常情况下,为了能够拦截 TLS 加密流量,“受害者”设备必须信任由 mitmproxy 创建的自定义证书——这样 mitmproxy 才能解密流量、检查它,然后用真实证书重新加密再转发到预期目的地。不幸的是,有些设备不允许向其信任库中添加自定义 SSL 证书——比如我的 Samsung 电视。

Mikrotik 配置(根据你的路由器按需调整)


        # 192.168.0.7 is my raspberry-pi with mitmproxy
# 192.168.0.9 is my Samsung TV

/routing/table
add name=tv-proxy fib

/ip/route
add dst-address=0.0.0.0/0 gateway=192.168.0.7 routing-table=tv-proxy

/routing/rule
add src-address=192.168.0.9/32 action=lookup-only-in-table table=tv-proxy

/ip/firewall/filter
add chain=forward action=accept src-address=192.168.0.9 connection-state=established,related
add chain=forward action=accept dst-address=192.168.0.9 connection-state=established,related
      

Raspberry-Pi 配置


        sudo iptables -I FORWARD 1 -s 192.168.0.9 -j ACCEPT
sudo iptables -I FORWARD 1 -d 192.168.0.9 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -t nat -A PREROUTING -i eth0 -s 192.168.0.9 -p tcp --dport 80 -j REDIRECT --to-port 8080
sudo iptables -t nat -A PREROUTING -i eth0 -s 192.168.0.9 -p tcp --dport 443 -j REDIRECT --to-port 8080
sudo iptables -t nat -A POSTROUTING -s 192.168.0.9/32 -o eth0 -j MASQUERADE
      

mitmproxy 配置


        uvx --from mitmproxy mitmweb --web-port 8083 -p 8081 --emudhra --ssl-insecure --mode transparent --set stream_large_bodies=1m
      

由于 eMudhra 证书被暴露,现在任何人都可以为任意域名(比如某个 Samsung 广告网络的域名)创建自定义 SSL 证书,用这把已泄露的 CA 证书签名,而所有信任库中包含 eMudhra CA 证书的设备都会信任这个自定义 SSL 证书。这就是为什么各个软件厂商都在竞相(有的快些,有的慢些)从自己的信任库中吊销该证书,以免浏览器、电脑和智能手机受到这类攻击的影响。对我来说幸运的是,Samsung 还没有为我的电视发布会吊销该证书的更新。这让我能够把电视的所有流量都路由经过 mitmproxy,拿到电视所通信的全部域名和端点列表,同时还能看到请求和响应载荷的结构。

结果发现流程相当简单:当电视上发生某些值得关注的事情时,电视会向 https://catalyst.adgrx.com/adopportunity 发送一个请求,附带一些关于电视的详细信息。当你返回 Smart Hub(可以说是电视的“主屏幕”)时,电视会向 https://tvx.adgrx.com/impressions/tile 发送请求,同样附带一些关于电视的详细信息,而作为响应,它会收到一个空的 JSON 对象({}),或者一个描述要在 Smart Hub 顶部展示的广告的 JSON 响应。

于是我用 Rust 写了一个简单的服务器,处理同一个 /impressions/tile 端点,始终返回带广告的 JSON,只不过其中的链接不是指向真正的广告图片,而是指向我家人的随机照片。我还做了一个简单的前端,用来管理应该提供哪些图片。

AdSpoofer 前端
AdSpoofer 前端

此外,该服务器会把其他所有 *.adgrx.com 请求都黑洞掉,返回 204 No Content,防止各种跟踪数据流出我的家庭网络。

接着我为 *.adgrx.com 生成了通配符 SSL 证书,用被攻陷的 eMudhra CA 证书签名,并把它加进了应用里。

最后,我配置路由器把 *.adgrx.com 解析到我的 NAS 的 IP 地址,广告伪造器就跑在那上面。现在当我们打开电视时,看起来是这样:

我的电视照片,显示一张带有自定义图片的伪造广告
我的电视照片,显示一张带有自定义图片的伪造广告

adspoofer 的源码在我的 GitHub 上,谁想试试都可以拿去用。它能在我这一型号的电视上工作,但其他三星电视可能会使用不同的端点,或者期望不同结构的响应。如果你让它在你的电视上跑通了,欢迎发补丁过来!

显然,这只有在我的电视信任那些被攻陷的 eMudhra 证书时才行得通,也就是要么等到证书过期,要么等到三星推送更新吊销该证书。后者我可以通过阻止电视更新来避免(这本身也有它自己的一套风险),这个改天再说。

The translation is machine-generated and individual terms may be off. Nothing is rewritten or cut; the original is authoritative.

Published by Lobsters
This site only summarises and aggregates; copyright stays with the original author. Headlines and summaries follow the source — where they differ, the original wins.
Read the original ↗