S/Key和OPIE数据库漏洞
发布日期:2000-01-24
更新日期:2000-01-24
受影响系统:BSD/OS 4.0.1 (SKEY).
FreeBSD 3.4-RELEASE (OPIE).
Linux Distributions (with skey-2.2-1 RPM).
任何运行skey-2.2的Unix系统
描述:
在使用S/Key或OPIE认证的服务器上存在一个安全漏洞。这个漏洞允许本地用户获得对S/Key或OPIE数据库的访问权。
S/Key是使用一次性口令技术的认证机制。系统管理员可以进行配置,使用户能够通过S/Key认证访问使用login(8)的任何服务,如Telnet和FTP。制定认证类型的配置文件是/etc/login.conf。
为了配置一个用户能够使用S/Key,管理员或该用户(如果程序是suid root)首先必须使用skeyinit(或keyinit)程序。这个程序初始化S/Key数据库(/etc/skeykeys)中的用户入口项。这个数据库文件包含输入S/Key口令时需要比较的信息。
OPIE (One-time Passwords In Everything)是基于S/Key的一次性口令方案。它实现了许多增强功能,但在管理方面仍然非常相似。不同之处是它使用opiepasswd程序和/etc/opiekeys数据库文件。
S/Key:
如果使用skeyinit程序,将调用libskey库的skeylookup函数。如果/etc/skeykeys数据库不存在,它将创建访问权限为644的文件。
有问题的代码如下:
(from skey-2.2)
/* See if the _PATH_SKEYFILE exists, and create it if not */
if(stat(_PATH_SKEYFILE,&statbuf) == -1 && errno == ENOENT){
mp->keyfile = fopen(_PATH_SKEYFILE,"w+");
(void) chmod(_PATH_SKEYFILE, 0644);
OPIE:
如果使用opiepasswd程序,将调用libopie库的opieopen()函数。有两个函数opiereadrec()和opiewriterec()调用opieopen()函数时指定访问权限为644。如果/etc/opiekeys数据库不存在,则将创建权限为644的文件。
有问题的代码如下:
The problem code is shown below.
opiereadrec:
if (!(f = __opieopen(KEY_FILE, 0, 0644))) {
opiewriterec:
switch(i) {
case 0:
if (!(f = __opieopen(KEY_FILE, 1, 0644)))
return -1;
if (fseek(f, opie->opie_recstart, SEEK_SET))
return -1;
break;
case 1:
if (!(f = __opieopen(KEY_FILE, 2, 0644)))
return -1;
break;
default:
return -1;
}
影响:
本地用户能够读取/etc/skeykeys文件内容。由于口令信息以MD4或MD5方式加密后保存到该文件中,攻击者可以利用字典暴力破解口令。
建议:
修改数据库文件访问权限:
S/Key:
# /usr/bin/chmod 600 /etc/skeykeys
OPIE (FreeBSD):
# /usr/bin/chmod 600 /etc/opiekeys
浏览次数:6891
严重程度:0(网友投票)