钓鱼邮件攻击早已不是简单的大批量垃圾邮件,而是越来越向精准化、场景化发展。攻击者会注册与目标域名相似的域名,伪造发件人地址,甚至先入侵内部邮箱账号,再向同事或合作伙伴发送极具迷惑性的邮件。传统邮件网关通常依赖关键词评分、黑名单和内容指纹来拦截垃圾邮件,但如果一封钓鱼邮件没有使用敏感的垃圾词,发送源也是新注册域名,就很容易穿透防线。因此,反钓鱼邮件技术需要从身份认证、内容检测和人的行为三个维度同时发力。

一、钓鱼邮件为何难以拦截:从伪造方式看防护盲区
钓鱼邮件的核心问题在于发件人身份不可信。SMTP 协议在设计之初并没有强制要求验证发件人身份,邮件中的 From 字段可以被任意填写。攻击者可以在邮件客户端中把显示名称改成“财务部”或某位高管的姓名,同时把信封发件人 Return-Path 指向自己的域名。普通收件人只能看到 From 字段,不会查看 Return-Path,许多传统网关也只检查 Return-Path 是否在黑名单中,这就给伪造留下了空间。
下面这段原始邮件头展示了一个典型的发件人伪造场景。要注意 From 字段中的显示名称和实际地址与 Return-Path 完全分离,这种不一致本身就是高风险信号。
From: "财务部" <finance@ipipp.com>
Return-Path: <attacker@evil.com>
Received: from mail.evil.com (mail.evil.com [203.0.113.10])
by mx.ipipp.com with ESMTPS id 8F3A21C2
for <user@ipipp.com>;
Tue, 15 Apr 2025 09:23:11 +0800
Subject: 紧急付款通知
除了直接伪造地址,攻击者还会使用相似域名,比如把字母 l 替换成数字 1、把 o 替换成 0,或者使用 .net、.co 等不同后缀注册同名主体。这类域名在视觉上足以欺骗忙碌中的收件人。另一种更难防范的情况是账号被入侵后发送邮件,此时邮件确实来自真实的发件人域,SPF、DKIM 检查都可能通过,只能依靠行为分析和收件人警惕来发现异常。
因此,反钓鱼邮件不能只依赖单一技术。有效的防御体系需要先解决“这封邮件是否真的来自它声称的发件人”这一基础问题,再配合内容检测和人的判断,形成多层防线。
二、用 SPF、DKIM、DMARC 验证发件人身份
SPF(Sender Policy Framework)是最早被广泛部署的邮件认证机制。它通过 DNS 中的 TXT 记录声明哪些 IP 地址或邮件服务器有权代表该域名发送邮件。收件服务器收到邮件后,会查询 From 域对应的 SPF 记录,检查实际发送服务器的 IP 是否在允许列表中。如果不在,SPF 检查失败。
ipipp.com. TXT "v=spf1 include:_spf.google.com ip4=192.0.2.0/24 -all"
上面这条记录表示:允许 Google 邮件服务器以及 192.0.2.0/24 网段内的 IP 代表 ipipp.com 发信,其他来源一律拒绝。SPF 的优点是简单直接,但它的检查对象是 Return-Path 域,而不是用户看到的 From 地址域。如果攻击者使用自己的域名通过 SPF 检查,同时把 From 显示名称伪装成目标公司,SPF 无法识别这种显示名欺诈。另外,SPF 在邮件转发场景下容易失效,因为转发服务器会改变发送 IP,导致检查失败。
DKIM(DomainKeys Identified Mail)则采用数字签名方式。发件服务器使用域名私钥对邮件的关键部分进行签名,公钥发布在 DNS 的特定选择器记录中。收件服务器收到邮件后,从邮件头中提取 DKIM 签名和选择器,查询对应 DNS 记录获取公钥,再验证邮件内容是否被篡改。DKIM 不依赖发送 IP,因此更适合转发场景,也能验证邮件内容完整性。
selector._domainkey.ipipp.com. TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC..."
DKIM 的签名域同样可以与 From 地址域不同。也就是说,即使攻击者用自己的域名对邮件进行 DKIM 签名,只要它能通过签名验证,接收方依然可以收到该邮件。为此,需要 DMARC 将它们统一起来。DMARC(Domain-based Message Authentication, Reporting and Conformance)要求 SPF 或 DKIM 至少有一项通过,并且通过项的域名必须与 From 地址域对齐。对齐方式可以是严格模式,要求域完全一致;也可以是宽松模式,允许子域。DMARC 还能指定当验证失败时的处理策略,例如 none、quarantine 或 reject。
_dmarc.ipipp.com. TXT "v=DMARC1; p=reject; rua=mailto:dmarc@ipipp.com; pct=100"
部署 DMARC 时通常先从 p=none 开始,只收集报告不实际阻断,观察哪些合法邮件可能被误伤。确认无误后,再调整为 quarantine 或 reject。很多企业长期停留在 none 状态,这等于只监控不防护。要真正提升反钓鱼能力,至少应对对外域名启用 p=reject,并定期分析 rua 报告中出现的异常来源。
三、内容检测、URL 分析与附件沙箱
身份认证解决的是“发件人是否可信”,但即使发件人身份通过了认证,邮件内容可能仍然包含恶意链接或有害附件。内容检测通常从多个维度入手:邮件正文的语义分析、链接背后的目标网址判断、附件的静态特征匹配以及动态沙箱执行。
钓鱼邮件常常制造紧迫感,例如“您的账号将在 24 小时内关闭,请立即点击链接验证”。自然语言处理模型可以识别这类诱导性语句,但如果只依赖规则,攻击者只要换个说法就能绕过。因此,URL 分析更加关键。邮件网关可以在用户点击链接时重写 URL,使其先经过安全检测服务,再决定是否放行原始地址。这种方式能实时检查目标页面内容,即便邮件在投递时链接尚未被标记为恶意,也能在点击时拦截。
附件方面,Office 文档中的宏、PDF 中的 JavaScript、压缩包中的可执行文件都是常见攻击载体。静态查杀可以识别已知恶意样本,但对未知攻击效果有限。沙箱技术会将附件放入隔离的虚拟环境中打开,观察是否存在可疑行为,例如下载额外载荷、修改注册表或建立持久化连接。下面这段 Python 代码演示了一个简单的 URL 域名相似度检测逻辑,用于发现仿冒域名。
from urllib.parse import urlparse
def is_suspicious_domain(url, trusted_domains):
domain = urlparse(url).netloc.lower()
for trusted in trusted_domains:
trusted = trusted.lower()
if domain == trusted:
return False
# 检测同形字符替换:o 变 0,l 变 1
variant = trusted.replace('o', '0').replace('l', '1')
if domain == variant:
return True
# 检测子域名仿冒:trusted.com.evil.com
if domain.endswith('.' + trusted):
return False
return True
trusted = ['ipipp.com', 'ipipp.net']
print(is_suspicious_domain('http://ipipp.com.evil.com/login', trusted))
这类规则可以作为邮件网关的辅助策略,但不能单独承担全部检测任务。更有效的方案是把 URL 分析、附件沙箱、域名信誉和机器学习模型组合起来,对不同风险等级的邮件采取不同处理策略,例如仅记录、放入隔离区或直接丢弃。
四、人为因素:安全意识培训与模拟钓鱼测试
技术手段无法覆盖所有攻击场景,尤其是账号被入侵后发送的内部钓鱼邮件。此时邮件来自可信发件人,SPF、DKIM、DMARC 都可能正常通过,内容也可能没有明显的恶意特征。如果攻击者掌握了某位员工的真实工作语境,甚至能模仿其写作风格,那么技术检测的难度会急剧上升。这时,人的判断就变得不可或缺。
企业可以定期开展模拟钓鱼测试,向员工发送仿真的钓鱼邮件,观察点击率和报告率。测试结果不应用于惩罚员工,而应作为培训效果的数据支撑。对于点击了钓鱼链接的员工,可以安排针对性学习,而不是公开批评。这样能鼓励员工在遇到可疑邮件时主动报告,而不是因为害怕犯错而瞒报。
此外,还应推动启用多因素认证。即使员工在钓鱼页面输入了账号密码,攻击者如果无法提供第二重验证因素,也很难直接登录系统。结合单点登录和条件访问策略,可以进一步限制异常登录行为。例如,当检测到账号在非常用设备或地理位置登录时,自动触发额外验证或直接阻断。
反钓鱼邮件技术不是单点产品,而是一个持续运营的体系。SPF、DKIM、DMARC 提供身份验证基线,内容检测和沙箱负责过滤恶意载荷,员工培训和认证策略降低人为失误的后果。安全团队需要定期查看 DMARC 报告,分析被拦截的邮件样本,更新仿冒域名规则,并结合每一次真实攻击事件完善检测逻辑。只有把身份、内容、行为三个层面结合起来,才能在当前不断演变的钓鱼攻击面前建立可靠防线。