spamassassin - 过滤特定的西里尔文/俄语 UTF-8 字母(base64 编码)

spamassassin - 过滤特定的西里尔文/俄语 UTF-8 字母(base64 编码)

我在设置个人spamassassin规则时遇到了一些麻烦。我的问题:我收到很多带有西里尔字母的俄语垃圾邮件,其中很多是UTF-8。因此,搜索字符集是不够的。所以我想搜索几个典型的俄语字母(例如):(д|ж|з|и|й)

/(д|ж|з|и|й)/i我在搜索中尝试了该模式/(\xd0\xb4|\xd0\xb6|\xd0\xb7|\xd0\xb8|\xd0\xb9)/i(这些正则表达式模式应该做同样的事情,对吗?)Subject

header CYRILLIC_LETTER_PRESENT Subject =~/(д|ж|з|и|й)/i

结果:UTF-8垃圾邮件仍在发送。我分析了收到的电子邮件。它们都具有相似的结构。源(重要部分)查找一封示例垃圾邮件,如下所示

Subject: =?UTF-8?B?0KLQtdCx0LUg0L/QvtC90YDQsNCy0LjRgtGM0YHRjyEg0J/QvtC60LDQt9GL?=  =?UTF-8?B?0LLQsNGOINC+0YLQu9C40YfQvdGL0Lkg0LLQsNGA0LjQsNC90YIg0L/QvtC7?=  =?UTF-8?B?0YPRh9C10L3QuNGPINC00L7RhdC+0LTQsCEg0J/RgNC+0YHRgtC+0Lkg0Lgg?=  =?UTF-8?B?0YDQtdC30YPQu9GM0YLQsNGC0LjQstC90YvQueKAiyE=?=
MIME-Version: 1.0
Date: Wed, 8 Mar 2017 06:57:11 +0100
From: =?UTF-8?B?0KDQsNC00LjQuSDQn9C40YjRgg==?= <[email protected]>
Sender: [email protected]
Message-ID: <[email protected]>
X-Priority: 3
List-Unsubscribe: <http://ie8qrshyns.zarabotokfm8.ru/uns/tFRyGZzisv/58dhKEk2im53c/DBetz>
Content-Type: multipart/alternative;
boundary="291e4fd846a7aa548d279e9eb1f199e9_1"

--291e4fd846a7aa548d279e9eb1f199e9_1
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: base64

....encoded....body....

--291e4fd846a7aa548d279e9eb1f199e9_1
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: base64

....2nd(?)....encoded....body....

--291e4fd846a7aa548d279e9eb1f199e9_1--

我谷歌了一下,只找到了一种有用的信息:http://shallowsky.com/blog/programming/decoding-email-headers.html

因此,这subject使用RFC2047=?UTF-8?B?msg_subject?= =?UTF-8?B?msg_subject2?= [...]。这一行告诉我们,subject使用utf-8字符集和base64编码(比较http://www.ietf.org/rfc/rfc2047.txt)。

显然,spamassassin没有正确解码。我找不到任何方法可以让它工作。我还找到了这个网站:https://dropbear.xyz/2007/08/07/filtering-base64-encoded-spam/

但这对我没什么帮助,因为它只是描述了如何过滤足够长的 base64 编码字符串。由于我正在寻找单个字符,因此无法使用这种方法。

我是否遗漏了什么?感谢您的帮助!

编辑:我也尝试了rawbody搜索,因为这应该解码 base64 编码,如文档

rawbody CYRILLIC_LETTER_PRESENT /(д|ж|з|и|й)/i

对我来说也没有用,尽管它也应该搜索整个身体,而且它充满了西里尔字母。

编辑2:我尝试进一步调查该问题。如果我尝试使用 测试 textcat spamassassin -D textcat -t spamtest,它会告诉我它“ can't determine language uniquely enough”。

而且我最终得到了以下结果:

X-Spam-Flag: YES
X-Spam-Level: *******
X-Spam-Status: Yes, score=7.3 required=3.0 tests=HTML_FONT_LOW_CONTRAST,
        HTML_MESSAGE,LOCAL_CYRILLIC,RDNS_NONE,SPF_SOFTFAIL,T_DKIM_INVALID
        autolearn=no autolearn_force=no version=3.4.0

看起来它起作用了。一切都很好。我的规则(此处称为LOCAL_CYRILLIC)按预期工作。但是,问题是,这封邮件通过了,但没有被识别为垃圾邮件,因为配置文件中存在相同的规则。我尝试再次将同一封邮件转发给我,然后,电子邮件源如下所示:

X-Spam-Level: **
X-Spam-Status: No, score=2.7 required=3.0 tests=LOCAL_CYRILLIC,
    RCVD_IN_DNSWL_MED autolearn=no autolearn_force=no version=3.4.0

因此,在本地文件上运行该测试和实际收到的电子邮件之间似乎存在差异。为什么?我总是用 重新启动 spamassassin systemctl restart spamassassin。我用 检查了它systemctl status spamassassin,一切看起来都很好,spamd也重新启动了,这是应该的。在那里我还可以找到转发电子邮件的以下信息:

spamd: clean message (2.7/3.0) for spamd:5555 in 6.0 seconds, 8371 bytes.
spamd: result: . 2 - LOCAL_CYRILLIC,RCVD_IN_DNSWL_MED scantime=6.0,size=8371,user=spamd,uid=5555,required_score=3.0,[...]

答案1

显然,spamassassin 没有正确解码。我找不到任何方法可以解决这个问题

它适用于,,,Ubuntu 14.04区域设置:。spamassassin 3.4Perl 5.18.2fr_FR.UTF-8

规则~/.spamassassin/user_prefs

header RUSSIAN_CHARS        Subject =~ /(д|ж|з|и|й)/i
describe RUSSIAN_CHARS      Russian characters in header
score    RUSSIAN_CHARS      10

当获取邮件文件并替换原始主题按照你问题中的那一行:

主题:=?UTF-8?B?0KLQtdCx0LUg0L/QvtC90YDQsNCy0LjRgtGM0YHRjyEg0J/QvtC60LDQt9GL?= =?UTF-8?B?0LLQsNGOINC+0YLQu9C40YfQvdGL0Lkg0LLQsNGA0LjQsNC90YIg0L/QvtC7?= =?UTF-8?B?0YPRh9C10L3QuNGPINC00L7RhdC+0LTQsCEg0J/RgNC+0YHRgtC+0Lkg0Lgg?= =?UTF-8?B?0YDQtdC30YPQu9GM0YLQsNGC0LjQstC90YvQueKAiyE=?=

结果:

$ spamc -R < 邮件测试
10.0/5.0
垃圾邮件检测软件,运行在系统**已删除**上......

内容预览:**已删除** [...]

内容分析详情:(10.0分,5.0必答)

 pts 规则名称 描述
---- ---------------------------------- --------------------------------------------------
  10 RUSSIAN_CHARS 标题中的俄语字符
 0.0 DKIM_ADSP_CUSTOM_MED 没有有效的作者签名,adsp_override 是
                            自定义_MED
 0.0 FREEMAIL_FROM 发件人电子邮件是经常被滥用的最终用户邮件提供商
                            (**已删除**[at]gmail.com)
-0.0 NO_RELAYS 信息:消息未通过 SMTP 中继

它还rawbody RUSSIAN_CHARS /(д|ж|з|и|й)/i

相关内容