From djb@cr.yp.to Wed Dec 15 14:23:11 2004 Date: 15 Dec 2004 08:31:43 -0000 From: D. J. Bernstein To: securesoftware@list.cr.yp.to, Anoakie.Turner@asu.edu, trevor@freebsd.org Subject: [remote] [control] greed 0.81p DownloadLoop overflows COMMAND; DownloadLoop does not check for nasty characters Manigandan Radhakrishnan, a student in my Fall 2004 UNIX Security Holes course, has discovered two remotely exploitable security holes in ``Get and Resume Elite Edition'' (greed), an FTP/HTTP downloading tool. I'm publishing this notice, but all the discovery credits should be assigned to Radhakrishnan. You are at risk if you take a GRX file list from an email message (or a web page or any other source that could be controlled by an attacker) and feed it through greed. Whoever provides that file list then has complete control over your account: he can read and modify your files, watch the programs you're running, etc. A GRX file list includes local file names; local file names are dangerous in a much more obvious way, and presumably are checked by the user. These attacks work even if the local file names are innocent. The greed documentation does not tell users to check the remote file names. Proof of concept: On an x86 computer running FreeBSD 4.10, as root, type cd /usr/ports/ftp/greed make install to download and compile the greed program, version 0.81p (latest ports version). Then, as any user, save the file 68-1.grx attached to this message, and type greed -T -G68-1.grx -D0 with the unauthorized result that a file matching EXPLOIT* is created in the current directory. (I tested this with a 613-byte environment, as reported by printenv | wc -c; beware that 68-1.grx is sensitive to the environment size.) 68-2.grx is similar, but uses a different bug, and has the unauthorized result of removing a file named x in the current directory. Here are the bugs. First, in main.c, DownloadLoop() uses strcat() to copy an input filename to the end of a 128-byte COMMAND array. Second, DownloadLoop() passes the input filename to system() without checking for special characters such as semicolons. ---D. J. Bernstein, Associate Professor, Department of Mathematics, Statistics, and Computer Science, University of Illinois at Chicago [ Part 2, Text/PLAIN (charset: unknown-8bit) 4 lines. ] [ Unable to print this part. ] [ Part 3, Text/PLAIN 5 lines. ] [ Unable to print this part. ]