最后更新于2023年12月15日(星期五)18:30:08 GMT

2023年7月11日,Rapid7和Adobe 披露 cve - 2023 - 29298, 一个影响ColdFusion的访问控制绕过漏洞, Rapid7在2023年4月向Adobe报告的数据. 该漏洞允许攻击者绕过限制外部访问ColdFusion Administrator的产品功能. Rapid7和Adobe认为cve - 2023 - 29298在发布我们的 协调披露 (Rapid7在我们的披露中明确指出,我们没有测试Adobe发布的补丁).

在审查了ColdFusion 2021 Update 8中发现的cve - 2023 - 29298补丁后.0.08.330144), Rapid7发现,7月11日发布的补丁并不能成功修复原始问题,并且可以被攻击者绕过. Adobe 指定的cve - 2023 - 38205 并于2023年7月19日发布了完整的修复程序.

Rapid7已经在多个客户环境中观察到cve - 2023 - 29298漏洞的利用. 我们的团队 发表博客 并于7月17日对客户进行了观察和指导. 我们已经验证了 7月19日发布新补丁 完全修复这个问题.

受影响的产品

以下产品容易受到攻击 cve - 2023 - 38205:

  • Adobe ColdFusion 2023 Update 2及更早版本
  • Adobe ColdFusion 2021 Update 8及更早版本
  • Adobe ColdFusion 2018 Update 18及更早版本

信贷

这个问题是由Stephen less发现的, Rapid7的首席安全研究员, 并按照规定予以披露 Rapid7的漏洞披露策略.

供应商声明

Adobe向Rapid7提供了以下声明:
Adobe建议将ColdFusion安装更新到最新版本. 请参阅 APSB23-47 了解更多信息. Adobe意识到cve - 2023 - 38205已经在针对Adobe ColdFusion的有限攻击中被利用."

分析

7月11日针对cve - 2023 - 29298的补丁修改了攻击方法 IPFilter跑龙套.checkAdminAccess 使用新的助手方法 跑龙套.canonicalizeURI 在执行访问控制之前将URL转换为规范形式,如下所示.

  private static final String[] RESTRICTED_INTERNAL_PATHS = new String[] {"/restplay", “/ cfide / restplay”, “cfide /管理员”, “/ cfide / adminapi”, “cfide /主”, “/ cfide / componentutils”, “cfide /向导”, “/ cfide / servermanager”, “cfide /锁定”};


  checkAdminAccess(HttpServletRequest)
    字符串uri = 跑龙套.getServletPath(要求的);
    uri = 跑龙套.canonicalizeURI (uri.toLowerCase()); // <----
    for (String limittedpath: RESTRICTED_INTERNAL_PATHS) {
      如果(uri.startsWith (restrictedPath)) {
        字符串ip = req.getRemoteAddr ();
        if (!isAllowedIP (ip))
          抛出新的AdminAccessdeniedException.getSecurityService ().getAllowedAdminIPList()、ip);
        打破;
      }
    }
  }


方法跑龙套.canonicalizeURI尝试删除字符序列,比如重复的正斜杠, 双点表示法和冗余的点路径段在url路径, 如下所示.

  公共静态字符串canonicalizeURI(字符串uri) {
    If (uri == null || uri.长度()== 0
      返回uri;
    Uri = Uri.取代 ('\\', '/');
    uri = trimduplicateslash (uri);
    uri = collapseDotDots(uri); // <----
    uri = trimTrailingDotsSpacesNull(uri);
    如果(uri.charAt(0) ==.')
      Uri = Uri.substring (1);
    Uri = substitute(Uri, "/ ")./", "/");
    如果(uri.endsWith (" /."))
      Uri = Uri.substring (0, uri.长度()- 2);
    如果(uri.长度()== 0
      Uri = "/";
    返回uri;
  }

值得注意的是跑龙套方法.collapseDotDots, 哪个将删除所有包含双点的路径段以及前面的路径段. 例如,如果URL路径包含字符串“/hello/”../world/”则方法跑龙套.通过删除字符序列“/hello/”,collapseDotDots将正确地将此字符串转换为“/world/”..,通过调用StringBuffer.删除如下所示.

  public static String collapseDotDots(String str) {
    如果(str.indexOf (" /..") == -1)
      返回str;
    StringBuffer sb = new StringBuffer(str);
    int我;
    While ((i) = STR.indexOf (" /..")) != -1) {
      int分段start = str.lastIndexOf('/', i - 1);
      sb.delete(segmentStart, i + 3); // <----
      某人.toString ();
    }
    如果(str.长度()== 0
      STR = "/";
    返回str;
  }  

该方法 跑龙套.canonicalizeURI 尝试删除字符序列,如重复的正斜杠, 双点表示法和冗余的点路径段在url路径, 如下所示.

  公共静态字符串canonicalizeURI(字符串uri) {
    If (uri == null || uri.长度()== 0
      返回uri;
    Uri = Uri.取代 ('\\', '/');
    uri = trimduplicateslash (uri);
    uri = collapseDotDots(uri); // <----
    uri = trimTrailingDotsSpacesNull(uri);
    如果(uri.charAt(0) ==.')
      Uri = Uri.substring (1);
    Uri = substitute(Uri, "/ ")./", "/");
    如果(uri.endsWith (" /."))
      Uri = Uri.substring (0, uri.长度()- 2);
    如果(uri.长度()== 0
      Uri = "/";
    返回uri;
  }

值得注意的是方法跑龙套.collapseDotDots”, 哪个将删除所有包含双点的路径段以及前面的路径段. 例如,如果URL路径有字符串' " /hello/../world/ " '然后方法' 跑龙套.通过删除字符序列“/hello/”,collapseDotDots '将正确地将此字符串转换为' " /world/ " '..' '通过调用' StringBuffer.删除',如下所示.

  public static String collapseDotDots(String str) {
    如果(str.indexOf (" /..") == -1)
      返回str;
    StringBuffer sb = new StringBuffer(str);
    int我;
    While ((i) = STR.indexOf (" /..")) != -1) {
      int分段start = str.lastIndexOf('/', i - 1);
      sb.delete(segmentStart, i + 3); // <----
      某人.toString ();
    }
    如果(str.长度()== 0
      STR = "/";
    返回str;
  }  

而以上是正确的, 它暴露了ColdFusion在解析到端点的路径时如何处理ColdFusion模块(CFM)和ColdFusion组件(CFC)端点的问题. 如果攻击者访问的URL路径为 “/ hax /..CFIDE /术士/共同/跑龙套.氯氟化碳” 可以绕过访问控制,仍然可以到达预期的端点, 即使它不是一个有效的URL路径 (注意,在双点之后和CFIDE之前没有预期的正斜杠).

处理此路径后,方法 跑龙套.collapseDotDots 将转型之路引向 “cfide /向导/共同/跑龙套.氯氟化碳” 通过删除双点路径段和前面的段“/ hax /..”. 的路径 “cfide /向导/共同/跑龙套.氯氟化碳” 将不会与RESTRICTED_INTERNAL_PATHS中的任何受限路径匹配 IPFilter跑龙套.checkAdminAccess 因为它不再以正斜杠开头. 这绕过了访问控制. 但是,底层Servlet仍将处理该路径 “/ hax /..CFIDE /术士/共同/跑龙套.氯氟化碳”,允许调用预期的CFC端点. CFM端点也是如此.

剥削

以下是在Adobe ColdFusion 2021 Update 8(2021 .)上进行的测试.0.08.330144)在Windows Server 2022上运行,并配置了生产和安全配置文件.

我们可以通过使用cURL命令来演示补丁绕过. 对象上执行远程方法调用时 / CFIDE向导/共同/跑龙套.氯氟化碳 端点, 可以使用以下cURL命令-注意使用双点表示法,如下所示:

注:与符号(&)已经用插入符号(^)转义,因为这个例子是从Windows运行的, 在Linux上,必须用正斜杠(\)转义与符号。.

c:\> curl -ivk --path-as-is http://172.25.25.0:8500 hax /..CFIDE /术士/共同/跑龙套.氯氟化碳?方法= wizardHash ^&inPassword = foo

我们可以看到cve - 2023 - 29298的访问控制和补丁都被绕过了,请求成功完成.

修复

Adobe于2023年7月19日发布了此漏洞的修复程序. 下面的版本修复了这个问题 Adobe的咨询:

  • Adobe ColdFusion 2023更新
  • Adobe ColdFusion 2021更新
  • Adobe ColdFusion 2018更新19

自从Rapid7观察到在野外的开发, 我们强烈建议ColdFusion客户尽快更新到最新版本, 无需等待典型的补丁周期发生.

时间轴

  • 4月11日至7月10日, 2023年:Rapid7向Adobe披露cve - 2023 - 29298, Rapid7和Adobe协调披露
  • 2023年7月11日:Rapid7和Adobe 披露 cve - 2023 - 29298 公开
  • 7月13日至15日, 2023年:Rapid7检测到Adobe ColdFusion在野外的利用, 确定攻击者正在利用以远程代码执行结束的漏洞利用链
  • 2023年7月17日:Rapid7警告客户 ColdFusion剥削 在野外. Rapid7发现cve - 2023 - 29298的补丁可以绕过,并通知Adobe. Adobe通知Rapid7他们修复补丁绕过的意图.
  • 2023年7月19日:这个 信息披露.