[curl/f17] fix heap-based buffer overflow in curl_easy_unescape() (CVE-2013-2174)

Kamil Dudka kdudka at fedoraproject.org
Sat Jun 22 21:16:17 UTC 2013


commit 70c740ceefedb82d008f584106b6cd7b2a6b75ce
Author: Kamil Dudka <kdudka at redhat.com>
Date:   Sat Jun 22 23:05:15 2013 +0200

    fix heap-based buffer overflow in curl_easy_unescape() (CVE-2013-2174)

 0012-curl-7.24.0-192c4f78.patch |   43 +++++++++++++++++++++++++++++++++++++++
 curl.spec                       |    9 +++++++-
 2 files changed, 51 insertions(+), 1 deletions(-)
---
diff --git a/0012-curl-7.24.0-192c4f78.patch b/0012-curl-7.24.0-192c4f78.patch
new file mode 100644
index 0000000..299f386
--- /dev/null
+++ b/0012-curl-7.24.0-192c4f78.patch
@@ -0,0 +1,43 @@
+From 25089c2c69028f0549facf93f7bdbf7344277f09 Mon Sep 17 00:00:00 2001
+From: Daniel Stenberg <daniel at haxx.se>
+Date: Sun, 19 May 2013 23:24:29 +0200
+Subject: [PATCH] Curl_urldecode: no peeking beyond end of input buffer
+
+Security problem: CVE-2013-2174
+
+If a program would give a string like "%FF" to curl_easy_unescape() but
+ask for it to decode only the first byte, it would still parse and
+decode the full hex sequence. The function then not only read beyond the
+allowed buffer but it would also deduct the *unsigned* counter variable
+for how many more bytes there's left to read in the buffer by two,
+making the counter wrap. Continuing this, the function would go on
+reading beyond the buffer and soon writing beyond the allocated target
+buffer...
+
+Bug: http://curl.haxx.se/docs/adv_20130622.html
+Reported-by: Timo Sirainen
+
+[upstream commit 192c4f788d48f82c03e9cef40013f34370e90737]
+
+Signed-off-by: Kamil Dudka <kdudka at redhat.com>
+---
+ lib/escape.c |    3 ++-
+ 1 files changed, 2 insertions(+), 1 deletions(-)
+
+diff --git a/lib/escape.c b/lib/escape.c
+index 6a26cf8..a567edb 100644
+--- a/lib/escape.c
++++ b/lib/escape.c
+@@ -159,7 +159,8 @@ CURLcode Curl_urldecode(struct SessionHandle *data,
+ 
+   while(--alloc > 0) {
+     in = *string;
+-    if(('%' == in) && ISXDIGIT(string[1]) && ISXDIGIT(string[2])) {
++    if(('%' == in) && (alloc > 2) &&
++       ISXDIGIT(string[1]) && ISXDIGIT(string[2])) {
+       /* this is two hexadecimal digits following a '%' */
+       char hexstr[3];
+       char *ptr;
+-- 
+1.7.1
+
diff --git a/curl.spec b/curl.spec
index 6922763..3fbd87f 100644
--- a/curl.spec
+++ b/curl.spec
@@ -1,7 +1,7 @@
 Summary: A utility for getting files from remote servers (FTP, HTTP, and others)
 Name: curl
 Version: 7.24.0
-Release: 9%{?dist}
+Release: 10%{?dist}
 License: MIT
 Group: Applications/Internet
 Source: http://curl.haxx.se/download/%{name}-%{version}.tar.lzma
@@ -41,6 +41,9 @@ Patch10: 0010-curl-7.24.0-b37b5233.patch
 # switch SSL socket into non-blocking mode after handshake (#960765)
 Patch11: 0011-curl-7.24.0-9d0af301.patch
 
+# fix heap-based buffer overflow in curl_easy_unescape() (CVE-2013-2174)
+Patch12: 0012-curl-7.24.0-192c4f78.patch
+
 # patch making libcurl multilib ready
 Patch101: 0101-curl-7.21.1-multilib.patch
 
@@ -151,6 +154,7 @@ done
 %patch9 -p1
 %patch10 -p1
 %patch11 -p1
+%patch12 -p1
 
 # Fedora patches
 %patch101 -p1
@@ -264,6 +268,9 @@ rm -rf $RPM_BUILD_ROOT
 %{_datadir}/aclocal/libcurl.m4
 
 %changelog
+* Sat Jun 22 2013 Kamil Dudka <kdudka at redhat.com> 7.24.0-10
+- fix heap-based buffer overflow in curl_easy_unescape() (CVE-2013-2174)
+
 * Thu May 09 2013 Kamil Dudka <kdudka at redhat.com> 7.24.0-9
 - switch SSL socket into non-blocking mode after handshake (#960765)
 


More information about the scm-commits mailing list