Barsa-rana982/AI-Based-Phishing-Detection-System

GitHub: Barsa-rana982/AI-Based-Phishing-Detection-System

结合静态规则、XGBoost和LLM三重检测的钓鱼URL与邮件分析系统,通过Streamlit应用提供可视化风险评估与可解释报告。

Stars: 0 | Forks: 0

# 钓鱼欺诈对抗 一个钓鱼 URL 分析器,将三种独立的检测方法—— 静态规则分析、训练好的 XGBoost ML 模型以及 LLM 语义 推理——整合到一个 Streamlit Web 应用程序中。 ## 功能 - **静态分析** — 17 种基于规则的信号(IP 主机、URL 缩短服务、 typosquatting、同形异义词欺骗、子域名中包含品牌名、可疑路径 关键词、高域名熵、punycode/IDN、可疑 TLD、过多的 子域名、长 URL、URL 中的 `@`、纯 HTTP、重定向参数、数字 域名、双重文件扩展名、非标准端口、十六进制编码的域名) - **ML 模型** — 在 18 个 URL 衍生特征上训练的 XGBoost 分类器,具备 SHAP 可解释性 - **LLM 分析** — 使用 Ollama(本地/免费)或 OpenAI API 在 基于规则的信号之上进行语义推理 - **单 URL 拆解** — 评分、触发的信号、熵、最接近的安全域名、 Levenshtein 距离 - **风险仪表盘** — 可视化的 0–100 分数,带有颜色编码的区间 - **分析历史** — 每次扫描都会记录到 `history.csv` - **可下载报告** — PDF(需要 fpdf2)或纯文本 ## 项目结构 ``` ├── app.py # Streamlit web UI ├── url.py # URL extraction + static signal analysis ├── classify.py # ML model training (XGBoost, Random Forest, Logistic Regression) ├── llm_url.py # LLM backend (Ollama / OpenAI) ├── evaluate_cross_corpus.py # Leave-one-corpus-out validation ├── ablation_ml_contribution.py # Ablation: ML contribution vs rule score ├── requirements.txt # Python dependencies (pinned) ├── model.pkl # Trained XGBoost model (generated by classify.py) ├── LICENSE # MIT └── README.md ``` ## 数据集 本项目使用 Kaggle 上 Naser Abdullah Alam 发布的公开 **[Phishing Email Dataset](https://www.kaggle.com/datasets/naserabdullahalam/phishing-email-dataset)** — 这是一个众所周知的电子邮件语料库集合。原始的 CSV 文件**未提交到此存储库**(它们总计约 100 MB,最好 引用来源而不是重新托管);请在训练前从 Kaggle 下载它们。 本项目的 URL 分析管道使用四个带有 `urls` 列的语料库(每封邮件标记为 `1` = 钓鱼 / `0` = 合法): | 文件 | 行数 | 钓鱼邮件 | 合法邮件 | 来源 | |------|-----:|---------:|------:|--------| | `CEAS_08.csv` | 39,154 | 21,842 | 17,312 | CEAS 2008 垃圾邮件检测挑战赛 | | `SpamAssassin.csv` | 5,809 | 1,718 | 4,091 | SpamAssassin 公开语料库 | | `Nigerian_Fraud.csv` | 3,332 | 3,332 | 0 | “尼日利亚” 419 欺诈信件 (1998–2007) | | `Nazario.csv` | 1,565 | 1,565 | 0 | José Nazario 钓鱼邮件收集 | 每一行包含:`sender, receiver, date, subject, body, label, urls`。 ### 如何获取数据 ``` pip install kaggle # 需要免费的 Kaggle 账户 + API token (kaggle.json) kaggle datasets download -d naserabdullahalam/phishing-email-dataset \ -p "Phishing Email Dataset/" --unzip ``` `Phishing Email Dataset/` 文件夹已被 git 忽略,因此数据会保留在本地。 ## 安装 ``` pip install -r requirements.txt ``` 对于本地 LLM 后端: ``` pip install ollama ollama pull llama3.2 ``` OpenAI 后端(`pip install openai`)可在任何地方运行——用户需要在 应用侧边栏中提供 API 密钥。 ## 用法 **1. 从数据集中提取 URL 特征** ``` python url.py --input "Phishing Email Dataset" --output analysis.csv ``` **2. 训练 ML 模型** ``` python classify.py --analysis analysis.csv --dataset "Phishing Email Dataset" ``` 这将打印出 Logistic Regression、Random Forest 和 XGBoost 的 5 折交叉验证结果 (precision、recall、F1、ROC-AUC),然后将训练好的模型保存到 `model.pkl`。 **3. 运行 Web 应用** ``` streamlit run app.py ``` 打开 ,粘贴 URL 或电子邮件正文,然后点击 **Analyse**。 ## 这三种评分的工作原理 | 方法 | 百分比含义 | 计算方式 | |--------|------------------|--------------------| | 静态分析 | 触发了多少风险规则,按严重程度加权 | 累加固定点数的启发式方法,上限为 100 | | ML | 输入为钓鱼邮件的概率 | 基于 18 个汇总特征的 XGBoost `predict_proba` | | LLM | LLM 自我报告对其自身判断的确信度 | LLM JSON 响应字段(未根据真实值进行校准) | 这三种方法是独立的,通常会得出不同的值——这是 预期之中的设计行为。 ## 模型性能 基于合并数据集(`classify.py`)的 **5 折分层交叉验证** 结果。 运行训练步骤即可重现这些数据。 | 模型 | Precision | Recall | F1 | ROC-AUC | |-------|----------:|-------:|---:|--------:| | Logistic Regression | | | | | | Random Forest | | | | | | **XGBoost**(主要) | | | | | XGBoost 是发布的模型;SHAP 特征重要性(在应用程序中显示并由 `classify.py` 打印)解释了哪些信号驱动了每次预测。 ### 跨语料库验证(模型是否具有泛化能力?) 标准的 5 折 CV 会将所有语料库混合在一起——这是一个公平的同分布 评估,但它无法排除模型学到了电子邮件来自*哪个语料库*的情况。 `evaluate_cross_corpus.py` 使用 **留一语料库法 (leave-one-corpus-out)** 验证对此进行了测试:在除一个语料库之外的所有语料库上进行训练,在训练中从未见过的保留语料库上进行测试。 ``` python evaluate_cross_corpus.py --analysis analysis.csv --dataset "Phishing Email Dataset" ``` | 保留语料库 | Precision | Recall | F1 | ROC-AUC | |-----------------|----------:|-------:|---:|--------:| | CEAS_08 | | | | | | SpamAssassin | | | | | | Nigerian_Fraud | | | | n/a | | Nazario | | | | n/a | ### 消融实验:ML 增加了多少价值? XGBoost 模型接收 `max_risk_score`(规则引擎的综合评分)作为 特征之一。`ablation_ml_contribution.py` 通过三种 5 折 CV 配置 检查 ML 是学习到了独立的信号还是仅仅在重复该评分。 ``` python ablation_ml_contribution.py --analysis analysis.csv --dataset "Phishing Email Dataset" ``` | 配置 | F1 | ROC-AUC | |--------|---:|--------:| | A — 完整(18 个特征) | | | | B — 减去规则评分 | | | | C — 仅规则评分 | | | *A − B* 较小 ⇒ ML 不依赖于规则评分(方法保持独立)。 *A − C* 为正 ⇒ ML 在规则引擎之上增加了价值。 ## 数据考量与局限性 这四个语料库被合并为一个带标签的训练集。合并 保留了每封电子邮件的内容和标签,但有一些属性 会影响准确率的解读: - **不同来源间的类别不平衡。** Nazario 和 Nigerian_Fraud 是 纯钓鱼邮件;SpamAssassin 大部分是合法的。合并成分差异如此之大的语料库 可能会诱使模型去学习邮件来自*哪个语料库*, 而不是去学习使其成为钓鱼邮件的特征。 - **为什么本项目相对稳健。** 训练使用的是 **URL 结构**特征 (typosquatting、熵、子域名中包含品牌名、可疑 TLD 等),而不是 原始电子邮件文本。URL 结构反映了攻击者的行为,其跨语料库的 泛化能力远好于文体特征。不平衡问题也得到了 明确的处理(LR/RF 使用 `class_weight="balanced"`,XGBoost 使用 `scale_pos_weight`)。 - **仅限静态分析。** 没有 DNS、WHOIS 或实时页面抓取——位于受感染的*合法*域名 (外观整洁的 URL)上的钓鱼页面不会被标记。 - **应如何解读结果。** CV 数据是公平的同分布评估; 对于较新的钓鱼工具包和未知域名,实际场景中的性能可能会 更低。该工具最好作为结合了三项独立检查的**决策支持信号**来使用, 而不是作为孤立的最终判断。 ## LLM 配置 从应用程序的侧边栏中选择后端: | 后端 | 设置 | 备注 | |---------|---------|-------| | Ollama(默认) | 模型名称(例如 `llama3.2`) | 免费,在本地运行 — 需要安装 Ollama | | OpenAI API | API 密钥 + 模型(例如 `gpt-4o-mini`) | 需要 OpenAI 账户 | ## 风险评分指南 | 评分 | 判定 | |-------|---------| | 0 | 可能安全 | | 1–20 | 低风险 | | 21–50 | 中等风险 — 需谨慎对待 | | 51–75 | 可能是钓鱼 | | 76–100 | 几乎可以确定是钓鱼 | ## 部署 在 **[Streamlit Community Cloud](https://share.streamlit.io)** 上免费部署: 使用 GitHub 登录 → *New app* → 选择此存储库,主文件 `app.py` → Deploy。 免费层级提供 3 个应用,具有 1 GB 资源限制,并在推送时自动重新部署。 ## 许可证 在 [MIT License](LICENSE) 下发布。
标签:AI风险缓解, Apex, DLL 劫持, Kubernetes, Petitpotam, Streamlit, XGBoost, 云计算, 大语言模型, 安全分析工具, 机器学习, 规则引擎, 访问控制, 逆向工具, 钓鱼检测