代码审计-某物联网系统RCE
字数 1273 2025-08-22 12:22:42
物联网系统RCE漏洞分析与利用教学文档
漏洞概述
本文档详细分析某物联网系统中存在的远程代码执行(RCE)漏洞,该漏洞源于系统对JAR协议支持加载机制的不安全实现,允许攻击者通过上传恶意JAR文件或远程加载恶意JAR来执行任意代码。
漏洞定位
关键类与方法
-
漏洞触发点:
jetlinks-supports-1.2.3-SNAPSHOT.jar!/org/jetlinks/supports/protocol/management/jar/JarProtocolSupportLoader.class类中的lookupProvider方法- 关键代码:
providerType.getDeclaredConstructor().newInstance()
-
调用链:
- 入口点:
org.jetlinks.community.device.web.ProtocolSupportController#convertToDetail - 路由:
/api/protocol/convert - 调用路径:
ProtocolSupportController.convertToDetail → SpringProtocolSupportLoader.load → AutoDownloadJarProtocolSupportLoader.load → JarProtocolSupportLoader.load → JarProtocolSupportLoader.lookupProvider
- 入口点:
两种加载方式
-
HTTP远程加载:
- 通过
location参数指定HTTP URL - 系统会下载JAR到临时目录并加载
- 通过
-
本地文件加载:
- 通过
fileId参数指定已上传的JAR文件 - 系统直接加载本地JAR
- 通过
漏洞分析
关键漏洞点
-
不安全实例化:
newInstance()调用无任何安全检查- 可实例化任意类
-
ASM检查绕过:
- 检查逻辑位于
loaderScanner.walkClass中 - 仅检查类名是否以
com.google、org.apache、cn.hutool开头 - 非上述包名的类仅检查方法调用黑名单
- 可通过反射加载字节码绕过检查
- 检查逻辑位于
漏洞利用
利用方式一:上传恶意JAR
- 利用系统自带的上传接口上传恶意JAR
- 获取上传后的文件ID
- 调用
/api/protocol/convert接口,指定fileId参数加载恶意JAR
利用方式二:远程加载恶意JAR
- 准备恶意JAR并托管在可访问的HTTP服务器
- 调用
/api/protocol/convert接口,指定location参数为恶意JAR的URL
恶意JAR构造要点
- 避免使用
com.google、org.apache、cn.hutool开头的包名 - 使用反射或字节码技术绕过方法调用检查
- 在构造函数或静态代码块中实现恶意代码
防御建议
- 严格限制可加载的JAR来源
- 实现更严格的类名和方法调用检查
- 使用安全管理器限制JAR的执行权限
- 对
newInstance()调用添加白名单检查
调试方法
- 在
ProtocolSupportController.convertToDetail方法设置断点 - 跟踪调用链至
JarProtocolSupportLoader.lookupProvider - 观察JAR加载和类实例化过程
免责声明
本文档仅供安全研究与学习使用,任何利用此漏洞进行的非法行为与作者无关。请在合法授权范围内进行安全测试。