学院首页>操作系统>经验技巧>/dev/urandom 缺省时 libdes 产生可被预测的密码(BSD,缺陷)

/dev/urandom 缺省时 libdes 产生可被预测的密码(BSD,缺陷)

作者:caoner 来源:未知 添加时间:2006-5-21 16:00:42
涉及程序: 
NetBSD-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); 


站内搜索