恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
SPF绕过原理与邮件安全加固:从攻击拆解到DMARC落地
首页
资讯中心
/
SPF绕过原理与邮件安全加固:从攻击拆解到DMARC落地
SPF绕过原理与邮件安全加固:从攻击拆解到DMARC落地
发布时间:2026/10/20 14:21:43
做了这么多年邮件安全我见得最多的翻车现场不是服务器被暴力破解也不是终端中了勒索而是有人在钉钉群里发了一句“你刚才那封邮件是假的我点了链接”。每次复盘几乎都能看到同一个名字SPF。钓鱼邮件和SPF绕过这两个词放在一起很多人觉得是攻击者手里的大杀器但站在防守方看它更像一面镜子照出企业在发信验证上留下的窟窿。文章不会教你怎么伪造邮件而是从逆向拆解的角度把SPF绕过背后的原理讲透再给出一套能直接落地的加固方案。无论你是刚接手邮件安全的运维还是被钓鱼折腾过一轮的管理者这篇都值得花十分钟看完。1. 邮件攻击为什么绕不开SPF一个被低估的基础防线1.1 一封钓鱼邮件背后的三个欺骗点先想清楚一个问题一封邮件从发送到出现在收件箱收件人到底能看到什么、看不到什么大多数用户只看两处显示名和信头From地址。显示名可以是“某某公司财务部”信头From可以是financeexample.com看起来特别正经。但这封邮件真正的来源藏在SMTP会话的MAIL FROM命令里也就是信封发件人。用户看不信封发件人邮件网关却主要根据它做SPF校验。这里就出现了第一个容易混淆的点SPF查的域名是信封发件人的域名不是信头From的域名。攻击者如果用一个自己控制的域名作为信封发件人并在自己的域名里加一条允许当前发送IP的SPF记录那么SPF校验结果是pass。可收件人看到的信头From却被伪造成了financeexample.com。邮件网关看了一眼SPF发现验证过了就把邮件放进了收件箱。用户点开一看噢财务部发的便卸下了防备。这不是什么高深漏洞而是SPF机制本身的盲区它管的是“这封邮件的技术来源是否被授权”不管“用户看到的发件人是不是伪装的”。所以单靠SPF永远无法解决钓鱼邮件中的显示名欺骗和信头From伪造。后续的DMARC要做的事就是把这个盲区补上但这需要SPF、DKIM、DMARC三个组件协同工作缺一环都可能被利用。1.2 SPF绕过在攻击链中的真实位置在攻防演练和真实钓鱼攻击里SPF绕过很少是攻击者唯一的手段更多时候是“敲门砖”。攻击者要做的第一件事是让邮件能绕过网关的初步过滤进到用户的收件箱或垃圾箱。垃圾箱已经算赢了一半因为很多用户会亲手把垃圾箱里的邮件拖出来查看。而SPF校验恰好是网关过滤里最前置、最容易被普通管理员忽略的一环。有些企业会把SPF记录写得很宽松比如用?all或者~all结尾。?all表示“无法判断”~all表示“软失败”真正严格的-all却很少见。宽松策略的潜台词是我这个域名下面的发信源太杂怕配置收紧了误杀正常邮件于是先放一放。结果就是攻击者随便用一台不在这条SPF记录里的服务器发信网关只给邮件打个“softfail”标签默认不拦截。再配合一个伪造得很像的信头From钓鱼邮件就顺利到达了员工面前。这几年我接触过的钓鱼事件里真正绕过了SPF的情况其实分三类第一类是利用SPF只验信封发件人的特点控制自己的域名第二类是利用目标域名SPF策略宽松例如?all或~all第三类是目标域名的SPF记录存在语法错误或者超过了10次DNS查询上限导致permerror部分网关直接跳过校验。三者之中第二类和第三类才是国内企业里最常见的安全欠账。1.3 我的立场拆解不是为了教学而是为了把防御做扎实先把话说明白这篇内容不会给出任何“如何制作钓鱼邮件”的教程。我拆解SPF绕过是因为防守方只有真正理解攻击者利用了什么逻辑才会心甘情愿去把配置改对。见过太多企业要求他加一条DMARC记录他拖了一个月要求他把SPF从~all改成-all他说怕业务受影响。等到钓鱼事件爆了才后悔当初没做。所以这篇文章的定位很明确批判性地理解攻击原理再把这些理解转化成防御动作。看完之后你要做的是检查自己域的SPF、DKIM、DMARC是把员工的安全意识补上而不是去注册一个相似域名搞测试。网络安全的底线是永远不伤害他人这一点无论是工作还是私下研究都不能丢。2. SPF验证机制与绕过成因知其然更知其所以然2.1 SPF的工作流程一封邮件如何被“审判”SPF的完整名称是Sender Policy Framework它做的事情就是通过DNS告诉收件方我这个域名的邮件到底由哪些IP地址或主机发出来是合法的。整个过程可以拆成四个步骤。第一步收件方邮件服务器在SMTP会话里收到MAIL FROM拿到信封发件人域名。第二步它向DNS发起TXT记录查询请求该域名的SPF记录。第三步SPF记录里往往包含一列规则比如允许的IP段、允许的域名、以及最终的all标志。第四步收件服务器把当前连接来源IP与规则做匹配返回pass、fail、softfail、neutral或permerror中的一个结果。匹配结果决定邮件命运。如果返回fail通常被拒收softfail或neutral则看接收方策略有的打标有的放行permerror更麻烦很多网关会采取“fail-open”策略也就是校验出错时倾向放行毕竟谁也不想因为自己配置问题丢掉正常客户。攻击者看中的正是这种不确定性。下面这张表把SPF记录里常见的机制和含义说清楚方便自查时对照。机制示例含义防御建议ip4ip4:192.0.2.10允许指定IPv4地址或网段发信精确到IP能不加网段就不加网段includeinclude:_spf.example.com引入另一个域名的SPF规则确保被include的域配置正确、不循环aa:mail.example.com允许该域名的A记录指向的IP发信谨慎使用A记录变更会影响邮件mxmx允许该域名的MX记录指向的IP发信仅适用于发收同一组服务器~all~all未匹配时软失败标记但不一定拒收过渡期可以用但别长期停留-all-all未匹配时硬失败建议拒收确认所有发信源已覆盖后使用?all?all未匹配时中性等同于不表态强烈不建议等于没做校验allall全部允许千万别用用了SPF形同虚设2.2 攻击者绕过SPF的常见路径原理层面的拆解要防住SPF绕过先得知道攻击者为什么能得逞。常见路径我理了五条全部站在原理层面说明。第一条是信头From与信封发件人分离。这是最经典的SPF盲区。攻击者注册一个自己的域名evil.com把SPF记录写成vspf1 all然后在SMTP信封里用bounceevil.com作为MAIL FROM但信头From写成financevictim.com。收件服务器查的是evil.com的SPF必然pass用户看到的却是victim.com。DMARC的对齐机制就是为了解决这个问题它要求SPF验证的域名或DKIM签名域名必须与信头From域名对齐否则就算SPF过了也算失败。第二条是目标域名的SPF策略太宽松。很多企业用~all或?all攻击者随便找一台云主机发信SPF校验结果是softfail或者neutral。接收方如果没做额外的策略就会把这封邮件当普通邮件处理。宽松策略本身未必是错它通常是业务容忍度换来的过渡方案但过渡期一旦被无限拉长就成了攻击者的后门。第三条是SPF记录里的include链不完整。企业用了多家邮件服务商比如自建邮件系统、第三方营销平台、客服工单系统但SPF记录只include了其中一两家剩下的发送源全都没授权。攻击者只要拿到某个未收录发送源的权限或者干脆伪造成那个服务商的名号SPF校验依然pass。第四条是超过10次DNS查询导致permerror。SPF规范规定一条SPF记录所有include、a、mx等机制加起来最多只能做10次DNS查询。配置复杂的企业经常踩坑记录一多查询次数超限SPF直接返回permerror。部分收件服务器对permerror的处理是放行攻击者利用这一点不需要真正搞定你的SPF只需要让它“无法判断”。第五条是完全没有配置DMARC。没有DMARC即便SPF校验失败接收方也没有一个明确的策略告诉它该把邮件丢进垃圾箱还是直接拒收。攻击者就算顶着SPF fail发出来邮件仍然有很大机会到达用户收件箱。这也是为什么我总说SPF绕过的锅不能全让SPF背整个认证体系不闭环才是根因。2.3 为什么只有SPF仍然不够从“验来源”到“验身份”SPF给出的答案是“这个IP被授权了吗”但它回答不了“这封邮件真的来自我看到的发件人吗”。举个生活化的例子SPF就像小区门禁系统它只检查你从哪个门进来的如果是登记过的门就放行。DMARC则是在门禁基础上加了一道闸机要求你出示工牌而且工牌上的名字必须和你在前台登记的名字一致。邮件安全体系里DKIM负责用域名私钥给邮件签名收件方通过DNS公钥验签确保内容完整、签名域可信。DMARC则负责制定策略如果SPF或DKIM两个认证机制当中至少有一个通过且通过的域名与信头From域名对齐邮件才算真正通过验证。如果没有通过DMARC的p参数会告诉接收方是放进去none、丢进垃圾箱quarantine还是直接拒收reject。所以防护的完整闭环是SPF先解决“发信来源是否被授权”DKIM解决“邮件内容是否被篡改”DMARC解决“最终展示的发件人是否可信”。三件套缺了哪一个攻击者都能找到缝隙。尤其是DMARC的对齐策略直接堵死了“信头From与信封发件人分离”这条最经典的绕过路径。3. 防护实操从邮件安全配置到员工意识3.1 SPF记录的配置规范与自查方法先讲配置规范。一条合格的SPF记录要覆盖所有发送源。我见过太多企业只把自建邮件服务器的IP写进去忽略了办公网出口IP、第三方邮件营销服务商、客服平台甚至忽略了自己在云上跑的群发脚本。建议先盘点一遍所有可能以你的域名作为发件人的系统然后按优先级加上。记录格式参考如下vspf1 ip4:203.0.113.10 include:_spf.thirdparty.example -all其中ip4:203.0.113.10是你的自建邮件服务器出口IPinclude:_spf.thirdparty.example是第三方服务商提供的SPF规则最后的-all表示未匹配的一律拒绝。如果你暂时无法确认所有发送源可以从~all开始过渡但一定设定一个检查周期比如两周后评估邮件发送日志确认没有合法来源被误伤再改成-all。自查时可以用nslookup或dig命令查询nslookup -typeTXT example.comdig TXT example.com short重点看返回结果里有没有以vspf1开头的那一条记录。注意一个域名只能有一条有效的SPF记录如果有多条以vspf1开头的TXT记录SPF校验会被认为是permerror。这个问题很隐蔽常见于长期运维的域名前人加了一条后人不知道又加了一条。3.2 DMARC策略的落地从none到reject的渐进式操作DMARC配置的目标是把“信任判断”从接收方手里拿回来由自己定义假冒邮件怎么处理。不要一上来就preject那样很容易把还没验证完的第三方发信源误伤。我的建议是分三步走。第一步设置vDMARC1; pnone; ruamailto:dmarcexample.com。pnone只生成报告不做处置。rua是报告接收地址用来收接收方发来的XML聚合报告。保持两到三周把报告拉出来分析重点看哪些来源IP在发信、SPF通过率多少、DKIM通过率多少、有多少邮件走了对齐失败。第二步确认大部分合法邮件都能通过认证后把策略改成pquarantine。这个阶段不满足DMARC的邮件会被丢进垃圾箱但不会直接拒收给业务留了缓冲期。继续观察报告如果发现某些合法系统没有通过认证就去补对应的SPF记录或DKIM签名。第三步稳定运行一段时间后改成preject。同时可以加上spreject对子域名也采用同样策略。这一步会把未认证的邮件直接拒收是抵御钓鱼邮件最严格的防线。示例记录如下vDMARC1; preject; spreject; ruamailto:dmarcexample.com; pct100这里还要提醒一个坑DMARC要求SPF或DKIM至少一个成功且域名要与信头From域名对齐。如果企业用了服务商来代发邮件但服务商用的DKIM签名域是服务商自己的域名那么DKIM对齐会失败这种情况下必须通过SPF对齐来兜底确保信封发件人域名与信头From域名一致。3.3 员工识别钓鱼邮件的五个细节网关之外的防线再严密的邮件网关也挡不住用户在网页邮箱里手动点击“回复”按钮。安全配置做得再好员工意识跟不上迟早还会出事。这几年做培训时我总结出五个最容易操作的识别细节。第一看显示名更不能只看显示名。显示名可以随便改真正的判断依据是点击“回复”或查看详情时显示出来的完整地址。张三 zhangsanexample.com和张三 zhangsanexampe1.com第一眼能骗到人但把鼠标悬停到发件人名称上地址就会现出原形。第二看域名拼写。钓鱼域名经常做高仿比如把example.com写成exampe1.com、examp1e.com甚至用example.com.evil.com这种子域名伪装。凡是域名里出现形近字符、数字替换、多余子域名的都要警惕。第三看链接目标。邮件里声称是“安全中心通知”“发票下载”但按钮链接的地址和文本展示的地址不一致。桌面端可以鼠标悬停看状态栏移动端也可以长按复制链接先不要直接点开。第四看语气和紧迫感。正常财务流程很少会在邮件里用“立即”“今天必须”“否则账户关闭”这类措辞。攻击者最擅长制造焦虑让你没时间细想就做出操作。第五看是否索取敏感信息。任何一封直接要求你提供密码、验证码、银行卡号、个人信息的邮件都应该走邮件安全通道二次确认而不是直接回复。把这些细节做成一张速查表贴在公司内部知识库里比单纯发一遍通报有用得多。员工不一定能记住所有攻击手法但能记住这几条就能避开绝大多数钓鱼邮件。3.4 邮件网关策略的补充别让校验结果被忽略经常有管理员问我“我SPF、DKIM、DMARC都配了怎么还是有人收到钓鱼邮件”答案往往出在邮件网关策略上。DMARC返回reject只是给出了建议最终是否执行取决于收件方邮件系统的策略实现。比如有些网关默认只把preject当垃圾邮件标记不直接拒收有些网关在permerror时会选择放行有些还会跳过某些来源IP的校验比如白名单里的合作伙伴IP。所以配置完DMARC之后记得检查邮件网关的“认证处理选项”。如果网关支持尽量开启对DMARC执行结果的强制处理把quarantine映射为垃圾箱、reject映射为拒收。同时关闭“域名信誉白名单优先于认证结果”这类可能绕过DMARC的选项。白名单可以做但白名单内的邮件也应该做SPF或DKIM校验只是垃圾邮件评分可以放宽。还有一点容易被忽略企业域名一旦被攻击者盯上对方可能不止发钓鱼邮件还会做子域名枚举利用没有配置SPF的裸域或子域发信。所以除了主域所有用于业务的子域也应该有SPF记录或明确的空策略。DMARC中的sp字段就是用来约束子域名的记得一并配上。4. 常见问题与排查实录那些踩过的坑4.1 SPF记录“明明配了却还是被判定失败”的原因分析排查邮件认证问题最直接的办法是看原始邮件头里面的Received-SPF、Authentication-Results、DKIM-Signature这些字段。真实环境里SPF配置了却依然失败的原因我整理成了一张速查表按优先级排查。现场症状可能原因排查方向Received-SPF显示permerrorDNS查询次数超过10次简化include、a、mx链Received-SPF显示none发件方域名没有SPF记录检查TXT记录是否真的生效多条TXT以vspf1开头历史遗留重复记录删掉多余记录只保留一条显示softfail但邮件进收件箱网关不信任softfail未拒绝收紧为-all同时检查网关策略显示pass但用户说是钓鱼信头From伪造、信封发件人是攻击者的域检查DMARC是否配置并执行拒收include的服务商记录经常变动第三方SPF规则被服务商更新定期检查include目标不要一成不变实际排查时dig TXT example.com能看到SPF全貌dig TXT _dmarc.example.com能看到DMARC策略。邮件头里的Authentication-Results字段直接标明SPF对本次邮件的判断。要学会把这几个信息来源对照起来看不要只盯着DNS记录。4.2 被钓鱼后的应急响应清单万一已经发生了钓鱼事件别慌按顺序处理能把损失降到最小。下面这套清单是实战中总结出来的建议保存成公司的SOP。第一步立刻改密码并撤销已有会话。重点不是改一个密码而是撤销所有已登录会话、重置多因素认证绑定以及检查是否有攻击者添加的转发规则。邮件系统里“自动转发到外部地址”是钓鱼攻击者非常喜欢留下的后门。第二步保留现场证据。把原始邮件导出为.eml文件包含完整邮件头和附件元数据不要只截图。取证时需要用邮件头里的Message-ID、Received路径、SPF和DKIM信息去追溯攻击来源。第三步隔离受影响账号。把被入侵或被骗的账号临时冻结禁止继续收发邮件避免攻击者利用该账号继续向内部发送钓鱼邮件。第四步联合安全团队做溯源。找到信头From、信封发件人、发送IP、钓鱼链接域名把这些指标同步到邮件网关和防火墙封锁后续同类攻击。第五步评估影响范围。检查该账号是否访问过财务系统、客户数据、合同文件结合邮件内容判断数据泄露等级。必要时通知合规部门和相关方。第六步复盘加整改。回头看这次邮件为什么能穿透网关是SPF没配好、DMARC没启用还是员工识别能力不足。找到根因后按第三部分的方法落地加固再对全员做一次定向培训。4.3 一则复盘某公司SPF配置遗漏导致的钓鱼事件去年我协助处理过一起案例某公司收到了大量以公司域名发出的钓鱼邮件内容伪装成“出差补助申请”诱导员工填写账号密码。排查时发现公司官网正常邮件服务器也正常但SPF记录只写了自有服务器IP并且以?all结尾。更关键的是公司市场部一直在用某第三方邮件订阅平台发营销邮件但第三方平台的SPF规则从未被include进公司域名的SPF记录里。攻击者没有入侵任何服务器只是利用了SPF记录里那些“未授权但不拒绝”的漏洞从自己的发送通道伪造发件人域名。因为?all的含义是中性的邮件网关没有足够理由拒收一连串钓鱼邮件就进了员工的垃圾箱甚至不少直接进了收件箱。最终有员工提交了账号密码攻击者登录后在邮件系统里创建了转发规则把所有敏感邮件实时转发到外部邮箱。事后整改时我们做了三件事第一把SPF记录改成include第三方平台规则结尾从?all收紧到-all第二上线DMARC先用pnone观察了两周确认合法营销邮件全部通过认证后升级到pquarantine再稳定一周最终切到preject第三对市场部的所有营销邮件启用DKIM签名保证从第三方平台发出的邮件也有合法身份。这套组合拳落地后同类钓鱼邮件再也没能从“未授权但放行”的漏洞里进来。这个案例最值得记的地方是问题不在技术本身而在于没有人把“发件人身份”这件事当成一个整体来管理。SPF、DKIM、DMARC不是三个独立的配置项而是同一道防线的三个关卡。4.4 最后的建议邮件安全是个体系别贪图一步到位如果让我给刚接触邮件安全的团队一条建议我不会让他们第一周就切-all、reject那样容易制造业务事故。我会让他们先做三件事把你的域名SPF记录查一遍把?all改成~all上线DMARC的pnone并开始收集报告给财务、人事、高管三批人做一次钓鱼邮件识别培训。这三件事做扎实风险就能降一大截。之后每两周看一次DMARC报告把报告里频繁出现但认证失败的合法发件源补进SPF或DKIM白名单。确认一个月后没有误报再把DMARC逐步从none推向quarantine最后到reject。整个过程要克制所有变更都留出观察期安全加固最怕的就是比业务跑得还快。最后分享一个我自己的小习惯每次改完SPF或DMARC我都会用外部邮箱给公司内部账号发一封测试邮件然后仔细看邮件头里的Authentication-Results和执行结果。这个习惯帮我避免过很多次“配置写对了但实际没生效”的坑。邮件安全没有银弹但把SPF绕过这类基础问题堵住再把DMARC拉起来至少能把九成以上的假冒域名挡在门外。剩下的就交给员工那根悬停看链接的手指了。