procmail がこのルールに一致しなかったのはなぜですか?

procmail がこのルールに一致しなかったのはなぜですか?

疑わしい添付ファイルを含むすべてのメールを専用のフォルダーに送信するという次のルールがあります。

# Emails with attachments
:0
* ^Content-Type: multipart/
{
  :0 B
  * ^Content-Type: application/(zip|x-zip-compressed)|\
    ^Content-Type:.*name=.*\.(zip|exe|rar|rtf|docm)|\
    ^Content-.*attachment.*name=.*\.(zip|exe|rar|rtf|docm)|\
    ^Content-.*application.octet-stream.*name=.*\.(zip|exe|rar|rtf|docm)
  $L/.3_my._quarantine/
}

しかし、zip ファイルが添付されたメールが紛れ込んでいることに気付きました。その理由がわかりません (my@email と myemail には、難読化した自分のメール アドレスとホストが含まれていました)。

X-Priority: 3 (Normal)
From: [email protected]
To: "[email protected]"
 <[email protected]>
Subject: Attached File
Date:Mon, 16 May 2016 17:16:47 +0530
Message-Id: <272843899191709486.0001.scannerTxNo.0051@scannerF04EF6.myemail.com>
Mime-Version: 1.0
Content-Type: multipart/mixed;
 boundary="53594271E1EBE7BBDAF4BBA9"

--53594271E1EBE7BBDAF4BBA9
Content-Type: application/x-compressed;
 name="[email protected]_3602848_97891076672132.zip"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="[email protected]_3602848_97891076672132.zip"

AFAICS は^Content-Type:.*name=.*\.(zip|exe|rar|rtf|docm)一致するはずですか? 引用符が原因でしょうか?

答え1

あなたがリンクした投稿では確かに折り畳み式であると書かれていますヘッダー正しく処理されますが、このレシピではヘッダーではなく本体を調べます。

Procmail が MIME 構造を正しく認識しないのは、Procmail の欠陥です。これは、現代のメール フィルターにとって重要な追加機能ですが、残念ながら、Procmail の開発は 2000 年代初頭にすでに中止されています (それ以前にも、元の開発者が辞めたときに一度中止されています)。

大まかな回避策としては、MIME 境界で MIME マルチパート メッセージを一時的に分割し、各パートを別の Procmail レシピに渡すという方法がありますが、これはすぐに脆弱で複雑になります (理論上は、MIME メッセージは任意の深さにネストできますが、ほとんどの実用目的では、1 レベルまたは 2 レベル下まで再帰するだけで済みます。それを超えると、おそらくバウンスか何かになり、調査しているメッセージの直接的な機能ではありません)。

正規表現には可能な分割ポイントがいくつかしかないため (現実的に)、改行の可能性を考慮して正規表現をリファクタリングできます。

:0
* ^Content-type: multipart/
{
  :0B
  * ^Content-Type: application/(zip|x-zip-compressed)|\
    ^Content-Type:.*(($)[   ].*)*name=.*\.(zip|exe|rar|rtf|docm)|\
    ^Content-.*attachment.*(($)[    ].*)*name=.*\.(zip|exe|rar|rtf|docm)|\
    ^Content-.*application.octet-stream.*(($)[  ].*)*name=.*\.(zip|exe|rar|rtf|docm)
  $L/.3_my._quarantine/
}

(($)[ ].*)*いくつかの場所で追加されていることに気づくでしょう。これは、改行文字 ( ($)) の後に空白文字 (タブまたはスペース、[ ]) が続き、その後に任意の文字が 0 回以上繰り返されることを意味します。

(余談ですが、スコアリングを使用するとデバッグが少し簡単になるかもしれません:

  :0 B
  * 1^1 ^Content-Type: application/(zip|x-zip-compressed)
  * 1^1 ^Content-Type:.*(($)[   ].*)*name=.*\.(zip|exe|rar|rtf|docm)
  * 1^1 ^Content-.*attachment.*(($)[    ].*)*name=.*\.(zip|exe|rar|rtf|docm)
  * 1^1 ^Content-.*application.octet-stream.*(($)[  ].*)*name=.*\.(zip|exe|rar|rtf|docm)
  ...

VERBOSE=yesこれにより、この複雑なマルチ正規表現レシピ内の各正規表現の結果をログで確認できます。

完全に漏れのないレシピが必要な場合は、Python または Perl (または Ruby など) で簡単なスクリプトを書いて、MIME 構造を正規化してください。emil昔、これと同じようなことを行う というツールがあったことを覚えていますが、十分に確立されておらず、ドキュメントも充実していませんでした。(実際、私の記憶が正しければ、それは pre-MIME にプラグインするように特別に設計されておりsendmail、他の用途に使用することはほぼ不可能でした。)

関連情報