web-dev-qa-db-ja.com

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

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

Body_checksに次のようなものを含める前に:

/Quanzhoucooway/ DISCARD

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

以下は、base64でエンコードされたメッセージです。

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

では、この種のメールをブロックするためのベストプラクティスは何でしょうか?

11
user134969

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)に属しています。

19
Esa Jokinen

技術的には、couldはキーワードのbase64エンコードされたデータを直接フィルタリングします。 (たとえば、上記のEsaの回答で説明されているように)より適切で簡単な代替手段が存在することを考えると、それが実用的または合理的なことだとは言っていませんが、is可能です。

トリックは、 base64エンコーディング が、エンコードされていない生データの3バイトブロックから、base64文字の4文字ブロックへの確定的なマッピングであることを認識することです。したがって、3バイトのブロックの特定のシーケンスがエンコードされていないデータに現れるときはいつでも、4文字のブロックの同じシーケンスがエンコードされたバージョンに現れます。

たとえば、文字列Quanzhoucoowaybase64エンコーダー に入力すると、出力UXVhbnpob3Vjb293YXk=が得られます。入力の長さは3バイトの倍数ではないため、出力には最後にいくつかの padding が含まれますが、最後の=記号と最後の実際のbase64文字kをドロップすると(エンコードされているため)一部のパディングビット)、バイトのトリプレットQuanzhoucoow、および部分的なトリプレットayがこの順序で入力に出現するたびに、base64エンコードデータに表示されることが保証される文字列UXVhbnpob3Vjb293YXを取得します。

ただし、もちろん、文字列Quanzhoucoowayは、トリプレットの境界で正確に始まるとは限りません。たとえば、代わりに文字列XQuanzhoucoowayをエンコードすると、完全に異なる出力WFF1YW56aG91Y29vd2F5が得られます。今回は、入力の長さが3で割り切れるので、最後に破棄するパディング文字はありませんが、先頭のWFバイトからいくつかのビットをそれぞれエンコードする最初の2文字(X)を破棄する必要があります。 F1YW56aG91Y29vd2F5を使用してください。

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

UXVhbnpob3Vjb293YX
F1YW56aG91Y29vd2F5
RdWFuemhvdWNvb3dhe

(少なくとも)1つは、WordのQuanzhoucoowayを含む入力文字列のbase64エンコード形式で出現する必要があります。

もちろん、運が悪い場合、base64エンコーダーは、エンコードされた2つのトリプレットの間に、途中で改行を挿入することがあります。 (たとえば、メッセージの例では、F1YW56aG91Y29vd2F5の間にメッセージがあります。)したがって、これらの文字列を正規表現と確実に一致させるには、次のようなものが必要です(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エンコードし、それらを任意の組み合わせに一致する正規表現に結合することで、大文字と小文字を区別しないマッチングを実装することもできます。たとえば、quanzhoucoowayのbase64エンコーディングはcXVhbnpob3Vjb293YXk=ですが、QUANZHOUCOOWAYのエンコーディングは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エンコードをデコードできるその他のフィルターを使用できなかった場合にも、これは有用です。しかし、それができるなら、このようなハックを使う代わりに、確かにそうすべきです。

9
Ilmari Karonen