OrAtias99/phish-scan
GitHub: OrAtias99/phish-scan
一款结合规则与机器学习的 Gmail 插件,用于检测并分类钓鱼邮件。
Stars: 0 | Forks: 0
# Phish Scan
### 邮件钓鱼检测系统与 Gmail 插件
# Phish Scan
### 邮件钓鱼检测系统与 Gmail 插件
## 1. 检测模型如何工作
Phish Scan 采用双层检测架构,结合基于规则的启发式方法与机器学习模型,将邮件分类为 **PHISHING(钓鱼)**、**SUSPICIOUS(可疑)** 或 **SAFE(安全)**。
### 1.1 启发式层(主要)
启发式引擎对解析后的邮件运行一组规则函数。每个规则返回一个带有严重程度和权重的信号。当前实现的规则包括:
- `URGENT_LANGUAGE` – 检测施压词汇(“urgent”、“act now”、“expires”)
- `SENSITIVE_INFO_REQUEST` – 检测对密码、OTP、信用卡、SSN 的请求
- `BEC_WIRE_TRANSFER` – 检测商业邮件入侵模式(IBAN、转账、新账户)
- `BEC_IMPERSONATION` – 检测高管冒充(CEO、CFO、董事)
- `BEC_SECRECY_REQUEST` – 检测要求保持通信秘密
- `CALLBACK_PHISHING` – 检测电话号码 + 未经授权的收费语言
- `GIFT_CARD_SCAM` – 检测购买礼品卡并发送代码的请求
- `SEXTORTION` – 检测摄像头威胁、比特币钱包要求、曝光威胁
- `BRAND_DOMAIN_MISMATCH` – 检测内容中的品牌名称与发件人域名不匹配
- `URL signals` – IP 主机、URL 缩短器、punycode、非 HTTPS、可疑 TLD、@ 符号
### 1.2 机器学习层(次要)
随机森林分类器在标记的邮件数据集上进行训练。它从每封邮件中提取 18 个数值特征,包括:
- 紧迫词汇数、敏感词汇数
- 正文长度(对数缩放)、感叹号数量、大写比例
- 基于 URL 的特征:IP 主机、缩短器、HTTPS、子域名数量、TLD 可疑度、punycode
- 品牌不匹配信号
机器学习模型使用以下数据集进行训练:
- HuggingFace 钓鱼邮件数据集(`zefang-liu/phishing-email-dataset`)
- 短信垃圾邮件/正常短信数据集(`dataset_SMS_spam_ham.tsv`)
- 合成备用示例(始终激活)
### 1.3 分数融合
最终分数是两层加权的混合:
```
final_score = 0.8 × heuristic_score + 0.2 × ml_score
```
分类阈值:
| 分数范围 | 标签 |
|----------|------|
| 71 – 100 | 🚨 PHISHING |
| 31 – 70 | ⚠️ SUSPICIOUS |
| 0 – 30 | ✅ SAFE |
### 1.4 客户端遥测(可选)
Gmail 插件可以可选地报告客户端检测到的可疑链接数量。此信号只能 **增加** 怀疑分数,绝不会降低。它上限为 20 个链接,以防止滥用。
## 2. 如何安装并使用 Gmail 插件
### 2.1 先决条件
- 已安装 Python 3.11+
- 具有 Gmail 访问权限的 Google 账户
- 用于暴露本地后端的 ngrok(免费账户)
- 已克隆的 phish-scan 仓库
### 2.2 步骤 1 – 设置后端
从项目根目录开始:
```
# Install dependencies
.venv-314\Scripts\pip install scikit-learn pandas fastapi uvicorn pydantic python-dotenv httpx
# Train the ML model
$env:PYTHONPATH = "."
python -m detector.detector.ml.train
# Start the backend server
$env:PHISHSCAN_API_KEY = "my-secret-key"
.venv-314\Scripts\python.exe -m uvicorn backend.service.main:app --reload --port 8000
```
### 2.3 步骤 2 – 使用 ngrok 暴露后端
```
ngrok http 8000
```
复制显示的 HTTPS URL(例如 `https://abc123.ngrok-free.app`)。
### 2.4 步骤 3 – 部署 Gmail 插件
1. 打开 [https://script.google.com](https://script.google.com) 并创建一个名为 **“Phish Scan”** 的新项目。
2. 上传仓库中 `addon/` 目录下的所有 `.gs` 文件。
3. 使用正确的 OAuth 范围更新 `appsscript.json`(参见 `addon/appsscript.json`)。
4. 进入 **项目设置 → 脚本属性** 并设置:
- `BACKEND_BASE_URL` = `https://abc123.ngrok-free.app`
- `BACKEND_API_KEY` = `my-secret-key`
5. 点击 **部署 → 测试部署 → Google Workspace 插件 → 安装**。
6. 打开 Gmail,打开任意邮件,并点击右侧边栏中的 **Phish Scan** 图标。
### 2.5 使用插件
安装后,插件可在 Gmail 中任意打开的邮件中使用:
1. 在 Gmail 中打开一封邮件
2. 点击右侧边栏中的 **Phish Scan** 图标
3. 点击 **“Scan for Phishing”**
4. 查看结果:标签(PHISHING / SUSPICIOUS / SAFE)、分数(0–100)和详细原因
## 3. 限制与未来改进
### 3.1 当前限制
- 机器学习模型在有限数据集上训练,可能无法泛化到所有钓鱼风格
- 后端在本地运行,Gmail 插件需要 ngrok 或云部署才能正常工作
- 不支持 HTML 邮件解析——仅分析纯文本正文
- 模型不分析邮件附件
- ngrok 免费层级会生成新的 URL,需要手动更新脚本属性
- Google Apps Script 插件尚未经过 Google 验证(仅限个人/测试使用)
### 3.2 未来改进
- 在包括 BEC、sextortion 和 callback phishing 示例的更大、更多样化的钓鱼数据集上进行训练
- 添加 HTML 邮件正文解析以提取隐藏 URL 和混淆文本
- 将后端部署到云提供商(例如 Google Cloud Run)以获得永久 URL
- 实现反馈循环——允许用户标记误报/漏报以改进模型
- 添加附件扫描支持(PDF、Office 文档)
- 扩大品牌冒充检测覆盖更多公司
- 添加对希伯来语等语言的多语言钓鱼检测支持
- 提交 Gmail 插件以通过 Google 验证并移除安全警告
## 4. 项目结构
```
phish-scan/
├── detector/
│ ├── heuristics/
│ │ ├── rules.py # Rule-based signal detection
│ │ └── scoring.py # Signal aggregation and scoring
│ ├── ml/
│ │ ├── featurize.py # Feature extraction for ML
│ │ ├── model_io.py # Model load/save with caching
│ │ └── train.py # Model training script
│ ├── parsing/
│ │ ├── email_parser.py # Email normalization
│ │ └── url_features.py # URL feature extraction
│ ├── artifacts/
│ │ ├── model.pkl # Trained ML model
│ │ ├── phishing_email.csv
│ │ └── dataset_SMS_spam_ham.tsv
│ └── pipeline.py # Main analysis pipeline
├── backend/
│ └── service/
│ ├── main.py # FastAPI app entry point
│ ├── api/
│ │ ├── routes.py # POST /scan endpoint
│ │ └── middleware.py # API key authentication
│ └── core/
│ └── config.py # Settings and configuration
├── addon/
│ ├── appsscript.json # Add-on manifest and OAuth scopes
│ └── src/
│ ├── handlers/
│ │ ├── scan_action.gs # Main scan handler
│ │ └── homepage.gs # Homepage trigger
│ ├── ui/
│ │ └── cards.gs # Gmail UI card builder
│ ├── api_client/
│ │ └── backend_client.gs # HTTP client for backend
│ └── gmail/
│ └── fetch_message.gs # Gmail message fetcher
└── README.md
```
## 1. 检测模型如何工作
Phish Scan 采用双层检测架构,结合基于规则的启发式方法与机器学习模型,将邮件分类为 **PHISHING(钓鱼)**、**SUSPICIOUS(可疑)** 或 **SAFE(安全)**。
### 1.1 启发式层(主要)
启发式引擎对解析后的邮件运行一组规则函数。每个规则返回一个带有严重程度和权重的信号。当前实现的规则包括:
- `URGENT_LANGUAGE` – 检测施压词汇(“urgent”、“act now”、“expires”)
- `SENSITIVE_INFO_REQUEST` – 检测对密码、OTP、信用卡、SSN 的请求
- `BEC_WIRE_TRANSFER` – 检测商业邮件入侵模式(IBAN、转账、新账户)
- `BEC_IMPERSONATION` – 检测高管冒充(CEO、CFO、董事)
- `BEC_SECRECY_REQUEST` – 检测要求保持通信秘密
- `CALLBACK_PHISHING` – 检测电话号码 + 未经授权的收费语言
- `GIFT_CARD_SCAM` – 检测购买礼品卡并发送代码的请求
- `SEXTORTION` – 检测摄像头威胁、比特币钱包要求、曝光威胁
- `BRAND_DOMAIN_MISMATCH` – 检测内容中的品牌名称与发件人域名不匹配
- `URL signals` – IP 主机、URL 缩短器、punycode、非 HTTPS、可疑 TLD、@ 符号
### 1.2 机器学习层(次要)
随机森林分类器在标记的邮件数据集上进行训练。它从每封邮件中提取 18 个数值特征,包括:
- 紧迫词汇数、敏感词汇数
- 正文长度(对数缩放)、感叹号数量、大写比例
- 基于 URL 的特征:IP 主机、缩短器、HTTPS、子域名数量、TLD 可疑度、punycode
- 品牌不匹配信号
机器学习模型使用以下数据集进行训练:
- HuggingFace 钓鱼邮件数据集(`zefang-liu/phishing-email-dataset`)
- 短信垃圾邮件/正常短信数据集(`dataset_SMS_spam_ham.tsv`)
- 合成备用示例(始终激活)
### 1.3 分数融合
最终分数是两层加权的混合:
```
final_score = 0.8 × heuristic_score + 0.2 × ml_score
```
分类阈值:
| 分数范围 | 标签 |
|----------|------|
| 71 – 00 | 🚨 PHISHING |
| 31 – 70 | ⚠️ SUSPICIOUS |
| 0 – 30 | ✅ SAFE |
### 1.4 客户端遥测(可选)
Gmail 插件可以可选地报告客户端检测到的可疑链接数量。此信号只能 **增加** 怀疑分数,绝不会降低。它上限为 20 个链接,以防止滥用。
## 2. 如何安装并使用 Gmail 插件
### 2.1 先决条件
- 已安装 Python 3.11+
- 具有 Gmail 访问权限的 Google 账户
- 用于暴露本地后端的 ngrok(免费账户)
- 已克隆的 phish-scan 仓库
### 2.2 步骤 1 – 设置后端
从项目根目录开始:
```
# Install dependencies
.venv-314\Scripts\pip install scikit-learn pandas fastapi uvicorn pydantic python-dotenv httpx
# Train the ML model
$env:PYTHONPATH = "."
python -m detector.detector.ml.train
# Start the backend server
$env:PHISHSCAN_API_KEY = "my-secret-key"
.venv-314\Scripts\python.exe -m uvicorn backend.service.main:app --reload --port 8000
```
### 2.3 步骤 2 – 使用 ngrok 暴露后端
```
ngrok http 8000
```
复制显示的 HTTPS URL(例如 `https://abc123.ngrok-free.app`)。
### 2.4 步骤 3 – 部署 Gmail 插件
1. 打开 [https://script.google.com](https://script.google.com) 并创建一个名为 **“Phish Scan”** 的新项目。
2. 上传仓库中 `addon/` 目录下的所有 `.gs` 文件。
3. 使用正确的 OAuth 范围更新 `appsscript.json`(参见 `addon/appsscript.json`)。
4. 进入 **项目设置 → 脚本属性** 并设置:
- `BACKEND_BASE_URL` = `https://abc123.ngrok-free.app`
- `BACKEND_API_KEY` = `my-secret-key`
5. 点击 **部署 → 测试部署 → Google Workspace 插件 → 安装**。
6. 打开 Gmail,打开任意邮件,并点击右侧边栏中的 **Phish Scan** 图标。
### 2.5 使用插件
安装后,插件可在 Gmail 中任意打开的邮件中使用:
1. 在 Gmail 中打开一封邮件
2. 点击右侧边栏中的 **Phish Scan** 图标
3. 点击 **“Scan for Phishing”**
4. 查看结果:标签(PHISHING / SUSPICIOUS / SAFE)、分数(0–100)和详细原因
## 3. 限制与未来改进
### 3.1 当前限制
- 机器学习模型在有限数据集上训练,可能无法泛化到所有钓鱼风格
- 后端在本地运行,Gmail 插件需要 ngrok 或云部署才能正常工作
- 不支持 HTML 邮件解析——仅分析纯文本正文
- 模型不分析邮件附件
- ngrok 免费层级会生成新的 URL,需要手动更新脚本属性
- Google Apps Script 插件尚未经过 Google 验证(仅限个人/测试使用)
### 3.2 未来改进
- 在包括 BEC、sextortion 和 callback phishing 示例的更大、更多样化的钓鱼数据集上进行训练
- 添加 HTML 邮件正文解析以提取隐藏 URL 和混淆文本
- 将后端部署到云提供商(例如 Google Cloud Run)以获得永久 URL
- 实现反馈循环——允许用户标记误报/漏报以改进模型
- 添加附件扫描支持(PDF、Office 文档)
- 扩大品牌冒充检测覆盖更多公司
- 添加对希伯来语等语言的多语言钓鱼检测支持
- 提交 Gmail 插件以通过 Google 验证并移除安全警告
标签:Apex, AV绕过, CEO/CFO冒充, FastAPI, Gmail插件, HTTPS, IP主机, OTP请求, Punycode, SSN请求, TLD可疑度, URGENT语言, URL信号, URL缩短器, 云计算, 企业安全, 信用卡请求, 分类系统, 勒索软件, 反钓鱼, 启发式检测, 品牌域名校验, 商务邮件诈骗BEC, 回调钓鱼, 子域名计数, 安全防护, 密码请求, 敏感信息请求, 未授权收费语言, 机器学习, 比特币钱包, 礼品卡诈骗, 秘密通信请求, 紧急语言, 网络摄像头威胁, 网络资产管理, 规则引擎, 逆向工具, 邮件分析, 邮件安全, 钓鱼检测, 链接检测, 随机森林