Databricks JDBC 驱动程序漏洞 (CVE-2024-49194)

310 阅读3分钟

问题: Databricks JDBC 驱动程序中存在一个漏洞,可能允许远程代码执行 (RCE)。攻击者可以利用 JNDI 注入,通过特制的 JDBC URL 参数(krbJAASFile)来实现此目的。此漏洞的严重级别为高,已在 Databricks JDBC 驱动程序 2.6.40 及更高版本中修复。

受影响版本: 2.6.38 及以下

修复版本: 2.6.40 及以上

CVSSv3.1 评分: 7.3

原因: 漏洞的根本原因是驱动程序对 krbJAASFile 参数处理不当。 攻击者可以构造一个恶意的连接 URL,利用该参数,从而在驱动程序的上下文中执行任意代码。 这就像给了一个坏人可以打开你家门的钥匙(krbJAASFile),他可以偷偷溜进去做任何事情(执行任意代码)。

解决方案:

  1. 更新 JDBC 驱动程序: 这是最推荐的解决方案。 下载并安装 Databricks JDBC 驱动程序 2.6.40 或更高版本 [搜索结果1]。 这就像更换了更安全的门锁。

  2. 更新 JVM 配置: 如果无法更新 JDBC 驱动程序,可以更新 JVM(Java 虚拟机)配置,禁用 JNDI 的某些功能,以降低风险。 具体来说,将以下两个配置值设置为 false

    • com.sun.jndi.ldap.object.trustURLCodebase
    • com.sun.jndi.ldap.object.trustSerialData

    这就像给你的房子加装了额外的安全措施,即使坏人有了钥匙,也无法轻易进入。

    代码示例:设置 JVM 参数

    System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase", "false");
    System.setProperty("com.sun.jndi.ldap.object.trustSerialData", "false");
    

    在启动 Java 应用程序之前,你需要添加这两个参数。 例如,如果你使用命令行运行 Java 程序,可以这样添加:

    java -Dcom.sun.jndi.ldap.object.trustURLCodebase=false -Dcom.sun.jndi.ldap.object.trustSerialData=false  YourApplication.jar
    

实际应用例子:

假设你是一家电商公司,使用 Databricks 分析用户行为数据。 你的 Java 应用程序使用 JDBC 驱动程序连接到 Databricks 集群。 如果你使用的 JDBC 驱动程序版本低于 2.6.40,并且没有更新 JVM 配置,那么攻击者可能会利用此漏洞,通过修改你的 JDBC 连接 URL,远程执行恶意代码,例如窃取用户数据或者篡改交易记录。

如何检查你当前使用的 JDBC 驱动版本?

在你的 Java 代码中,你可以通过以下方式获取 JDBC 驱动程序的版本:

import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.SQLException;

public class GetDriverVersion {

    public static void main(String[] args) {
        try {
            // 加载 JDBC 驱动程序 (替换为你的驱动类名)
            Class.forName("com.databricks.client.jdbc.Driver");

            // 获取驱动程序对象
            java.sql.Driver driver = DriverManager.getDriver("jdbc:databricks://..."); // 替换为你的JDBC URL

            // 获取驱动版本
            String version = driver.getClass().getPackage().getImplementationVersion();

            System.out.println("JDBC 驱动程序版本: " + version);

        } catch (ClassNotFoundException e) {
            System.err.println("找不到 JDBC 驱动程序类: " + e.getMessage());
        } catch (SQLException e) {
            System.err.println("连接或获取驱动程序信息时出错: " + e.getMessage());
        }
    }
}

重要提示:

  • 尽快更新你的 JDBC 驱动程序到最新版本。
  • 如果无法更新驱动程序,请务必更新 JVM 配置。
  • 如果你有任何疑问,请联系 Databricks 支持团队。

总结:

此漏洞是一个严重的安全问题,需要立即采取行动。 通过更新 JDBC 驱动程序或 JVM 配置,你可以有效地降低风险,保护你的系统安全。