~ubuntu-branches/ubuntu/lucid/wget/lucid-updates

« back to all changes in this revision

Viewing changes to debian/patches/CVE-2014-4877.dpatch

  • Committer: Package Import Robot
  • Author(s): Marc Deslauriers
  • Date: 2014-10-30 10:10:03 UTC
  • Revision ID: package-import@ubuntu.com-20141030101003-j9dk3c5g3c8b9q9m
Tags: 1.12-1.1ubuntu2.2
* SECURITY UPDATE: remote code execution via absolute path traversal
  vulnerability in FTP
  - debian/patches/CVE-2014-4877.dpatch: don't create local symlinks in
    src/init.c, check for duplicate file nodes in src/ftp.c, updated
    documentation in doc/wget.texi.
  - CVE-2014-4877

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#! /bin/sh /usr/share/dpatch/dpatch-run
 
2
# Description: fix remote code execution via absolute path traversal
 
3
#  vulnerability in FTP
 
4
# Origin: upstream, http://git.savannah.gnu.org/cgit/wget.git/commit/?id=18b0979357ed7dc4e11d4f2b1d7e0f5932d82aa7
 
5
# Origin: upstream, http://git.savannah.gnu.org/cgit/wget.git/commit/?id=69c45cba4382fcaabe3d86876bd5463dc34f442c
 
6
# Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=766981
 
7
 
 
8
@DPATCH@
 
9
diff -urNad '--exclude=CVS' '--exclude=.svn' '--exclude=.git' '--exclude=.arch' '--exclude=.hg' '--exclude=_darcs' '--exclude=.bzr' wget-1.12~/doc/wget.texi wget-1.12/doc/wget.texi
 
10
--- wget-1.12~/doc/wget.texi    2014-10-30 10:09:38.000000000 -0400
 
11
+++ wget-1.12/doc/wget.texi     2014-10-30 10:09:54.451864502 -0400
 
12
@@ -1720,17 +1720,18 @@
 
13
 
 
14
 @cindex symbolic links, retrieving
 
15
 @item --retr-symlinks
 
16
-Usually, when retrieving @sc{ftp} directories recursively and a symbolic
 
17
-link is encountered, the linked-to file is not downloaded.  Instead, a
 
18
-matching symbolic link is created on the local filesystem.  The
 
19
-pointed-to file will not be downloaded unless this recursive retrieval
 
20
-would have encountered it separately and downloaded it anyway.
 
21
+By default, when retrieving @sc{ftp} directories recursively and a symbolic link
 
22
+is encountered, the symbolic link is traversed and the pointed-to files are
 
23
+retrieved.  Currently, Wget does not traverse symbolic links to directories to
 
24
+download them recursively, though this feature may be added in the future.
 
25
 
 
26
-When @samp{--retr-symlinks} is specified, however, symbolic links are
 
27
-traversed and the pointed-to files are retrieved.  At this time, this
 
28
-option does not cause Wget to traverse symlinks to directories and
 
29
-recurse through them, but in the future it should be enhanced to do
 
30
-this.
 
31
+When @samp{--retr-symlinks=no} is specified, the linked-to file is not
 
32
+downloaded.  Instead, a matching symbolic link is created on the local
 
33
+filesystem.  The pointed-to file will not be retrieved unless this recursive
 
34
+retrieval would have encountered it separately and downloaded it anyway.  This
 
35
+option poses a security risk where a malicious FTP Server may cause Wget to
 
36
+write to files outside of the intended directories through a specially crafted
 
37
+@sc{.listing} file.
 
38
 
 
39
 Note that when retrieving a file (not a directory) because it was
 
40
 specified on the command-line, rather than because it was recursed to,
 
41
diff -urNad '--exclude=CVS' '--exclude=.svn' '--exclude=.git' '--exclude=.arch' '--exclude=.hg' '--exclude=_darcs' '--exclude=.bzr' wget-1.12~/src/ftp.c wget-1.12/src/ftp.c
 
42
--- wget-1.12~/src/ftp.c        2009-09-21 22:59:21.000000000 -0400
 
43
+++ wget-1.12/src/ftp.c 2014-10-30 10:09:54.451864502 -0400
 
44
@@ -1966,6 +1966,29 @@
 
45
   return false;
 
46
 }
 
47
 
 
48
+/* Test if the file node is invalid. This can occur due to malformed or
 
49
+ * maliciously crafted listing files being returned by the server.
 
50
+ *
 
51
+ * Currently, this function only tests if there are multiple entries in the
 
52
+ * listing file by the same name. However this function can be expanded as more
 
53
+ * such illegal listing formats are discovered. */
 
54
+static bool
 
55
+is_invalid_entry (struct fileinfo *f)
 
56
+{
 
57
+  struct fileinfo *cur;
 
58
+  cur = f;
 
59
+  char *f_name = f->name;
 
60
+  /* If the node we're currently checking has a duplicate later, we eliminate
 
61
+   * the current node and leave the next one intact. */
 
62
+  while (cur->next)
 
63
+    {
 
64
+      cur = cur->next;
 
65
+      if (strcmp(f_name, cur->name) == 0)
 
66
+          return true;
 
67
+    }
 
68
+  return false;
 
69
+}
 
70
+
 
71
 /* A near-top-level function to retrieve the files in a directory.
 
72
    The function calls ftp_get_listing, to get a linked list of files.
 
73
    Then it weeds out the file names that do not match the pattern.
 
74
@@ -2003,11 +2026,11 @@
 
75
             f = f->next;
 
76
         }
 
77
     }
 
78
-  /* Remove all files with possible harmful names */
 
79
+  /* Remove all files with possible harmful names or invalid entries. */
 
80
   f = start;
 
81
   while (f)
 
82
     {
 
83
-      if (has_insecure_name_p (f->name))
 
84
+      if (has_insecure_name_p (f->name) || is_invalid_entry (f))
 
85
         {
 
86
           logprintf (LOG_VERBOSE, _("Rejecting %s.\n"),
 
87
                      quote (f->name));
 
88
diff -urNad '--exclude=CVS' '--exclude=.svn' '--exclude=.git' '--exclude=.arch' '--exclude=.hg' '--exclude=_darcs' '--exclude=.bzr' wget-1.12~/src/init.c wget-1.12/src/init.c
 
89
--- wget-1.12~/src/init.c       2014-10-30 10:09:38.000000000 -0400
 
90
+++ wget-1.12/src/init.c        2014-10-30 10:09:54.451864502 -0400
 
91
@@ -319,6 +319,22 @@
 
92
 
 
93
   opt.dns_cache = true;
 
94
   opt.ftp_pasv = true;
 
95
+  /* 2014-09-07  Darshit Shah  <darnir@gmail.com>
 
96
+   * opt.retr_symlinks is set to true by default. Creating symbolic links on the
 
97
+   * local filesystem pose a security threat by malicious FTP Servers that
 
98
+   * server a specially crafted .listing file akin to this:
 
99
+   *
 
100
+   * lrwxrwxrwx   1 root     root           33 Dec 25  2012 JoCxl6d8rFU -> /
 
101
+   * drwxrwxr-x  15 1024     106          4096 Aug 28 02:02 JoCxl6d8rFU
 
102
+   *
 
103
+   * A .listing file in this fashion makes Wget susceptiple to a symlink attack
 
104
+   * wherein the attacker is able to create arbitrary files, directories and
 
105
+   * symbolic links on the target system and even set permissions.
 
106
+   *
 
107
+   * Hence, by default Wget attempts to retrieve the pointed-to files and does
 
108
+   * not create the symbolic links locally.
 
109
+   */
 
110
+  opt.retr_symlinks = true;
 
111
 
 
112
 #ifdef HAVE_SSL
 
113
   opt.check_cert = true;