一、模块概述
联系人信任图谱引擎 (contact_trust_graph.rs) 是 Rust 邮件安全系统的核心防御模块之一,基于邮件交互历史构建联系人评估模型,动态计算信任等级和风险评分,识别社会工程攻击和异常行为模式。本模块源码 962 行核心 + 555 行 C FFI + 16 个单元测试,定位于攻击链中"人"这一最薄弱环节的工程化防御。
二、信任评估模型
引擎采用 五维加权评估模型,满分 100 分:
| 评估维度 | 分值 | 核心指标 |
|---|---|---|
| 交互频次分 | 0-30 | 邮件总数 + 最近活跃度加权 |
| 回复率分 | 0-25 | 双向交互比例(呼出/呼入) |
| 时间衰减分 | 0-20 | 最后一次交互距今时长(指数衰减) |
| 一致性分 | 0-15 | 交互模式稳定性(方差检测) |
| 风险调整分 | 0-10 | 黑名单标志/风险举报扣减 |
三、五级信任等级
基于五维评分映射到离散的信任等级:
| 等级 | 分值区间 | 判定条件 |
|---|---|---|
| None | 0 | 无交互记录或已被黑名单 |
| Low | 1-30 | 少量交互或单向交互(total ≥ 1) |
| Medium | 31-60 | 稳定双向交互(total ≥ min_interactions,且有呼出记录) |
| High | 61-85 | 频繁双向交互且模式一致(total ≥ min*5,reply_ratio > 0.2) |
| Verified | 86-100 | 用户手动标记为可信联系人 |
四、五级风险等级与检测逻辑
风险等级独立于信任等级计算,基于严重度总分和标志计数双阈值判定:
if total_severity ≥ 15 || flag_count ≥ 4 { High }
else if total_severity ≥ 10 || flag_count ≥ 3 { Medium }
else if total_severity ≥ 5 || flag_count ≥ 1 { Low }
else { None }
五、10种风险标志
引擎内置 10 类风险标志,每个标志赋予 2-9 分的严重度权重:
| 风险标志 | 严重度 | 检测逻辑 |
|---|---|---|
| PhishingCompromise | 9 | 已知钓鱼特征匹配 |
| Spammer | 7 | 高发送量 + 低回复率 |
| SpoofedDomain | 8 | 域名与已知联系人高度相似(防域名伪造) |
| HighRiskDomain | 6 | 高风险TLD/新注册域名 |
| SuspiciousActivity | 5 | 交互模式异常(突发批量/频率异常) |
| UserReported | 5 | 用户手动举报 |
| HighBounceRate | 4 | 退信率超阈值(bounce_ratio > 0.3) |
| BulkSender | 3 | 单日发送量 ≥ bulk_send_threshold (默认20) |
| AbnormalTiming | 3 | 异常时间发送(凌晨/节假日突发) |
| LowReplyRate | 2 | 长期单向骚扰(reply_ratio < 0.2) |
六、核心数据结构
每个联系人维护一个 ContactProfile:
struct ContactProfile {
email: String, // 规范化小写邮箱
domain: String, // 提取的域名
interactions: Vec<ContactInteraction>, // 交互记录序列
risk_flags: Vec<RiskFlag>, // 当前风险标志集合
is_verified: bool, // 用户确认可信
is_blacklisted: bool, // 黑名单标记
bounce_count: u32, // 退信计数
first_interaction: u64, // 首次交互时间戳
last_interaction: u64, // 末次交互时间戳
}
七、C FFI 层 (555行)
FFI 层通过 OnceLock<Mutex<String>> 管理全局错误状态,暴露 12 个 C 导出函数:
rust_contact_trust_graph_create() // 创建引擎实例
rust_contact_trust_record_interaction() // 记录交互事件
rust_contact_trust_analyze() // JSON 输入输出信任分析
rust_contact_trust_get_level() // 获取信任等级 (i32)
rust_contact_trust_get_risk() // 获取风险等级 (i32)
rust_contact_trust_verify() // 标记可信
rust_contact_trust_blacklist() // 加入黑名单
rust_contact_trust_quick_score() // 快速评分 (0-100)
rust_contact_trust_stats() // 全局统计 JSON
rust_contact_trust_config() // 配置 JSON 导出
rust_contact_trust_get_error() // 获取最后错误
rust_contact_trust_free_string() // 释放字符串内存
八、高管保护与BEC联动
引擎与 bec_detector.rs(BEC 商业电子邮件妥协检测引擎)联动,对标记为"高管"的联系人启用更严格的信任验证:
- 高管发件人邮件要求最低 Medium 信任等级才允许执行敏感操作(如转账、数据导出指令)
- 当检测到
SpoofedDomain标志并针对高管时,触发即时告警 - 高管的交互记录采用更短的衰减半衰期(30天 vs 普通联系人60天)
九、单元测试(16个)
测试用例覆盖所有核心路径:
- test_record_interaction: 记录交互并更新统计
- test_trust_levels_none_low: 无交互和少量交互的等级判定
- test_trust_levels_medium_high: 稳定双向交互的等级判定
- test_blacklist_trust_override: 黑名单强制覆盖信任等级
- test_verify_trust_override: 验证标记强制提升信任等级
- test_risk_flag_detection_low_reply: 低回复率自动标记
- test_risk_flag_detection_bulk_sender: 批量发送标记
- test_risk_level_calculation: 风险等级双阈值判定
- test_confidence_score: 交互量与置信度的正相关
- test_quick_score_blacklist: 黑名单联系人快速评分归零
- test_contact_stats_distribution: 统计分布数组正确性
- test_remove_contact_updates_stats: 删除联系人同步更新统计
- test_known_contact_lookup: 已知联系人查询
- test_config_defaults: 默认配置参数验证
- test_analyze_with_history: 批量导入历史交互后的分析结果
- test_ffli_error_handling: FFI 层空指针和无效参数错误处理
十、设计取舍分析
1. 为什么不使用图算法(PageRank/社区发现)?
联系人信任本质上是一对一的关系评估,引入图计算(PageRank、社区发现)会增加 O(V+E) 复杂度但收益有限。实际场景中,用户需要快速判断"这封邮件是否来自可信的人",而非"这个联系人在网络中处于什么位置"。
2. 离散等级 vs 连续分数?
同时提供两种输出:信任等级 (0-4 离散) 用于策略判定(如 Medium 以上放行),置信度 (0.0-0.95 连续) 用于 UI 展示和进一步的评分融合。这种设计平衡了工程决策的确定性和用户体验的丰富性。
3. 风险标志的严重度为什么是硬编码的?
不同组织的风险偏好差异很大。当前采用硬编码严重度(2-9)而非可配置权重,是为了保证 FFI 调用方不需要额外的序列化/反构开销。未来可通过 TrustGraphConfig 扩展支持自定义权重。
十一、总结
联系人信任图谱引擎以 962 行精炼的 Rust 代码 实现了完整的联系人评估流水线:交互采集 → 信任评分 → 风险检测 → 策略输出。其设计哲学体现了"以数据驱动信任"的理念 — 不是静态的白名单/黑名单二选一,而是基于持续的行为积累动态调整信任判断。这使其成为防范 BEC 攻击和社会工程钓鱼的关键防线。

发表评论 取消回复