base64でエンコードされたスパムメールを拒否するにはどうすればよいですか?


12

base64でエンコードされた同様の内容のメールをいくつか受信しました。今、私はボディチェックを使用してこの種の電子メールを拒否または破棄したいです。

body_checksで次のようなことをする前に:

/Quanzhoucooway/ DISCARD

ただし、メッセージはエンコードされているため、そのキーワードは検出されません。

base64でエンコードされたメッセージを次に示します。

DQpIaSBGcmllbmRzLA0KDQpHb29kIGRheSENCg0KVGhpcyBpcyBWaWN0b3JpYSBmcm9tIFF1YW56
aG91Y29vd2F5IHNob2VzIHRyYWRpbmcgY28uLGx0ZCwgYSBwcm9mZXNzaW9uYWxtYW51ZmFjdHVy
ZXIgYW5kIGV4cG9ydGVyIG9mIGFsbCBraW5kcyBvZiBzaG9lcywgbWFpbmx5IGluIGNhc3VhbCBz
aG9lcyBhbmQgc3BvcnRzIHNob2VzICwgd2hpY2ggaGFzIGJlZW4gc3VwcGxpZWQgdG8gdGhlIGZh
bW91cyBmYXNoaW9uIGJyYW5kIHN0b3JlcyBmcm9tIDIwMTAuDQoNCk5vdGljaW5ndGhhdCB5b3Ug
YXJlIGxvb2tpbmcgZm9yIGhpZ2ggcXVhbGl0eSBmYXNoaW9uIHNob2VzLCBzbyBJIGhvcGUgd2Ug
Y2FuIHdvcmsgdG9nZXRoZXIgaW4gdGhlIGZ1dHVyZS4gSWYgeW91IGFyZSBpbnRlcmVzdGVkLCBJ
IHdpbGwgc2VuZCB5b3Ugb3VyIGl0ZW1zIGFjY29yZGluZ2x5Lg0KDQpGWUksIHdlIGNhbiBtYWtl
IGN1c3RvbWl6ZWQgc2FtcGxlcyBmb3IgeW91IGFjY29yZGluZ2x5Lg0KDQpMb29raW5nIGZvciB5
b3VyIHNvb25lc3QgcmVzcG9uc2UuDQoNCkJSIQ0KDQpWaWN0b3JpYSANCg==

これらの種類のメールをブロックするためのベストプラクティスは何ですか?


3
メッセージの実際にデコードされたコンテンツに作用する適切なスパムフィルター?
ceejayoz

より具体的に、どのようなメカニズムを使用する必要がありますか?私はすでにspamassassinを使用していますが、スパムとの戦いに関しては素晴らしい仕事をしています。
user134969

「メッセージ本文をbase64エンコードしないでください」というエラーメッセージでMTAを拒否します。
-joshudson

回答:


20

Postfixのでこれをしないでくださいbody_checkしかし、SpamAssassinのルールを書く代わりに、それのために。Spamassainは、ルールを適用する前にメッセージ本文をデコードします。何かのようなもの:

body     LOCAL_QUANZHOUCOOWAY  /Quanzhoucooway/
score    LOCAL_QUANZHOUCOOWAY  7.0
describe LOCAL_QUANZHOUCOOWAY  Block word Quanzhoucooway

これらのルールは/etc/mail/spamassassin/local.cf(または~/.spamassassin/user_prefs)に属します。


1
そのキーワードがbase64でエンコードされていても、そこのコンテンツのように機能しますか?
user134969

2
はい。これを明確にするために誰かがすでに私の答えを編集しました。その匿名の人に感謝します!:)
エサヨキネン

9

技術的には、キーワードのbase64エンコードデータを直接フィルタリングできます。より良い、より単純な代替案が存在することを考えると、それは実践的または合理的なことだとは言っていません(上記のEsaの回答などで説明されています)が、ある可能。

トリックはそれを実現することです は、base64エンコードが、エンコードされていない生データの3バイトブロックをbase64文字の4文字ブロックに決定論的にマッピングです。したがって、エンコードされていないデータに3バイトブロックの特定のシーケンスが表示されるたびに、エンコードされたバージョンに同じ4文字ブロックのシーケンスが表示されます。

たとえば、文字列Quanzhoucoowaybase64エンコーダーに入力すると、出力が取得されますUXVhbnpob3Vjb293YXk=。入力の長さが3バイトの倍数ではないため、出力の最後にパディングが含まれますが、最後の=符号と最後の実際のbase64文字を削除するとk(パディングビットもエンコードするため)、文字列を取得しますUXVhbnpob3Vjb293YXBase64でエンコードされたデータたびバイトトリプレットに表示されるように保証されるQuanzhoucoow及び部分トリプレットay、その順に入力に現れます。

しかし、もちろん、文字列Quanzhoucoowayはトリプレット境界で正確に開始しない場合があります。たとえば、XQuanzhoucooway代わりに文字列をエンコードすると、WFF1YW56aG91Y29vd2F5まったく異なる外観のoutputが取得されます。今回は、入力長は3で割り切れるため、最後に破棄するパディング文字はありませんがWF、先頭の2 Xバイトの文字()を破棄する必要があります。F1YW56aG91Y29vd2F5

最後に、base64エンコーディングXXQuanzhoucoowayはoutput を提供WFhRdWFuemhvdWNvb3dheQ==し、両端にパディングがあります。最初の3文字WFhXXプレフィックスをエンコードする)と最後の3文字Q==(末尾のゼロビットパディングをエンコードする)を削除すると、文字列が残りますRdWFuemhvdWNvb3dhe。したがって、次の3つのbase64エンコード文字列を取得します。

UXVhbnpob3Vjb293YX
F1YW56aG91Y29vd2F5
RdWFuemhvdWNvb3dhe

その(少なくとも)1つは、wordを含む入力文字列のbase64エンコード形式で表示される必要がありますQuanzhoucooway

もちろん、運が悪ければ、base64エンコーダーは、エンコードされた2つのトリプレットの間に改行を挿入する場合があります。(たとえば、メッセージの例はF1YW56との間にありaG91Y29vd2F5ます。)したがって、これらの文字列を正規表現と確実に一致させるには、次のようなものが必要です(PCRE構文を使用)。

/UXVh\s*bnpo\s*b3Vj\s*b293\s*YX/ DISCARD
/F1\s*YW56\s*aG91\s*Y29v\s*d2F5/ DISCARD
/R\s*dWFu\s*emhv\s*dWNv\s*b3dh\s*e/ DISCARD

これらのパターンを手作業で生成するのは面倒ですが、少なくともbase64エンコーダーを提供している限り、お気に入りのプログラミング言語で簡単なスクリプトを作成するのは難しくありません。

本当に必要な場合は、大文字と小文字を区別しないマッチングを実装することもできます。キーワードの小文字と大文字の両方をbase64エンコードし、それらを任意の組み合わせに一致する正規表現に結合します。たとえば、quanzhoucoowayis のbase64エンコーディングcXVhbnpob3Vjb293YXk=QUANZHOUCOOWAYis UVVBTlpIT1VDT09XQVk=であるため、ルールは次のとおりです。

/[cU][XV]V[hB]\s*[bT][nl]p[oI]\s*[bT][31]V[jD]\s*[bT][20]9[3X]\s*[YQ][XV]/ DISCARD

いずれの場合でも、base64でエンコードされた単語「Quanzhoucooway」と一致します。ただし、トリプレット境界で始まる場合に限ります。シフトされたバージョンに対応する他の2つの正規表現の生成は、演習として残されています。;)

残念ながら、このような単純な部分文字列のマッチングよりも複雑なことを行うとすぐに非現実的になります。しかし、少なくともそれはきちんとしたトリックです。原理的には、何らかの理由でSpamAssassinや、フィルタリングの前にbase64エンコードをデコードできる他のフィルターを使用できなかった場合に役立ちます。しかし、このようなハックを使用する代わりに、それを行うことができる場合、あなたは確かにすべきです。


1
はい、可能です。あまり実用的ではなく、すべての単語に対してもう一度やりたいことでもありません。説明のために+1:これはあまり有用ではないかもしれませんが、確かに教育的です!
エサヨキネン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.