From M1Research

Jump to: navigation, search

pmf - Procmail's MIME filter



pmf is a Perl program for filtering e-mail. Program decompose e-mail into parts check each part using preinstalled filters to determine if e-mail contains forbiden attachments (like win32 executabled and script files). It use 'score' method to determine dengerous level of e-mail.


  • Open Source
  • Easyest way for intergration into mail system bases on procmail localmailer
  • Available filters:
    • DangerosHTMLtags - Detects attached htmls files with potencial possibilies to execute some code by IE;
    • ForbiddenExtensions - Check for forbided extension;
    • Win32Executable - Check if file is win32 executable;
    • ZIPList - Check file list of attached ZIP-archive;
    • WhiteListFrom - exception for 'trusted' senders;
    • WhiteListTo - exception for 'smart' recipient;


Version 0.93 (2004-12-18 16:00)

  • Download: pmf-0.93.tar.bz2
  • Changelog:
    • 1. Added latin-symbols-only link creation to saved attached files to prevent fail of e xternal programs to read files with non-8-bit symbols
    • 2. Modified filters checking order. Now system begin to check files from filters with lowest SCORE and system stop checking after global SCORE is bigger 0.0. This could save a time to determine if mail is dengerous (a bit of optimization)

Version 0.92 (2004-12-18 01:20)

  • Download: pmf-0.92.tar.bz2
  • Changelog:
    • 1. Added filters/ - Kaspersky's Antivirus Connectivity
    • 2. Added appropriate configuration section

Version 0.91 (2004-12-17)

  • Download: pmf-0.91.tar.bz2
  • Changelog:
    • 1. Added syslog facility
    • 2. Added appropriate configuration section

Version 0.90 (2004-12-11)

  • Download: pmf-0.90.tar.bz2
  • Changelog:
    • 1. Code reengeniering of
    • 2. Flexible reconfigration throw the pmf.conf


  • 1. Download source tarball
  • 2. Check if next modules installed:
if this modules not installed, please visit CPAN for download required modules
  • 3. Unpack archive into /usr/local/pmf/


  • 1. check pmf config file (modify config file for your system, modify white lists or disable some filters): /usr/local/pmf/pmf.conf:
# Renice priority to lower (keep system more stable)
# this prevent system to load up to 110% :-)) of users processes
RENICE          =>      -9,
# path where plugins installed
FILTERS_PATH    =>      '/usr/local/pmf/filters/',
# save blocked users emails to path
SAVE_PATH       =>      '/tmp/users/',
# temporarity directory for storing body and attachemt
TEMP_PATH       =>      '/tmp/pmf/',
# filters parameters
        'WhiteListTo'           =>
                LIST    =>      ['verem','root'],
                SCORE   =>      -100.0,
        'WhiteListFrom'         =>
                LIST    =>      ['','',''],
                SCORE   =>      -100.0,
        'ForbiddenExtensions'   =>
                LIST    =>      ['exe','com','pif','scr','bat','reg','ocx','dll','cmd','vbs','vb','cab','inf'],
                SCORE   =>      1.0,
        'Win32Executable'       =>
                LIST    =>      ['MZ','ELF'],
                MAX     =>      3,
                SCORE   =>      1.0,
        'ZIPList'               =>
                SCORE   =>      1.0,
#       'KAVtest'       =>
#       {
#       },
        'DangerosHTMLtags'              =>
                SCORE   =>      1.0,
# rewrite letter
# text of header of rewrited letter
    HEADER      =>      <<EOH
To: %s
From: <postmaster\>
Content-Type: text/plain; charset="koi8-r"
Content-Transfer-Encoding: 8bit

# body text of rewrited letter
    BODY        =>      <<EOH
Dear %s!

Your e-mail is blocked due to security policy of our company. If
you think that blocked e-mail is important, please ask system
administrators for unlocking e-mail with next reference number:




With best regards e-mail support teams,
  • 2. Modify procmail's config: /etc/procmailrc::
# pmf filter
| /usr/local/pmf/ /usr/local/pmf/pmf.conf $LOGNAME

program pmf configured as filter, for :0fw see procmail's manual.


It's able to log event to syslog. To enable this feature add to config:

# syslog!
SYSLOG          =>
    ident       =>      'pmf',
    logopt      =>      'cons,pid',
    facility    =>      'mail',
    priority    =>      'mail|warning',

That's will make syslog entries about found messages with score more then zero:

Dec 17 20:02:03 kazbek pmf[12656]: Recipient: pupkin, Score: 2.000000, Filters:    2.0 pmf::DangerosHTMLtags [<IFRAME src=XXX>:BODY],
Dec 17 20:02:03 kazbek pmf[12656]: Trace: from localhost.localdomain (localhost []) by (8.12.6p2/8.12.3) with ESMTP id iBFMCqj4085091 for <>; Thu, 16 Dec 2004 00:12:57 +0200 (EET) (envelope-from

KAV daemon connectivity

Kasspersky's antivirus provided throw this module. uses socket to connect to kavdaemon. Make sure that kavdaemon started. To enable this feature:

  • 1. add to FILTERS section of pmf.conf:
        'KAV'                   =>
                SCORE   =>      100.0,
                RESULT_BUFSIZE  => 1024,
                SOCKET  =>      '/var/run/AvpCtl',
  • 2. modify defUnix.prf in antivirus installation dir:
# same section with parameters for objects

This is done to aviod messages like :Directory XXXX wasn't included in enabled paths. in log file: /root/kavscan.rpt


Q. Nohing works, whats going on? A.Step by step diag procedure:

  • 1. Check if filter could be started:
/usr/local/pmf/ /usr/local/pmf/pmf.conf fooname

If filter starts and waits for input - that's OK, If you got warn messages, inspect messages, that could be messages about required Perl's modules for plugin startup or config file warning (config file has Perl syntax and pmf use eval function for loading config).

  • 2. Check filter running. If you have mail file (standart unix mbox) at some location - try to run filter manualy:
cat /tmp/test-e-mail-1 | /usr/local/pmf/ /usr/local/pmf/pmf.conf fooname > /tmp/test-e-mail-1.filtered

If you got warn messages during processing see previous step. In no messages given to stderr look into the /tmp/test-e-mail-1.filtered. Filter appends to header block own headers:

Subject: TEST2
X-pmf-About: pmf-0.9, see
X-pmf-Score: -100
X-pmf-Status: No
	*-100.0 pmf::WhiteListTo [fooname]


Subject: No subject
Content-Type: Multipart/Mixed;
X-pmf-About: pmf-0.9, see
X-pmf-Score: -99
X-pmf-Status: No
        *-100.0 pmf::WhiteListTo [fooname]
        *   1.0 pmf::ForbiddenExtensions [ziparchive|]
        *   1.0 pmf::ZIPList []
  • 3. Headers X-pmf-* could be usefull to detect what filter found. In examples above it's could be seen that that first message is 'clear' and next message is forced to be clear using white list filter.


    Procmail's MIME Filter
    filter to detect unnessaries or dangerous attachments
    Copyright (C) 2004 Maksym Veremeyenko.
    Contributed by Maksym Veremeyenko,, 2004.
    Procmail's MIME Filter is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
    Procmail's MIME Filter is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with Procmail's MIME Filter; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
Personal tools