代码审计-某物联网系统RCE
字数 1273 2025-08-22 12:22:42

物联网系统RCE漏洞分析与利用教学文档

漏洞概述

本文档详细分析某物联网系统中存在的远程代码执行(RCE)漏洞,该漏洞源于系统对JAR协议支持加载机制的不安全实现,允许攻击者通过上传恶意JAR文件或远程加载恶意JAR来执行任意代码。

漏洞定位

关键类与方法

  1. 漏洞触发点

    • jetlinks-supports-1.2.3-SNAPSHOT.jar!/org/jetlinks/supports/protocol/management/jar/JarProtocolSupportLoader.class 类中的 lookupProvider 方法
    • 关键代码:providerType.getDeclaredConstructor().newInstance()
  2. 调用链

    • 入口点:org.jetlinks.community.device.web.ProtocolSupportController#convertToDetail
    • 路由:/api/protocol/convert
    • 调用路径:
      ProtocolSupportController.convertToDetail → 
      SpringProtocolSupportLoader.load → 
      AutoDownloadJarProtocolSupportLoader.load → 
      JarProtocolSupportLoader.load → 
      JarProtocolSupportLoader.lookupProvider
      

两种加载方式

  1. HTTP远程加载

    • 通过location参数指定HTTP URL
    • 系统会下载JAR到临时目录并加载
  2. 本地文件加载

    • 通过fileId参数指定已上传的JAR文件
    • 系统直接加载本地JAR

漏洞分析

关键漏洞点

  1. 不安全实例化

    • newInstance()调用无任何安全检查
    • 可实例化任意类
  2. ASM检查绕过

    • 检查逻辑位于loaderScanner.walkClass
    • 仅检查类名是否以com.googleorg.apachecn.hutool开头
    • 非上述包名的类仅检查方法调用黑名单
    • 可通过反射加载字节码绕过检查

漏洞利用

利用方式一:上传恶意JAR

  1. 利用系统自带的上传接口上传恶意JAR
  2. 获取上传后的文件ID
  3. 调用/api/protocol/convert接口,指定fileId参数加载恶意JAR

利用方式二:远程加载恶意JAR

  1. 准备恶意JAR并托管在可访问的HTTP服务器
  2. 调用/api/protocol/convert接口,指定location参数为恶意JAR的URL

恶意JAR构造要点

  1. 避免使用com.googleorg.apachecn.hutool开头的包名
  2. 使用反射或字节码技术绕过方法调用检查
  3. 在构造函数或静态代码块中实现恶意代码

防御建议

  1. 严格限制可加载的JAR来源
  2. 实现更严格的类名和方法调用检查
  3. 使用安全管理器限制JAR的执行权限
  4. newInstance()调用添加白名单检查

调试方法

  1. ProtocolSupportController.convertToDetail方法设置断点
  2. 跟踪调用链至JarProtocolSupportLoader.lookupProvider
  3. 观察JAR加载和类实例化过程

免责声明

本文档仅供安全研究与学习使用,任何利用此漏洞进行的非法行为与作者无关。请在合法授权范围内进行安全测试。

物联网系统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 调用路径: 两种加载方式 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加载和类实例化过程 免责声明 本文档仅供安全研究与学习使用,任何利用此漏洞进行的非法行为与作者无关。请在合法授权范围内进行安全测试。