Hrvoje Niksic <[EMAIL PROTECTED]> writes:

> A fix that applies to 1.9.1 follows in a separate mail.
> Distributors of Wget will probably want to make sure to include the
> appropriate patch.

Here is that fix.

2005-05-07  Hrvoje Niksic  <[EMAIL PROTECTED]>

        * ftp-basic.c (ftp_request): Prevent newlines in VALUE causing
        inadvertent sending of multiple FTP commands.

--- wget-1.9.1.pristine/src/ftp-basic.c 2003-11-08 20:17:55.000000000 +0100
+++ wget-1.9.1/src/ftp-basic.c  2005-05-07 03:08:02.306330903 +0200
@@ -116,9 +116,30 @@
 static char *
 ftp_request (const char *command, const char *value)
 {
-  char *res = (char *)xmalloc (strlen (command)
-                               + (value ? (1 + strlen (value)) : 0)
-                               + 2 + 1);
+  char *res;
+
+  /* Check for newlines in VALUE (possibly injected by the %0A URL
+     escape) making the callers inadvertently send multiple FTP
+     commands at once.  Without this check an attacker could
+     intentionally redirect to ftp://server/fakedir%0Acommand.../ and
+     execute arbitrary FTP command on a remote FTP server.  */
+  if (value && strpbrk (value, "\r\n"))
+    {
+      /* Copy VALUE to the stack and modify CR/LF to space. */
+      char *defanged, *p;
+      STRDUP_ALLOCA (defanged, value);
+      for (p = defanged; *p; p++)
+       if (*p == '\r' || *p == '\n')
+         *p = ' ';
+      DEBUGP (("\nDetected newlines in %s \"%s\"; changing to %s \"%s\"\n",
+              command, value, command, defanged));
+      /* Make VALUE point to the defanged copy of the string. */
+      value = defanged;
+    }
+
+  res = (char *)xmalloc (strlen (command)
+                        + (value ? (1 + strlen (value)) : 0)
+                        + 2 + 1);
   sprintf (res, "%s%s%s\r\n", command, value ? " " : "", value ? value : "");
   if (opt.server_response)
     {

Reply via email to