shrihari7396/Pdf-Malware-Detection-System

GitHub: shrihari7396/Pdf-Malware-Detection-System

结合机器学习与本地大语言模型的 PDF 恶意软件检测系统,能自动预测文件风险并生成详尽的 HTML 安全分析报告。

Stars: 1 | Forks: 1

# 🛡️ PDF 恶意软件检测系统 ### 机器学习 + AI 驱动的 PDF 风险分析器 ### Spring Boot 后端 | 本地 Ollama LLM | Streamlit 前端 ## 📌 概述 本系统采用混合方法分析 **PDF 文件是否包含恶意软件**,该方法结合了: 1. **机器学习模型 (Python)** → 预测*恶意 / 良性* 2. 使用 **PDFBox (Java)** 进行 **PDF 结构特征提取** 3. 通过 **本地 Ollama 模型** 生成 **基于 AI LLM 的分析** 4. **Streamlit 前端** → 上传文件并显示 HTML 报告 系统生成: - ML 预测 - 置信度得分 - 提取的 PDF 特征 - AI 生成的恶意软件分析报告 (HTML) - 在 Streamlit UI 中渲染的精美报告 # ⭐ 功能 - 📄 PDF 特征提取(元数据、对象、脚本、加密、页面数据) - 🧠 基于 ML 的恶意软件预测(`malicious`、`benign`) - 🤖 通过 **Ollama** 生成 LLM 驱动的 HTML 分析 - 🔐 采用 Base64 编码的 HTML 响应以确保安全 - 🎨 针对深色模式用户固定浅色背景的 Streamlit UI - ⚡ 使用轻量级本地模型优化,响应时间 < 15 秒 - 🧱 模块化、可扩展、可延伸的架构 # 🏗️ 系统架构 ``` [Streamlit UI] │ Upload PDF ▼ [Spring Boot Backend] ├── PdfFeatureExtractor (PDFBox) ├── PythonPredictClient (WebClient → Python ML API) ├── AiAnalysisBuilderService (merges ML + metadata) ├── AiService (WebClient → Ollama LLM) ▼ [Local Ollama Model] │ Returns HTML (Base64) ▼ [Streamlit → Base64 Decode → Display HTML Report] ``` # 📂 项目结构 ``` backend/ ├── controller/ ├── service/ │ ├── PdfFeatureExtractor.java │ ├── PythonPredictClient.java │ ├── AiAnalysisBuilderService.java │ ├── AiService.java ├── dtos/ │ ├── AIAnalysisRequest.java │ ├── PredictionResponse.java ├── config/ │ ├── WebFluxConfig.java ├── application.yml frontend/ └── app.py (Streamlit UI) ``` # ⚙️ 使用的技术 | 组件 | 技术 | |----------|------------| | ML 模型 | Python, Scikit-Learn, Pickle | | LLM | Ollama (Llama, Mistral, Qwen, Phi3, Gemma) | | 后端 | Spring Boot (Java 21) | | PDF 解析 | Apache PDFBox | | 网络 | Spring WebClient | | 前端 | Streamlit | | 编码 | Base64 | | 输出格式 | HTML | # 🚀 设置与安装 ## 1️⃣ 安装 Ollama 下载:**https://ollama.com/download** 推荐的快速模型: ``` ollama pull phi3:3b ollama pull qwen2.5:3b ollama pull gemma3:latest ``` 运行模型: ``` ollama run gemma3 ``` ## 2️⃣ 克隆仓库 ``` git clone https://github.com/shrihari7396/pdf-malware-analysis.git cd pdf-malware-analysis ``` ## 3️⃣ 后端 (Spring Boot) ### 安装 Java 21 确保已安装 Java 21。 ### 配置 `application.yml` ``` server: port: 8081 python: predict: url: http://localhost:5000/predict ai: analysis: url: http://localhost:8082/api/v1/ai/analyze ``` ### 运行后端 ``` ./mvnw spring-boot:run ``` 后端运行地址: ``` http://localhost:8081 ``` ## 4️⃣ ML 预测服务器 (Python) 运行: ``` python app.py ``` ML API endpoint: ``` POST /predict ``` ## 5️⃣ Streamlit 前端 ``` cd frontend streamlit run app.py ``` 前端打开地址: ``` http://localhost:8501 ``` # 🔍 API 文档 ## 📌 1. `/scan` (主要 Endpoint) ``` POST http://localhost:8081/api/v1/scan Content-Type: multipart/form-data ``` ### 请求: 上传一个 PDF 文件。 ### 响应 (`PredictionResponse`): ``` { "prediction": "malicious", "confidence": 0.998, "features": { ... }, "explanation": { ... }, "htmlAnalysis": "BASE64_STRING" } ``` ## 📌 2. `/ai/analyze` ``` POST http://localhost:8082/api/v1/ai/analyze ``` ### 请求体 (`AIAnalysisRequest`): ``` { "prediction": "...", "confidence": 0.58, "features": { ... }, "extractedText": "...", "metadata": { ... }, "fileName": "sample.pdf", "fileSize": 12345 } ``` ### 响应: Base64 编码的 HTML 字符串。 # 🧠 优化后的 LLM Prompt ``` Generate a clean HTML malware report inside a single
. Return ONLY
...
. Use inline CSS only. Highlight malicious indicators in red and safe indicators in green. Keep the report concise. DATA: FileName=%s FileSize=%d Prediction=%s Confidence=%.2f Features=%s TextSummary=%s Metadata=%s ``` # 🎨 Streamlit UI(最终版本) 深色模式及显示问题的修复: ``` wrapped_html = f"""
{decoded_html}
""" st.components.v1.html(wrapped_html, height=1200, scrolling=True) ``` # ⚡ 性能优化 ### ✔ 推荐的快速本地模型: * `phi3:3b` * `qwen2.5:3b` * `mistral:7b` ### ✔ 将提取的文本减少至 300–400 个字符 ### ✔ 使用较短的 prompt ### ✔ 启用 GPU: ``` set OLLAMA_USE_CUDA=1 ``` ### ⚡ 结果: * ❌ 之前:~2 分钟 * ✅ 之后:**6–15 秒** # 🛠 故障排除 ### ❌ 推理缓慢 (> 60秒) ➡ 切换到更小的模型 + 精简 prompt ➡ 启用 CUDA ### ❌ Streamlit 中深色模式文字不可见 ➡ 使用白色背景容器包裹 HTML ### ❌ `@Value` 注入问题 ➡ 使用正确的 import: ``` import org.springframework.beans.factory.annotation.Value; ``` ### ❌ WebClient 为空 ➡ 添加 Bean: ``` @Bean public WebClient.Builder webClientBuilder() { return WebClient.builder(); } ``` # 🏁 结论 本系统: ✔ 完全模块化 ✔ 快速且经过优化 ✔ 本地化且保护隐私 ✔ 生成专业的 HTML 报告 ✔ 可扩展以适应企业网络安全工作流 ## ☸️ Kubernetes 部署 本项目支持 Kubernetes 部署。每个服务都有一个专用的 `deploy/` 目录,其中包含 `ConfigMap`、`Secret`、`Service` 和 `Deployment` 的 manifest,以及一个本地的 `deploy.sh` 脚本。 ### 📋 前置条件 - 一个运行中的 Kubernetes 集群(例如 Minikube、Kind 或云端托管的企业级 K8s 集群) - 配置好 `kubectl` CLI 以与您的集群通信 - 本地已安装 Docker / Podman ### 🏗️ 1. 构建 Container Image 在部署之前,您可以使用提供的 `build.sh` 脚本为所有服务构建 Docker 镜像。 如果您正在使用 Minikube,该脚本会自动检测到它,并将您的 Docker CLI 上下文指向 Minikube 的内部 Docker daemon,因此您无需手动将镜像推送到 registry: ``` chmod +x build.sh ./build.sh ``` ### 🚀 2. 将服务部署到 Kubernetes 从项目根目录运行主编排部署脚本: ``` chmod +x deployment.sh ./deployment.sh ``` 该脚本将按顺序执行每个文件夹中的 `deploy.sh` 脚本,并以正确的依赖顺序应用 Kubernetes manifest(`configmap.yml`、`secret.yml`、`service.yml`、`deployment.yml`): 1. **ModelApi**(内部端口 `8000` 上的 `model-api` 服务) 2. **AIService**(内部端口 `8082` 上的 `ai-service` 服务) 3. **Backend**(内部端口 `8081` 上的 `backend` 服务) 4. **Frontend**(端口 `8501` / NodePort `30501` 上的 `frontend` NodePort 服务) ### 🔎 3. 验证部署 要检查您的 deployment 和 pod 的状态,请运行: ``` kubectl get all ``` 要查看特定服务的日志: ``` kubectl logs -l app=backend --tail=100 kubectl logs -l app=ai-service --tail=100 ``` ### 🌐 4. 访问应用 由于前端通过 `NodePort` 服务(端口 `30501`)暴露,您可以通过以下方式访问它: - **Minikube**: minikube service frontend - **端口转发**(替代方案): kubectl port-forward svc/frontend 8501:8501 然后,打开您的浏览器并访问 `http://localhost:8501`。
标签:AI风险缓解, Apex, Kubernetes, PDF分析, Python, Spring Boot, 域名枚举, 子域名突变, 无后门, 本地大模型, 机器学习, 请求拦截, 逆向工具