xfocus logo xfocus title
首页 焦点原创 安全文摘 安全工具 安全漏洞 焦点项目 焦点论坛 关于我们
English Version

libSieve Header名缓冲区溢出漏洞


发布时间:2002-12-03
更新时间:2002-12-03
严重程度:
威胁程度:本地拒绝服务
错误类型:边界检查错误
利用方式:服务器模式

BUGTRAQ ID:6294

受影响系统
Cyrusoft libSieve 2.1.2
   + Carnegie Mellon University Cyrus IMAP Server 2.1.10
详细描述
Sieve库中发现存在一个漏洞。通过传递一个超长字符串的HEADER信息给某一连接到有此漏洞库的程序时,就可以发生缓冲区溢出。

攻击者提供的错误信息精确覆盖堆栈地址,可以以进程权限执行任意代码。

测试代码
尚无

解决方案
Timo Sirainen <tss@iki.fi>提供如下没有得到证实的补丁:

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;
     }

相关信息
Timo Sirainen <tss@iki.fi>.
参考:http://online.securityfocus.com/archive/1/301857