AegisJava:轻松检测Java关键漏洞CVE-2025-30749

23 阅读4分钟

AegisJava:CVE-2025-30749 漏洞检测工具

AegisJava 是一个专门用于检测和缓解 CVE-2025-30749 的工具,该漏洞是 Oracle Java SE 中一个严重的高危远程代码执行(RCE)漏洞。

📋 项目概述

AegisJava 旨在帮助开发者和系统管理员快速识别其环境中是否存在因 Java 2D 组件问题而导致的 CVE-2025-30749 漏洞。该漏洞严重性高(CVSS 8.1),可能导致未经身份验证的远程代码执行。

✨ 功能特性

  • 精准检测:自动检测系统中安装的 Java 版本并进行解析。
  • 漏洞比对:基于内置的漏洞数据库,精准比对受影响的 Java 版本列表。
  • 清晰报告:提供清晰的风险状态提示(安全/存在风险/未知),并输出易于理解的检测结果。
  • 修复指导:当检测到存在风险的版本时,会给出具体的版本升级建议。
  • 轻量易用:使用纯 Python 编写,依赖少,开箱即用。

🛠️ 安装指南

系统要求

  • Python 3.x
  • 系统中已安装 Java 并将其添加到系统 PATH 环境变量中(用于版本检测)。

安装步骤

由于项目是独立的 Python 脚本,无需复杂安装。

  1. 克隆或下载项目代码到本地。
    git clone <项目仓库地址>
    cd AegisJava
    
  2. 确保你的 Python 环境就绪,脚本无额外第三方库依赖。

🚀 使用说明

基础使用

  1. 打开终端,进入项目 src 目录。
  2. 运行扫描器:
    python3 scanner.py
    
  3. 查看并解读结果:
    • SAFE:您的 Java 版本不在已知的受影响版本列表中。
    • VULNERABLE:您的 Java 版本在 2025 年 7 月的关键补丁更新中已被修复。请立即更新!
    • UNKNOWN:无法确定 Java 版本或检测状态。

典型输出示例

运行 python3 scanner.py 后,你可能会看到类似以下的结果:


Checking for CVE-2025-30749...
[+] Detected Java Version: 1.8.0_451

[!] CRITICAL WARNING: Your Java version (1.8.0_451) is VULNERABLE to CVE-2025-30749.
    Description: A critical vulnerability in Java 2D allowing RCE.

[+] RECOMMENDATION: Update immediately to Java 8u461 or later.

📝 核心代码

以下是 scanner.py 中的主要代码模块,它们构成了扫描器的核心逻辑。

1. Java 版本检测模块

此函数通过调用系统命令 java -version 并解析其输出来获取当前安装的 Java 版本信息。

def get_java_version():
    """Detects the installed Java version."""
    try:
        # 运行 java -version。注意:该命令输出到 stderr。
        result = subprocess.run(['java', '-version'], capture_output=True, text=True)
        output = result.stderr
        
        # 解析版本字符串(例如:"java version \"1.8.0_451\"" 或 "openjdk 11.0.27")
        # 用于捕获 major.minor.patch 或 8uXYZ 格式的正则表达式
        match = re.search(r'version "([^"]+)"', output)
        if match:
            return match.group(1), output
        
        # 尝试匹配 OpenJDK 格式
        match = re.search(r'openjdk version "([^"]+)"', output)
        if match:
            return match.group(1), output

        return None, output
    except FileNotFoundError:
        return None, "Java executable not found in PATH."

2. 漏洞检查模块

此函数将检测到的 Java 版本与从 vulnerable_versions.json 加载的数据库进行比对,判断其是否受 CVE-2025-30749 影响。

def check_vulnerability(version_str, data):
    """Checks if the version is vulnerable."""
    if not version_str:
        return "UNKNOWN", "Could not determine Java version."

    # 为特定 CVE 简化的版本比对逻辑
    # CVE-2025-30749 影响版本: 8u451, 11.0.27, 17.0.15, 21.0.7, 24.0.1
    
    affected_list = []
    for item in data["affected_versions"]:
        affected_list.extend(item["versions"])

    is_vulnerable = False
    detected_major = ""

    # 处理 1.8.0_451 -> 8u451 格式转换
    if version_str.startswith("1.8.0_"):
        update_ver = version_str.split("_")[1]
        formatted_ver = f"8u{update_ver}"
        detected_major = "8"
        if formatted_ver in affected_list:
            is_vulnerable = True
    else:
        # 处理 11.0.27 等格式
        if version_str in affected_list:
            is_vulnerable = True
            detected_major = version_str.split(".")[0]

    if is_vulnerable:
        return "VULNERABLE", detected_major
    
    return "SAFE", detected_major

3. 主程序逻辑

这是扫描器的主入口点,它协调加载数据、检测版本、评估风险并输出最终报告。

def main():
    print("--- AegisJava Scanner ---")
    print(f"Checking for {load_vulnerability_data()['cve']}...")
    
    version_str, raw_output = get_java_version()
    
    if not version_str:
        print("[-] Java not found or could not be parsed.")
        print(f"    Raw output: {raw_output.strip()}")
        return

    print(f"[+] Detected Java Version: {version_str}")
    
    data = load_vulnerability_data()
    status, major_ver = check_vulnerability(version_str, data)

    if status == "VULNERABLE":
        print(f"\n[!] CRITICAL WARNING: Your Java version ({version_str}) is VULNERABLE to {data['cve']}.")
        print(f"    Description: {data['description']}")
        
        fixed_ver = data["fixed_versions"].get(major_ver)
        if fixed_ver:
            print(f"\n[+] RECOMMENDATION: Update immediately to Java {fixed_ver} or later.")
        else:
            print("\n[+] RECOMMENDATION: Update to the latest Critical Patch Update (July 2025).")
            
    elif status == "SAFE":
        print(f"\n[+] System appears SAFE from {data['cve']} (based on version check).")
    else:
        print("\n[?] Status Unknown. Could not verify vulnerability.")

if __name__ == "__main__":
    main()

6HFtX5dABrKlqXeO5PUv/wiZUcFYM23dIu2w/wulgRs=