Re[2]: Re[2]: Clamav/CGP/FreeBSD

От: Varinov Nicolay <CGatePro_at_mx_ru>
Дата: Fri 05 Dec 2008 - 11:33:19 MSK

День добрый 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
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);
}

/* ----------------------------------------------------------------- */
Получено Fri Dec 05 08:33:30 2008

Этот архив был сгенерирован hypermail 2.1.8 : Fri 24 Apr 2015 - 16:16:13 MSK