首页 -> 安全研究

安全研究

安全漏洞
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



浏览次数:6881
严重程度:0(网友投票)
本安全漏洞由绿盟科技翻译整理,版权所有,未经许可,不得转载
绿盟科技给您安全的保障