Uncategorized

Kalandok a Cloudmark-kal

Böngészem a netet, vagy éppen egy SpamAssassin lista egyik levele került elém, és mit látok? A Cloudmark elérhetővé tette a szolgáltatását – Cloudmark Authority Engine (CMAE) – az elterjedt SpamAssassinhoz. Mi a CMAE? Egy 2 csomagból álló alkalmazás, amellyel a SpamAssassinba integrálható a Cloudmark kollaboratív vírus/spamszűrője. Az egyik része egy démon, ami a 2703/tcp porton várja a leveleket, a másik pedig egy SA plugin.

Én meg amilyen kísérletező kedvű vagyok, megnéztem a kliens részét, amihez nyilván van egy C library + header fájlok. Mázli, hogy a cmae_client.h
korrekt módon dokumentált, így írni tudtam egy rövid 2 soros C függvényt, ami fog egy levelet, és kideríti, hogy az vírus, spam vagy tiszta levél.

A megoldás egyébként úgy működik, hogy a kliens base64 kódolva elküldi a levelet a démonnak, az pedig az adatbázisa alapján eldönti, hogy az jó levél vagy sem. Mivel a Cloudmark képes valósidőben (real time) detektálni a vírus/spamkitöréseket, ezért nagyon fontos, hogy az adatbázisa up-to-date legyen. Ezt úgy oldja meg, hogy ún. microupdate-ekkel tartja percre frissen az adatbázisát, és csak egy licence kulcs kell hozzá.

A kliens program kb. ennyi:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <cmae_client.h>

int main(int argc, char **argv){
   int ret, fd;
   unsigned int ScoreOut=0;
   char *msg=NULL;
   struct stat st;
   CMAE_Client_Session SessionOut;

   if(argc < 2){
      printf("usage: %s <messagefile>\n", argv[0]);
      return 1;
   }

   if(CMAE_Client_Open(&SessionOut, "127.0.0.1", 0, 0, 0)){
      printf("CMAE_Client_Open()\n");
      return 1;
   }

   if(stat(argv[1], &st)){
      printf("cannot stat: %s\n", argv[1]);
      return 1;
   }

   fd = open(argv[1], O_RDONLY);
   if(fd == -1){
      printf("cannot open: %s\n", argv[1]);
      return 1;
   }

   msg = mmap(msg, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
   close(fd);

   if(msg == NULL){
      printf("mmap()\n");
      return 1;
   }

   ret = CMAE_Client_Score(SessionOut, NULL, msg,
           st.st_size, &ScoreOut, NULL, NULL, NULL, NULL);

   munmap(msg, st.st_size);

   CMAE_Client_Close(SessionOut);

   printf("%s %d\n", argv[1], ScoreOut);

   return 1;
}

Az elvégzett tesztben 1313 ham levél szerepelt a májusi levelezésemből, amiből 9-et tévesen spamként azonosított. Ebből kettőt mondhatunk nem kritikusnak (Sun hírlevelek), de a maradék 7 az üzleti levelezésem része, úgyhogy sajna 7 kritikus fals pozitív hibát is vétett. (FP: 9/1313 = 0.68%)

Kétféle spam mintán is leteszteltem: az egyik a junk mappa tartalma, 2182 levél, amiből csak 5 csúszott át, ez 99.77%-os spam felismerés. A másik minta a csapda email címre érkezett 4468 levélből állt, amiből 20 csúszott át, ami 99.55%-os spam felismerés.

A detektálás folyamata egyébként gyors, a 12 ujjlenyomatot gyorsan levette a levelekről, és kidobta az eredményt, hogy szerinte mi az ábra.

Ja igen, a kaland. A poén kedvéért kértem egy ajánlatot a Cloudmark-tól, hogy mégis mennyibe fájna ez nekem, ha a 30 napos trial után komolyra fordulna a dolog? Potom pénz az egész, évente $5,000, amiért akár 2222 mailboxot is megvédhetek.

Azt is kértem, hogy mutassanak már egy demo C-programot, hogyan kell használni az SDK-jukat? Erre jött a kiváncsiskodás, hogy minek az neked, mire akarod használni? Megírtam, hogy építek egy POP3 proxyt, ami bárki használhat regisztráció után egy féléves pilot erejéig. Aztán megjött a válasz, hogy sajna nem fog menni, csak a SpamAssassin plugint tudják adni. Nem akartam ünneprontó lenni, hogy már régen kész van a cucc…