首页 -> 安全研究

安全研究

安全漏洞
Cyrus Sieve / libSieve远程缓冲区溢出漏洞

发布日期:2002-12-02
更新日期:2002-12-06

受影响系统:
libSieve libSieve 2.1.2
描述:
BUGTRAQ  ID: 6294,6299

Cyrus Sieve /libSieve是邮件分析、排序和过滤的一个函数库。

Cyrus Sieve多处对用户提交的输入缺少正确检查,远程攻击者可以利用这个漏洞进行拒绝服务攻击,可能以Imap进程权限在系统上执行任意指令。

当攻击者提交头名字超过100字符,或IMAP标记超过100字节,或一脚本包含多个错误信息超过了'error message'500个字符的限制,就可以导致发生缓冲区溢出,精心构建提交数据可能以Imap进程权限在系统上执行任意指令。

<*来源:Timo Sirainen (tss@iki.fi
  
  链接:http://marc.theaimsgroup.com/?l=bugtraq&m=103886433123554&w=2
*>

建议:
临时解决方法:

如果您不能立刻安装补丁或者升级,NSFOCUS建议您采取以下措施以降低威胁:

* 采用如下Timo Sirainen(tss@iki.fi)提供的第三方补丁:

如下更改只改变yacc文件,用户仍旧需要生成.c文件。LibSieve 2.1.3会仍旧包含其他潜在的缓冲区溢出,需要手工进行安全加固。

diff -ru cyrus-imapd-2.1.10-old/sieve/addr.y cyrus-imapd-2.1.10/sieve/addr.y
--- cyrus-imapd-2.1.10-old/sieve/addr.y    2002-10-28 18:30:18.000000000 +0200
+++ cyrus-imapd-2.1.10/sieve/addr.y    2002-12-02 04:52:58.000000000 +0200
@@ -82,8 +82,9 @@
/* copy address error message into buffer provided by sieve parser */
int yyerror(char *s)
{
-extern char addrerr[];
+extern char addrerr[512];

-    strcpy(addrerr, s);
+    strncpy(addrerr, s, sizeof(addrerr)-1);
+    addrerr[sizeof(addrerr)-1] = '\0';
     return 0;
}
diff -ru cyrus-imapd-2.1.10-old/sieve/sieve.y cyrus-imapd-2.1.10/sieve/sieve.y
--- cyrus-imapd-2.1.10-old/sieve/sieve.y    2002-05-14 19:51:50.000000000 +0300
+++ cyrus-imapd-2.1.10/sieve/sieve.y    2002-12-02 03:57:17.000000000 +0200
@@ -810,7 +810,7 @@
     addrptr = s;
     addrerr[0] = '\0';    /* paranoia */
     if (addrparse()) {
-    sprintf(errbuf, "address '%s': %s", s, addrerr);
+    snprintf(errbuf, sizeof(errbuf), "address '%s': %s", s, addrerr);
    yyerror(errbuf);
    return 0;
     }
@@ -835,7 +835,7 @@
       ;  controls, SP, and
       ;  ":". */
    if (!((*h >= 33 && *h <= 57) || (*h >= 59 && *h <= 126))) {
-        sprintf(errbuf, "header '%s': not a valid header", hdr);
+        snprintf(errbuf, sizeof(errbuf), "header '%s': not a valid header", hdr);
        yyerror(errbuf);
        return 0;
    }
@@ -853,14 +853,14 @@
    if (strcmp(f, "\\seen") && strcmp(f, "\\answered") &&
        strcmp(f, "\\flagged") && strcmp(f, "\\draft") &&
        strcmp(f, "\\deleted")) {
-        sprintf(errbuf, "flag '%s': not a system flag", f);
+        snprintf(errbuf, sizeof(errbuf), "flag '%s': not a system flag", f);
        yyerror(errbuf);
        return 0;
    }
    return 1;
     }
     if (!imparse_isatom(f)) {
-    sprintf(errbuf, "flag '%s': not a valid keyword", f);
+    snprintf(errbuf, sizeof(errbuf), "flag '%s': not a valid keyword", f);
    yyerror(errbuf);
    return 0;
     }

厂商补丁:

libSieve
--------
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:

http://libsieve.sourceforge.net/

浏览次数:2609
严重程度:0(网友投票)
本安全漏洞由绿盟科技翻译整理,版权所有,未经许可,不得转载
绿盟科技给您安全的保障