在使用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,...
在使用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方式加密后保存到该文件中,攻击者可以利用字典暴力破解口令。 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: # /usr/bin/chmod 600 /etc/skeykeys OPIE (FreeBSD): # /usr/bin/chmod 600 /etc/opiekeys