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

От: Dmitry Baronov <CGatePro_at_mx_ru>
Дата: Fri 05 Dec 2008 - 13:00:08 MSK

Угу, так и сделал, спасибо!

Varinov Nicolay пишет:
> День добрый 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);
> }
> /* ----------------------------------------------------------------- */
>
>
>
> ##################################################################
> Вы получили это сообщение потому, что подписаны на список рассылки
> <CGatePro@mx.ru>.
>
> Чтобы отписаться, отправьте сообщение на адрес <CGatePro-off@mx.ru>
> Чтобы переключиться в режим дайджеста - mailto:<CGatePro-digest@mx.ru>
> Чтобы переключиться в индексный режим - mailto:<CGatePro-index@mx.ru>
> Для административных запросов адрес <CGatePro-request@mx.ru>
> Архив списка: http://mx.demos.su/lists/cgp-russian/
>
>
>
>
Получено Fri Dec 05 10:00:18 2008

Этот архив был сгенерирован hypermail 2.1.8 : Fri 05 Dec 2008 - 16:14:22 MSK