From: "Varinov Nicolay" Received: by mx.demos.su (CommuniGate Pro PIPE 5.0.14) with PIPE id 541949471; Fri, 05 Dec 2008 11:33:30 +0300 X-Spam-Checker-Version: SpamAssassin 3.2.5-st3.demos (2008-06-10) X-Spam-Level: + X-Spam-Status: No, hits=1.6 required=5.0 tests=AWL,BAYES_00,SPAMOBORONA0, SUBJ_RE_NUM autolearn=no version=3.2.5-st3.demos X-Spam-Report: 1.6 points, 5.0 required; * -0.0 SPAMOBORONA0 SpamoOborona Visibility * -0.5 BAYES_00 BODY: Bayesian spam probability is 0 to 1% * [score: 0.0000] * 2.8 SUBJ_RE_NUM Subject is faking 'The Bat!' responses * -0.7 AWL AWL: From: address is in the auto white-list X-SO-Flag: NO X-SO-Stamp: CGP MX Received: from [80.72.112.10] (HELO mx.sotcom.ru) by mx.demos.su (CommuniGate Pro SMTP 5.0.14) with ESMTP id 541949468 for CGatePro@mx.ru; Fri, 05 Dec 2008 11:33:27 +0300 X-Virus-Scanned: by clamav-cgp on mx.sotcom.ru Received: from [80.72.112.28] (account nic@sotcom.ru HELO NIC-NB) by mx.sotcom.ru (CommuniGate Pro SMTP 5.0.14) with ESMTPSA id 44345645 for CGatePro@mx.ru; Fri, 05 Dec 2008 11:33:22 +0300 Date: Fri, 5 Dec 2008 11:33:19 +0300 Reply-To: Varinov Nicolay X-Priority: 3 (Normal) Message-ID: <132360423.20081205113319@sotcom.ru> To: "CommuniGate Pro Russian Discussions" Subject: Re[2]: [CGP] Re[2]: [CGP] Clamav/CGP/FreeBSD In-Reply-To: References: MIME-Version: 1.0 Content-Type: text/plain; charset=koi8-r Content-Transfer-Encoding: 8bit День добрый Dmitry, Friday, December 5, 2008, 10:16:13 AM, Вы пишете: .... DB> Вот запускаю clamav-cgp руками с консоли DB> /clamav-cgp -d 127.0.0.1 -s DB> 2 file elcar.com DB> * clamav-cgp[2]: elcar.com: stream: Eicar-Test-Signature FOUND DB> 2 DISCARD Угу... DB> А вот передаю этот же файл через почту DB> uuencode /var/CommuniGate/elcar.com Test.dat| mail -s 'Testing' root@xxx.xxx В том то и все дело, обсуждалось в начале года кстати с тобой в том числе :)) Смысл в том что в самом Clamav не совсем правильный парсер CGPшнах файлов очередей, он определяет что это файл CGP, только если в начале "P I ". В случае если делать uuencode /var/CommuniGate/elcar.com Test.dat| mail -s 'Testing' root@xxx.xxx, то в начале будет "R W" , но только при отправке через PIPE CGPшным mail и sendmail, при формировании вложения с использованием uuencode. На нормальную почту приходящую по SMTP clamav реагирует правильно попробуй elcar отправить из почтового клиента должен не дойти :)) Для Uxin socket и SCAN править надо в Clamav в libclamav/mbox.c или что правильнее писать им PR, мне честно лень, тем более что вариант что кто-то будет рассылать с сервера через PIPE вирей у меня нулевой. А для STREAM, если не связываться с Clamav, надо чуть-чуть поправить cl_stream() в clamav-cgp, чтобы файл передавался в Clamav на сканирование не с начала, а пропускались хедеры CGP и тогда Clamav все ловит и через PIPE. Если самому делать лень, то ниже правленый мной cl_stream(), когда изучал проблему в начале года. Вариант может не очень прилизанный, но рабочий. DB> В логах CGP DB> 10:09:30.494 2 QUEUE([30007]) from , 946 bytes DB> (<200812050709.mB579UQq003339@xxx.xxx>) DB> 10:09:30.494 4 EXTFILTER(clamav) out(023): 9 FILE Queue/30007.msg\n DB> 10:09:30.500 4 EXTFILTER(clamav) inp(004): 9 OK DB> 10:09:30.551 2 ENQUEUER-000003([30007]) [30007] rule(kaspersky): message DB> discarded with filter(kaspersky) DB> 10:09:30.551 2 QUEUE([30007]) discarded by Rules DB> 10:09:30.551 2 DEQUEUER [30007] SYSTEM(postmaster) delivered: delivered DB> via Automatic Rules DB> 10:09:30.552 2 QUEUE([30007]) deleted DB> clamav пропускает, за ним касперский ловит. Угу... DB> Чудеса... Да нет вполне объяснимый феномен :)) ------------------------ С наилучшими пожеланиями Николай Варинов. ------------------------ /* ----------------------------------------------------------------- */ static int cl_stream(req_t *req) { struct sockaddr_in srv_i; char buf[4096+2]; char hbuf[384]; int buf_len = sizeof(buf) - 2, len; int fd = -1, fdi = -1, fdo = -1, port; FILE *fin = NULL; unsigned long off = 0; if( (fd = transport_connect(req)) == -1 ) return -1; if( write(fd, "STREAM\n", 7) <= 0 ) { putline("* clamav-cgp[%u]: Can't write(): errno = %d\n", req->seqNum, errno); close(fd); return -1; } if( (len = read(fd, buf, buf_len)) <= 0 ) { putline("* clamav-cgp[%u]: Can't read(): errno = %d\n", req->seqNum, errno); close(fd); return -1; } buf[len] = '\0'; if( sscanf(buf, "PORT %d", &port) != 1 ) { putline("* clamav-cgp[%u]: Can't sscanf(): errno = %d\n", req->seqNum, errno); close(fd); return -1; } /* connect to clamd PORT */ if( (fdo = socket(PF_INET, SOCK_STREAM, 0)) < 0 ) { putline("* clamav-cgp[%u]: Can't socket(): errno = %d\n", req->seqNum, errno); close(fd); return -1; } memset(&srv_i, 0, sizeof(srv_i)); srv_i.sin_family = AF_INET; srv_i.sin_port = htons(port); srv_i.sin_addr = req->trans->hosts[0]; if( connect(fdo, (struct sockaddr *) &srv_i, sizeof(srv_i)) < 0 ) { putline("* clamav-cgp[%u]: Can't connect(%s:%d): errno = %d\n", req->seqNum, req->trans->hostname, port, errno); close(fd); close(fdo); return -1; } if( (fin = fopen(req->cmdArg, "r")) == NULL ) { putline("* clamav-cgp[%u]: Can't fdopen(fin) %s: errno = %d\n", req->seqNum, req->cmdArg, errno); close(fd); close(fdo); return -1; } while( fgets(hbuf, sizeof(hbuf), fin) != NULL ) { off += strlen(hbuf); if( strcmp(hbuf, "\n") == 0 ) { break; } } fclose(fin); if( (fdi = open(req->cmdArg, O_RDONLY)) == -1 ) { putline("* clamav-cgp[%u]: Can't open(%s): errno = %d\n", req->seqNum, req->cmdArg, errno); close(fd); close(fdo); return -1; } lseek(fdi,off,SEEK_SET); while( (len = read(fdi, buf, sizeof(buf)-2)) > 0 ) { if( write(fdo, buf, len) <= 0 ) { putline("* clamav-cgp[%u]: Can't write(): errno = %d\n", req->seqNum, errno); close(fd); close(fdi); close(fdo); return -1; } } close(fdi); close(fdo); if( (len = read(fd, buf, sizeof(buf)-2)) <= 0 ) { putline("* clamav-cgp[%u]: Can't read(): errno = %d\n", req->seqNum, errno); close(fd); return -1; } close(fd); return cl_reply(req, buf, len); } /* ----------------------------------------------------------------- */