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, 域名枚举, 子域名突变, 无后门, 本地大模型, 机器学习, 请求拦截, 逆向工具