/dev/urandom 缺省时 libdes 产生可被预测的密码(BSD,缺陷)
作者:caoner 来源:未知 添加时间:2006-5-21 16:00:42NetBSD-current (1999.06.24 - 2000.06.22)
描述
/dev/urandom 缺省时 libdes 产生可被预测的密码
详细
NetBSD-current 中的 libdes 因为缺少与 DES 库(包括MIT's Kerberos v4) 兼容的函数,如果 /dev/urandom 未被使用, des_init_random_number_generator 会用常量来产生可被预测的密码。
以下是在 NetBSD 中受此影响的程序:
/usr/bin/telnet
/usr/libexec/telnetd
/usr/sbin/kadmin
/usr/sbin/kdb_edit
/usr/sbin/kdb_init
/usr/sbin/kerberos
/usr/sbin/ksrvutil
其它一些使用des_init_random_number_generator的程序也会受到影响。
在libdes中 的函数有 des_set_random_generator_seed, des_new_random_key和 des_init_random_number_generator。产生密码的过程是首先 des_init_random_number_generator 函数用一个隐藏的数值来初始化随意数产生器,然后环境变量被用来区分这个隐藏值,这使得有同样隐藏值的用户不会得到同样的结果,des_new_random_key 随后被用来产生64位的随意数据。
但是在1999.06.24 到 2000.06.22 之间的 NetBSD 中, des_init_random_number_generator 中存在一个错误放置的 "memset" call 使隐藏值在被使用之前为 0,这样只有少量的环境变量的参加了随意数产生过程,而得到的结果达不到理想的安全水平。如果 /dev/urandom 是当前可读, des_new_random_key 会使用它,产生的随意数不会有安全问题。
解决方案
1)升级到2000.06.22以后的NetBSD-current。
2)临时方案:
确认/dev/urandom的存在并对所有用户可读
在命令行输入以下命令:
dd if=/dev/urandom of=/dev/null bs=64 count=1
如果得到了以下输出,表明你的系统不存在这个漏洞:
1+0 records in
1+0 records out
为使以后的版本里正确使用随意数产生器,确认在核心设置文件里
pseudo-device rnd
是当前有效的。
3)如果上述办法不适合你的情况,下面的补丁可用于受影响机上的src/crypto-us/lib/libdes/rnd_keys.c,需重新安装建立 libdes。
- --- rnd_keys.c 1999/07/30 19:41:06 1.5
+++ rnd_keys.c 2000/06/22 00:01:26
@@ -75,12 +75,12 @@
snprintf(accum, 512, "%ld%ld%d%s%d%qd", when.tv_sec, when.tv_usec,
getpid(), hname, getuid(), *seed);
- - memset(accum, 0, 512);
- -
SHA1Update(&sha, (u_char *)accum, strlen(accum));
SHA1Final(results, &sha);
+ memset(accum, 0, 512);
+
des_random_seed(results); /* XXX uses only first 8 bytes! */
memset(results, 0, 20);
站内搜索