День добрый 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 <root@xxx.xxx>, 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
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;
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; }
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;
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; }
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;
return cl_reply(req, buf, len);
}
/* ----------------------------------------------------------------- */Получено Fri Dec 05 08:33:30 2008
Этот архив был сгенерирован hypermail 2.1.8 : Fri 24 Apr 2015 - 16:16:13 MSK