Correção de vulnerabilidade para o Cyrus Imap

Quem utiliza versões do Cyrus Imap inferiores a 2.4.11 deve urgentemente atualizar a mesma ou aplicar o patch abaixo para correção de uma vulnerabilidade que pode ocasionar uma negação de serviço (DoS) no Cyrus:

http://git.cyrusimap.org/cyrus-imapd/commit/?id=6e776956a1a9dfa58eacdd0ddd52644009eac9e5

Segue  relato da vulnerabilidade conforme o site da CVE:

he index_get_ids function in index.c in imapd in Cyrus IMAP Server before 2.4.11, when server-side threading is enabled, allows remote attackers to cause a denial of service (NULL pointer dereference and daemon crash) via a crafted References header in an e-mail message.

Referência: http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2011-3481

 

Anúncios

Cyrus Imap: “Message contains bare newlines” – Erro ao importar mensagens

Ao tentar importar algumas mensagens no Cyrus Imap o servidor retorna a seguinte mensagem: Message contains bare newlines”

Na página do projeto Cyrus, no próprio FAQ (http://cyrusimap.web.cmu.edu/mediawiki/index.php/FAQ) o problema já é relatado:

Message contains bare newlines”

Why does Cyrus reject messages with “bare newlines”

Please first read about Cyrus Interoperability.

Bare newlines is a nono in an RFC822 message. You should first try to fix the software that is causing the problem.

As it happens, the bare newlines-rejection has never been a problem for us.”

O problema portanto se trata de “quebra de linha”, alguns caracteres que o Outlook (principalmente) utiliza para marcar o fim de uma linha de texto violam a RFC822, e o Cyrus Imap é conhecido, além da sua boa performance e escalabilidade, por ser bastante rigoroso com RFCs.

Como não há qualquer documento na base de conhecimento pública da Microsoft que viabilize alterar o comportamento do Outlook/Exchange para corrigir esse problema, portanto existem duas soluções:

    • Alterar o código do Cyrus para não rejeitar “bare newlines”. Isso envolve aplicar um patch já conhecido, muitas soluções que utilizam o Cyrus (Suse e-mail server e Invoka por exemplo) já optaram por este caminho.
    • Fazer com que o cliente que está importando a mensagem identifique esse comportamento e corrija conforme a RFC822.

    Abaixo está o conteúdo do patch para o Cyrus desconsiderar essa RFC, foi feito para a versão 2.3.7, caso utilize alguma versão mais recente provavelmente será necessário modificar:

  • — NEW FILE cyrus-imapd-2.3.7-nobarenewlinescheck.patch —
    — cyrus-imapd-2.3.7/imap/message.c    2006-10-28 22:18:08.000000000 +0200
    +++ cyrus-imapd-2.3.7/imap/message.c.nobarenewlinescheck    2006-10-28 22:21:55.000000000 +0200
    @@ -256,8 +256,9 @@
    r = IMAP_MESSAGE_CONTAINSNULL;
    }
    else if (*p = ‘\n’) {
    –        if (!sawcr && (inheader || !allow_null))
    –            r = IMAP_MESSAGE_CONTAINSNL;
    +        /* Do *NOT* check for RFC compliant line breaks (bare newlines) */
    +        /* if (!sawcr && (inheader || !allow_null))
    +            r = IMAP_MESSAGE_CONTAINSNL; */
    sawcr = 0;
    if (blankline) {
    inheader = 0;:

Cyrus – ExpressoLivre não modificar datas ao importar mensagens ou utilizar reconstruct

Olá pessoal ! Compartilhando mais uma dica do Cyrus com vocês:

A partir da versão 2.4.0 do Cyrus foi incluído um patch de contribuição
do fastmail, que permite determinar qual mecanismo será utilizado para
considerar a data da mensagem. O parâmetro no imapd.conf é
"internaldate_heuristic", se for setado como "receivedheader" será
considerado a data da mensagem do header da mesma, se não for possível
utiliza datas do sistema.

Fiz os testes e o Cyrus manteve a data original da mensagem ao importar
pelo ExpressoLivre (fiz o teste com uma mensagem .eml e várias em um .zip) ou
retornar backup de mensagens sem o arquivo de índice.

Referências:

www.cyrusimap.org/docs/cyrus-imapd/2.4.8/man/imapd.conf.5.php cyrus.brong.fastmail.fm/

Também compartilhei em: 

http://listas.expressolivre.org/pipermail/infra/msg00211.html

Script em Python para recuperação de arquivos skiplist

Olá pessoal, encontrei esse script em python para recuperar arquivos no formato skiplist corrompidos , ele consegue converter para flat mesmo quando o cvt_cyrusdb não é capaz.

Link para o script: http://oss.netfarm.it/download/skiplist.py
Site: http://oss.netfarm.it/python-cyrus

Conforme documentado no site, o script é executado no arquivo corrompido que depois pode ser convertido para o formato skiplist ou outros formatos suportados pelo cvt_cyrusdb:

skiplist.py corrupted.seen > seen.txt
/usr/sbin/cvt_cyrusdb _full_path_/seen.txt flat _full_path_/repaired.seen skiplist

Já utilizei em casos reais com arquivos .seen e mailboxes.db e funcionou perfeitamente, ele recupera o último estado antes de ser corrompido.

Também compartilhei em:

http://listas.expressolivre.org/pipermail/infra/msg00190.html

Cyrus: Indexação dos arquivos SQUAT

Configuração interessante para a indexação de arquivos SQUAT no Cyrus Imap:

http://listas.expressolivre.org/pipermail/infra/msg00205.html

Boa noite !

Na Wiki (http://trac.expressolivre.org/wiki/cyrus), onde fala sobre a
configuração do servidor Imap, tem o seguinte parâmetro no cyrus.conf:

  # SQUATTER indexa as caixas postais para pesquisa.
  squatter        cmd="/usr/cyrus/bin/squatter -s -r user" at=2300

Na versão do cyrus-2.2 que está no repositório do debian esta
funcionalidade ainda não foi incluída, mas nas versões mais novas (fico
devendo em qual versão foi adicionado, apenas sei que foi contribuição
de David Carter) existe o parâmetro "-i", para efetuar a indexação nos
arquivos SQUAT existentes de forma incremental, efetuei diversos testes
e reduz de forma significante o tempo gasto para essa operação:

"-i     Incremental updates where squat indexes already exist."

 http://listas.expressolivre.org/pipermail/infra/msg00207.html

Obrigado Lucas !

Apenas para concluir, vou completar a informação que fiquei devendo:

É possível utilizar a indexação incremental a partir da versão 2.3.12,
conforme o changelog do Cyrus:

http://www.cyrusimap.org/docs/cyrus-imapd/2.4.10/changes.php

"... Changes to the Cyrus IMAP Server since 2.3.11
    Implemented incremental squat updates (see squatter.8) -- courtesy
of David Carter. ...

Cyrus Imap: Fatal error: Internal error: assertion failed: seen_db.c: 127: *seendbptr == NULL

 

Mais uma dica minha publicada no VivaoLinux:

http://www.vivaolinux.com.br/dica/Cyrus-Imap-Fatal-error-Internal-error-assertion-failed-seen_db.c-127-*seendbptr-==-NULL/

Essa dica é para quem necessita compilar o Cyrus Imap 2.4.8 com suporte a replicação direto dos fontes, porém há um erro no código do sync_client que resulta no erro “Fatal error: Internal error: assertion failed: seen_db.c: 127:  *seendbptr == NULL” ao tentar efetuar a replicação com o sync_client, afetando dessa forma o sincronismo dos arquivos .seen e scripts sieve.

É necessário aplicar um patch no arquivo imap/sync_client.c, esse é o conteúdo:

From 5de9eee60d947243a4b4b2f4eccc63cff2771b30 Mon Sep 17 00:00:00 2001
From: Bron Gondwana <brong@opera.com>
Date: Thu, 31 Mar 2011 05:03:10 +0000
Subject: seen: fix seen_db related crash


— a/imap/sync_client.c
+++ b/imap/sync_client.c
@@ -1423,7 +1423,7 @@ static int update_seen_work(const char *
static int do_seen(char *user, char *uniqueid)
{
int r = 0;
–    struct seen *seendb;
+    struct seen *seendb = NULL;
struct seendata sd;

if (verbose)
@@ -1437,12 +1437,8 @@ static int do_seen(char *user, char *uni
if (r) return 0;

r = seen_read(seendb, uniqueid, &sd);
–    if (r) {
–       seen_close(&seendb);
–       return 0;
–    }

–    r = update_seen_work(user, uniqueid, &sd);
+    if (!r) r = update_seen_work(user, uniqueid, &sd);

seen_close(&seendb);
seen_freedata(&sd);
@@ -1876,7 +1872,7 @@ static int do_user_seen(char *user, stru
{
int r;
struct sync_seen *mseen, *rseen;
–    struct seen *seendb;
+    struct seen *seendb = NULL;
struct sync_seen_list *list;

/* silently ignore errors */

Copie o conteúdo acima, salve o arquivo no diretório raiz dos fontes e mande aplicar o patch:

# patch -p1 < arquivo.patch

Feito isso, compile o Cyrus normalmente.

Link informando sobre o problema: www.mail-archive.com/debian-bugs-dist@lists.debian.org/msg904344.html

Dica publicada no VivaoLinux

Essa dica é para quem precisa compilar o Cyrus 2.4.8 no Debian:

http://www.vivaolinux.com.br/dica/Compilando-o-Cyrus-Imap-2.4.8-no-Debian-sem-Kerberos/

Mesmo não habilitando o Kerberos continua recebendo os erros abaixo, ao executar o make:

/lib/libcyrus.a(auth_krb5.o): In function `mycanonifyid’:
/usr/src/cyrus-imapd-2.4.8/lib/auth_krb5.c:121: undefined reference to `krb5_init_context’
/usr/src/cyrus-imapd-2.4.8/lib/auth_krb5.c:124: undefined reference to `krb5_parse_name’
/usr/src/cyrus-imapd-2.4.8/lib/auth_krb5.c:131: undefined reference to `krb5_get_default_realm’
/usr/src/cyrus-imapd-2.4.8/lib/auth_krb5.c:139: undefined reference to `krb5_build_principal’
/usr/src/cyrus-imapd-2.4.8/lib/auth_krb5.c:149: undefined reference to `krb5_realm_compare’
/usr/src/cyrus-imapd-2.4.8/lib/auth_krb5.c:155: undefined reference to `krb5_free_principal’
/usr/src/cyrus-imapd-2.4.8/lib/auth_krb5.c:159: undefined reference to `krb5_unparse_name’
/usr/src/cyrus-imapd-2.4.8/lib/auth_krb5.c:173: undefined reference to `krb5_free_principal’
/usr/src/cyrus-imapd-2.4.8/lib/auth_krb5.c:174: undefined reference to `krb5_free_context’
/usr/src/cyrus-imapd-2.4.8/lib/auth_krb5.c:161: undefined reference to `krb5_free_principal’
/usr/src/cyrus-imapd-2.4.8/lib/auth_krb5.c:162: undefined reference to `krb5_free_context’
/usr/src/cyrus-imapd-2.4.8/lib/auth_krb5.c:142: undefined reference to `krb5_free_principal’
/usr/src/cyrus-imapd-2.4.8/lib/auth_krb5.c:143: undefined reference to `krb5_free_context’

Para corrigir esse problema, edite o arquivo auth.c , localizado dentro da pasta lib dos fontes do Cyrus e remova as seguintes linhas:

ifdef HAVE_KRB
&auth_krb,
endif
ifdef HAVE_GSSAPI_H
&auth_krb5,
endif

Feito isso, basta executar o make novamente!