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 脚本,无需复杂安装。
- 克隆或下载项目代码到本地。
git clone <项目仓库地址> cd AegisJava - 确保你的 Python 环境就绪,脚本无额外第三方库依赖。
🚀 使用说明
基础使用
- 打开终端,进入项目
src目录。 - 运行扫描器:
python3 scanner.py - 查看并解读结果:
- 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=