FuzzyOcr Plugin : Détection des spams image (OCR Detection)

From Deimos.fr / Bloc Notes Informatique
Jump to: navigation, search

1 Introduction

L'outil de lutte contre les pourriels (spams) le plus répandu dans le monde du logiciel libre est spamassassin. Son mode de focntionnement se rapproche de celui du service amavisd-new. Il collecte les résultats obtenus par une collection d'autres outils et les transmet au service amavisd-new qui prend la décision sur le message en fonction du score total obtenu par celui-ci.

Du point de vue système, la mise en oeuvre de spamassassin est très simple. Il suffit de s'appuyer sur le paquet Debian/testing qui est très bien maintenu. Cette situation est d'autant plus intéressante que la collection des bibliothèques et des outils dépendants de spamassassin est très volumineuse. La commande :

Command apt-get
apt-cache show spamassassin

liste ces dépendances.

2 Configuration de Spamassassin

Il faut distinguer 2 niveaux pour la configuration de cet outil.

  • À l'échelle du système, le répertoire /etc/spamassassin contient les fichiers de configuration communs à l'ensemble des utilisateurs.
  • Pour l'utilisateur amavis, le répertoire .spamassassinsitué sous le répertoire personnel de l'utilisateur contient les fichiers de configuration dédiés ainsi que les bases de données constituées en cours d'exécution : liste blanche automatique, jetons de calcul, etc..

Comme dans les scénariis décrits dans ce document, le système sur lequel sont installés les outils est un serveur passerelle dédié au traitement du courrier électronique, tous les paramètres de configuration seront dans le répertoire général /etc/spamassassin et toutes les bases de données seront dans le répertoire /var/lib/amavis/.spamassassin.

3 La reconnaissance de caractères

La tendance de la rentrée 2006, c'est l'explosion des pourriels contenant des images animées de type GIF, PNG ou JPEG. Ces images contiennent le plus souvent des publicités ou des offres de cotations boursières pour le moins douteuses.

Le FuzzyOcr Plugin est une arme assez efficace pour lutter contre les pourriels contenant des images. Il se base sur la reconnaissance optique de caractères pour rechercher des mots clés dans ces images. Ce greffon possède aussi quelques optimisations pour le traitement des fichiers images volontairement corrompus.

Le fonctionnement de base du greffon, tel qu'il est décrit sur la page web de présentation recouvre les étapes suivantes :

  • Recherche les images dans les différentes parties du message,
  • Chaque image est analysée pour identifié sont format (GIF, PNG, JPEG),
  • Suivant le format d'image détecté, différents outils sont appelés pour convertir l'image au format PNM,
  • Le programme de reconnaissance optique de caractères gocr est appelé pour extraire le texte du fichier PNM,
  • Les chaînes de caractères obtenues sont scrutées à la recherche de mots prédéfinis, les scores sont calculés et les résultats sont transmis à spamassassin.

4 L'installation du greffon FuzzyOCR

Malheureusement, on ne dispose pas encore de paquet Debian/testing. Il faut donc passer par une installation manuelle en s'appuyant sur les paquets des outils utilisés par le greffon.

On commence par télécharger le code du greffon et placer les sources dans l'arborescence du serveur passerelle de courrier électronique :

Command
wget http://users.own-hero.net/~decoder/fuzzyocr/fuzzyocr-latest.tar.gz
mv fuzzyocr-latest.tar.gz /usr/local/src/
cd /usr/local/src/
tar xf fuzzyocr-latest.tar.gz
chown -R root.src FuzzyOcr*

Ensuite, il faut que ces packages soient installés :

Command apt-get
apt-get install spamassassin netpbm imagemagick libungif4g libungif-bin gocr libjpeg-progs libstring-approx-perl

5 Configuration du greffon FuzzyOCR

Pour cette partie, on ne suit pas les recommandations du fichier INSTALL. En effet, la configuration par défaut du greffon prévoit d'utiliser le répertoire /etc/mail/spamassassin qui n'existe pas sur un système Debian. De plus, il n'est pas souhaitable de mélanger du code et des éléments de configuration dans le répertoire /etc/.

Pour l'installation du code du greffon, la commande # dpkg -L spamassassin |grep Plugin/ permet d'identifier le répertoire de dépôt des autres greffons utilisés par spamassassin : /usr/share/perl5/Mail/SpamAssassin/Plugin/. On copie donc le code dans ce répertoire.

Command
cp FuzzyOcr.pm /usr/share/perl5/Mail/SpamAssassin/Plugin/

Pour le fichier de configuration, il suffit de copier les fichiers suivant dans le répertoire général de configuration de spamassassin.

Command
cp FuzzyOcr.cf /etc/spamassassin/
cp FuzzyOcr.words.sample /etc/spamassassin/FuzzyOcr.words
cd /etc/spamassassin

Plusieurs fichiers de configuration doivent être édités pour s'adapter au contexte de configuration.
On doit indiquer le nouveau greffon dans la liste parcourue par spamassassin en ajoutant une ligne à la fin du fichier v310.pre.

Command
echo loadplugin FuzzyOcr /usr/share/perl5/Mail/SpamAssassin/Plugin/FuzzyOcr.pm >> v310.pre

On doit éditer le fichier FuzzyOcr.cf pour l'adapter au contexte :

Configuration File FuzzyOcr.cf
#loadplugin FuzzyOcr FuzzyOcr.pm
body FUZZY_OCR eval:fuzzyocr_check()
describe FUZZY_OCR Mail contains an image with common spam text inside
body FUZZY_OCR_WRONG_CTYPE eval:dummy_check()
describe FUZZY_OCR_WRONG_CTYPE Mail contains an image with wrong content-type set
body FUZZY_OCR_CORRUPT_IMG eval:dummy_check()
describe FUZZY_OCR_CORRUPT_IMG Mail contains a corrupted image
body FUZZY_OCR_KNOWN_HASH eval:dummy_check()
describe FUZZY_OCR_KNOWN_HASH Mail contains an image with known hash

priority FUZZY_OCR             900

########### Plugin Configuration #############

#### Logging options #####
# Verbosity level (see manual) Attention: Don't set to 0, but to 0.0 for quiet operation. (Default value: 1)
focr_verbose 4
#
# Logfile (make sure it is writable by the plugin) (Default value: /etc/mail/spamassassin/FuzzyOcr.log)
focr_logfile /var/log/fuzzyocr.log
##########################

##### Wordlists #####
# Here we defined the words to scan for (Default value: /etc/mail/spamassassin/FuzzyOcr.words)
focr_global_wordlist /etc/spamassassin/FuzzyOcr.words
#
# This is the path RELATIVE to the respektive home directory for the personalized list
# This list is merged with the global word list on execution (Default value: .spamassassin/fuzzyocr.words)
#focr_personal_wordlist .spamassassin/fuzzyocr.words
#####################

# Set this to 1 if you are running a version < 3.1.4.
# This will disable a function used in conjunction with animated gifs that isn't available in earlier versions (Default value: 0.0)
#focr_pre314 0.0

# These parameters can be used to change other detection settings
# If you leave these commented out, the defaults will be used.
# Do not use " " around any parameters!
#
##### Location of helper applications (path + binary) (Default values: /usr/bin/<app>) #####
#focr_bin_giffix /usr/bin/giffix
#focr_bin_giffix /usr/bin/giffix
#focr_bin_giftext /usr/bin/giftext
#focr_bin_gifasm /usr/bin/gifasm
#focr_bin_gifinter /usr/bin/gifinter
#focr_bin_giftopnm /usr/bin/giftopnm
#focr_bin_jpegtopnm /usr/bin/jpegtopnm
#focr_bin_pngtopnm /usr/bin/pngtopnm
#focr_bin_ppmhist /usr/bin/ppmhist
#focr_bin_convert /usr/bin/convert
#focr_bin_identify /usr/bin/identify
#focr_bin_gocr /usr/bin/gocr
############################################################################################

##### Scansets, comma seperated (Default value: $gocr -i -, $gocr -l 180 -d 2 -i -) #####
# Each scanset consists of one or more commands which make text out of pnm input.
# Each scanset is run seperately on the PNM data, results are combined in scoring.
#focr_scansets $gocr -i -, $gocr -l 180 -d 2 -i -
#
# To use only one scan with default values, uncomment the next line instead
#focr_scansets $gocr -i -
#
# Some example for more advanced sets
# Thisone uses the first the standard scan, then a scanset which first reduces the image to 3 colors and then scans it with custom settings
# and then it scans again only with these custom settings
# NOTE: This is for advanced users only, if you have questions how to use this, ask on the ML or on IRC
#focr_scansets $gocr -i -, pnmnorm 2>$errfile 

Si voter version est vraiment différente de celle du dessus, voici un patch entre la configuartion de la passerelle et la version distribuée :

diff -uBb /usr/local/src/FuzzyOcr-2.3b/FuzzyOcr.cf FuzzyOcr.cf
--- /usr/local/src/FuzzyOcr-2.3b/FuzzyOcr.cf    2006-08-25 22:56:00.000000000 +0200
+++ FuzzyOcr.cf 2006-09-10 23:23:39.000000000 +0200
@@ -1,4 +1,4 @@
-loadplugin FuzzyOcr FuzzyOcr.pm
+#loadplugin FuzzyOcr FuzzyOcr.pm
body FUZZY_OCR eval:fuzzyocr_check()
describe FUZZY_OCR Mail contains an image with common spam text inside
body FUZZY_OCR_WRONG_CTYPE eval:dummy_check()
@@ -14,15 +14,15 @@
 
#### Logging options #####
# Verbosity level (see manual) Attention: Don't set to 0, but to 0.0 for quiet
# operation.
-#focr_verbose 1
+focr_verbose 4
#
# Logfile (make sure it is writable by the plugin)
-focr_logfile /etc/mail/spamassassin/FuzzyOcr.log
+focr_logfile /var/log/fuzzyocr.log
##########################
 
##### Wordlists #####
# Here we defined the words to scan for
-focr_global_wordlist /etc/mail/spamassassin/FuzzyOcr.words
+focr_global_wordlist /etc/spamassassin/FuzzyOcr.words
#
# This is the path RELATIVE to the respektive home directory for the personalized list
# This list is merged with the global word list on execution
@@ -90,6 +90,7 @@
#
# This is used to disable the OCR engine if the message has already more points
# than this value (Default value: 10)
#focr_autodisable_score 10
+#focr_autodisable_score 50
#
# Number of minimum matches before the rule scores (Default value: 2)
#focr_counts_required 2

Enfin, il faut implanter la configuration nécessaire à la journalisation.

Command
touch /var/log/fuzzyocr.log
chown amavis.amavis /var/log/fuzzyocr.log

Pour limiter l'occupation disque de la journalisation du greffon tout en conservant un historique à 90 jours, on créé un fichier de configuration pour le service logrotate. Créez ce fichier et insérez les lignes suivantes :

Configuration File /etc/logrotate.d/fuzzyocr
$ /etc/logrotate.d/fuzzyocr
/var/log/fuzzyocr.log {
    rotate 90
    daily
    compress
    delaycompress
    create 666 amavis amavis
    }

6 Les tests de validation

Avant toute manipulation, il faut s'assurer du bon fonctionnement de spamassassin. Les deux commandes :

Command spamassassin
spamassassin --lint

et

Command
su - amavis -- spamassassin --lint

ne doivent produire aucun affichage. Si ce n'est pas le cas, il faut revoir la configuration de spamassassin ou amavis avant de tester le fonctionnement du greffon.

On utilise ensuite les échantillons de pourriels fournis avec les sources du greffon et on analyse les résultats produits.

Command
$ spamassassin -t /usr/local/src/FuzzyOcr-2.3b/samples/animated-gif.eml
<snipped>
 20 FUZZY_OCR              BODY: Mail contains an image with common spam text inside
                           Words found:
                           "alert" in 4 lines
                           "charts" in 1 lines
                           "symbol" in 1 lines
                           "alert" in 4 lines
                           "stock" in 2 lines
                           "company" in 3 lines
                           "trade" in 1 lines
                           "meridia" in 1 lines
                           "growth" in 1 lines
                           (18 word occurrences found)

Command
$ spamassassin -t /usr/local/src/FuzzyOcr-2.3b/samples/corrupted-gif.eml
<snipped>
1.5 FUZZY_OCR_WRONG_CTYPE  BODY: Mail contains an image with wrong
                           content-type set
                           Image has format "GIF" but content-type is
                           "image/jpeg"
2.5 FUZZY_OCR_CORRUPT_IMG  BODY: Mail contains a corrupted image
                           Corrupt image: GIF-LIB error: Image is
                           defective, decoding aborted.
 14 FUZZY_OCR              BODY: Mail contains an image with common spam text inside
                           Words found:
                           "alert" in 1 lines
                           "alert" in 1 lines
                           "stock" in 2 lines
                           "investor" in 1 lines
                           "company" in 1 lines
                           "price" in 2 lines
                           "trade" in 1 lines
                           "target" in 1 lines
                           "service" in 1 lines
                           "recommendation" in 1 lines
                           (12 word occurrences found)

Command
$ spamassassin -t /usr/local/src/FuzzyOcr-2.3b/samples/jpeg.eml
<snipped>
 6.0 FUZZY_OCR             BODY: Mail contains an image with common spam text inside
                           Words found:
			   "viagra" in 2 lines
			   "cialis" in 1 lines
			   "levitra" in 1 lines
			   (4 word occurrences found)

On constate que les rapports sur les trois échantillons testés montrent que des mots clés ont été détectés dans les images et que les scores ont été augmentés en conséquence.

Il ne reste plus qu'à valider la solution en exploitation réelle ! Sans attendre, on obtient un échantillon qui montre que la reconnaissance optique de caractère à ajouté 18 points au score.

Extrait du journal système produit par le service amavisd-new :

Sep 10 18:08:57 MailGw amavis[13387]: (13387-04) SPAM, \
  <[email protected]> -> <[email protected]>, Yes, \
  score=27.449 tag=-999 tag2=6.31 kill=6.31 tests=[BAYES_50=2.5, \
  DATE_IN_FUTURE_03_06=1.961, EXTRA_MPART_TYPE=1.091, FUZZY_OCR=18.000, \
  HTML_MESSAGE=0.001, RCVD_IN_XBL=3.897, SPF_PASS=-0.001], \
  autolearn=spam, quarantine lkwO3NF5SAMT (spam-quarantine)

Extrait du journal produit par le greffon pour le même message :

[2006-09-10 18:08:57] Debug mode: Message is spam (score 18)...
[2006-09-10 18:08:57] Debug mode: Words found:
                      "charts" in 1 lines
                      "symbol" in 1 lines
                      "stock" in 2 lines
	              "international" in 3 lines
		      "company" in 2 lines
		      "million" in 1 lines
		      "buy" in 1 lines
                      "trade" in 3 lines
                      "target" in 1 lines
                      "meridia" in 1 lines
                      (16 word occurrences found)

7 Faq

7.1 Je reçois toujours des spams de type image, que faire ?

Il faut savoir que si c'est très bien camouflé, la détection échouera. Mais vérifiez également ce que disent le logs. J'ai eu un problème avec les droits au niveau des logs. Faites donc une petite correction à ce niveau là si c'est celà qui bloque.

8 Autres documentations

Voici une autre documentation en anglais