我们尝试使用 Spamassasin 中的一条简单规则将钓鱼邮件标记为垃圾邮件。但不幸的是,我们无法对其进行有效的检查。
基本上,我们想要实现的是,如果邮件的发件人是不是来自我们的域名@example.org,但正在使用伪造的显示名称。
以下是一个例子:
From: "Firstname Lastname <[email protected]>" <[email protected]>
因此我们制定了以下 SA 规则,但没有奏效
header __FRAUD_HEADER From =~ /.*@(?!example\.org)/i
body __FRAUD_BODY /".*\@example\.org.*"(?!.*\@example\.org.*$)/i
meta COMPANY_FRAUD (__FRAUD_HEADER && __KFRAUD_BODY)
describe COMPANY_FRAUD Fake Sender - Phishing Attempt
score COMPANY_FRAUD 100
对于为什么这没有成功,有什么想法吗?
regex101.com 告诉我们正则表达式是正确的。Spamassasin 也没有抱怨错误。
编辑:我想我搞错了他们如何伪造发件人。这是我认为他们如何伪造/伪装发件人地址的摘录
# telnet mail.example.org 25
Trying 10.20.30.40...
Connected to mail.example.org.
Escape character is '^]'.
220 mail.example.org ESMTP
EHLO a.mailserver.com
250-mail.example.org
250-PIPELINING
250-SIZE
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
MAIL FROM:[email protected]
250 2.1.0 Ok
RCPT TO: [email protected]
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
TO: [email protected]
FROM: "Firstname Lastname" [email protected]
SUBJECT: Something
Spam/Phishing message text goes here
.
250 2.0.0 Ok: queued as 123456789
quit
221 2.0.0 Bye
Connection closed by foreign host.
提出的解决方案有效!
答案1
您的原始规则:
header __FRAUD_HEADER From =~ /.*@(?!example\.org)/i
body __FRAUD_BODY /".*\@example\.org.*"(?!.*\@example\.org.*$)/i
meta COMPANY_FRAUD (__FRAUD_HEADER && __KFRAUD_BODY)
describe COMPANY_FRAUD Fake Sender - Phishing Attempt
score COMPANY_FRAUD 100
一些批评:
- 我发现一个拼写错误:您的元规则依赖于
__KFRAUD_BODY
而不是__FRAUD_BODY
- 这些真的很贵。除非万不得已,否则尽量不要使用环视
- 我建议用你自己的名字来命名你的规则,这样你就能记住它们是你的
- 你真的想在正文正则表达式中使用双引号吗?这可能是问题所在
- 这真的应该是正文正则表达式吗?您是否尝试匹配内联转发元数据?
- 鉴于你的阈值应该在 5-10 之间,因此 100 分的分数太高了
怎么样:
header __DW_NONFRAUD_HEADER From:addr =~ /\bexample\.org$/i
body __DW_FRAUD_BODY /"[^"]{0,99}\@example\.org\b[^"]{0,99}"(?!.{0,99}\@example\.org\b)/i
meta DW_COMPANY_FRAUD (!__DW_NONFRAUD_HEADER && __DW_FRAUD_BODY)
describe DW_COMPANY_FRAUD Fake Sender - Phishing Attempt
score DW_COMPANY_FRAUD 3
我否定了您的第一次检查,并将其限制为仅针对发件人标题中的地址(请参阅规则的修订meta
)。我还放入了大量的单词边界 ( \b
) 标记,以确保您不会遇到“myexample.org”或“example.org.in”或其他奇怪的东西。无限范围非常昂贵,因此我将它们缩减为 0-99 个字符,并通过阻止它们匹配双引号来确保您不会看得太远。我还删除了您的,$
因为 SpamAssassin 会折叠所有空格(行尾可能不在您认为的位置;最好使用\b
和类似的)。
我认为 3 分已经很高了。其他分数不高的话,您可能需要考虑 SA 的黑名单功能。
实际上,你应该确保已经正确安装和配置了 SpamAssassin 的插件密钥管理信息系统,防晒指数, 和DMARC(这些是反欺骗技术,可以实现您要执行的大部分操作)。您的域名解析沙URI 域名服务配置正确并且您正在使用(和培训!)贝叶斯. 第三方模糊查找,如剃刀和皮佐尔还可以帮助捕获错过的垃圾邮件。
我之所以这么说,是因为这条规则费力、昂贵,而且不可扩展(您需要为每个域创建一个),但主要是因为它看起来并不有效(目标“签名”并不是很垃圾,您会得到误报)。