涉及程序:
Carnegie Mellon University Cyrus-SASL
描述:
Cyrus SASL 库存在多个缓冲溢出缺陷
详细:
Cyrus SASL 库用于提供多个用于安全认证的函数集。
由于设计上的原因,Cyrus SASL 库存在多个缓冲溢出缺陷。如果远程攻击者能够非常成功地利用这些缺陷的话,将可以以当前进程权限在受害者系统上执行任意指令
1. 超长字节用户名堆溢出缺陷
Cyrus SASL 库在处理用户名时缺乏充分地边界检查,远程攻击者可利用此缺陷通过递交超长字节用户名而导致发生基于堆的缓冲区溢出,精心构建用户名数据可能以当前进程权限在受害者系统上执行任意指令。客户端库也存在这个问题,但是由于用户名是从本地用户获得,就比较难利用这个缺陷,这个溢出只有在默认realm被设置的情况下才存在。
2. 畸形用户名和域的LDAP堆溢出缺陷
Cyrus SASL库无法正确处理用户名或域(realm)中含有的特殊字符,当远程攻击者提交的用户名和域名中含有 '*'、'('、')'、'\'和'\0'字符时,由于无法进行正确处理将会覆盖malloc头结构,精心构建的数据覆盖指定结构地址,将能以当前进程权限在系统上执行任意指令。
3. 日志记录内存破坏缺陷
Cyrus SASL在当生成日志文件记录信息时分配缓冲区存在问题,远程攻击者可以利用此缺陷使Cyrus产生恶意LOG条目破坏内存结构,以SASL进程权限在系统上执行任意指令。由于日志记录时没有对'\0'终止符分配充分的内存空间,攻击者可以精心提交信息,触发Cyrus产生恶意日志而破坏内存结构,可能覆盖敏感变量或以SASL进程权限在系统上执行任意指令。
以上的这些问题在Cyrus上存在,其它使用了SASL库的应用程序也可能存在这些缺陷。
受影响系统:
Carnegie Mellon University Cyrus-SASL 2.1.9
不受影响系统:
Carnegie Mellon University Cyrus-SASL 2.1.10
Carnegie Mellon University Cyrus-SASL 1.5.28
攻击方法:
见上述详细技术细节
解决方案:
目前厂商已发布升级补丁,建议用户立即下载:
Cyrus Upgrade SASL 2.1.10
ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/cyrus-sasl-2.1.10.tar.gz
* Timo Sirainen <tss@iki.fi>提供如下第三方补丁:
diff -ru cyrus-sasl-2.1.9-old/lib/canonusr.c cyrus-sasl-2.1.9/lib/canonusr.c
--- cyrus-sasl-2.1.9-old/lib/canonusr.c 2002-09-16 21:37:20.000000000 +0300
+++ cyrus-sasl-2.1.9/lib/canonusr.c 2002-12-05 06:18:36.000000000 +0200
@@ -3066 +3067 @@
/* Now copy! (FIXME: check for SASL_BUFOVER?) */
memcpy(out_user begin_u MIN(ulen out_umax));
if(sconn && u_apprealm) {
+ if(ulen >= out_umax) return SASL_BUFOVER;
out_user[ulen] = '@';
memcpy(&(out_user[ulen+1]) sconn->user_realm
MIN(u_apprealm-1 out_umax-ulen-1));
diff -ru cyrus-sasl-2.1.9-old/saslauthd/lak.c cyrus-sasl-2.1.9/saslauthd/lak.c
--- cyrus-sasl-2.1.9-old/saslauthd/lak.c 2002-08-01 22:58:24.000000000 +0300
+++ cyrus-sasl-2.1.9/saslauthd/lak.c 2002-12-05 07:43:34.000000000 +0200
@@ -2797 +2797 @@
char *buf;
char *end *ptr *temp;
- buf = malloc(strlen(s) * 2 + 1);
+ buf = malloc(strlen(s) * 3 + 1);
if (buf == NULL) {
return LAK_NOMEM;
}
@@ -3587 +3588 @@
if( *buf == '%' ) percents++;
}
- buf=malloc(strlen(lak->conf->filter) + (percents * maxparamlength) +1);
+ buf=malloc(strlen(lak->conf->filter) +
+ (percents * maxparamlength * 3) + 1);
if(buf == NULL) {
syslog(LOG_ERR|LOG_AUTH "Cannot allocate memory");
return LAK_NOMEM;
diff -ru cyrus-sasl-2.1.9-old/lib/common.c cyrus-sasl-2.1.9/lib/common.c
--- cyrus-sasl-2.1.9-old/lib/common.c 2002-09-19 01:07:54.000000000 +0300
+++ cyrus-sasl-2.1.9/lib/common.c 2002-12-05 08:11:49.000000000 +0200
@@ -13266 +13268 @@
}
}
+ result = _buf_alloc(&out &alloclen outlen+1);
+ if (result != SASL_OK) goto done;
out[outlen]=0; /* put 0 at end */
va_end(ap);
note : 此补丁的有效性还没有得到证实