Hi Roberto,

Here's the diff I used in the 1.2.5-2.4 NMU.


Cheers,
Thijs
diff -u php-radius-1.2.5/radius-1.2.5/radius.c php-radius-1.2.5/radius-1.2.5/radius.c
--- php-radius-1.2.5/radius-1.2.5/radius.c
+++ php-radius-1.2.5/radius-1.2.5/radius.c
@@ -541,23 +541,24 @@
 /* {{{ proto string radius_get_vendor_attr(data) */
 PHP_FUNCTION(radius_get_vendor_attr)
 {
-	int res, vendor;
-	const void *data;
+	int vendor;
+	const void *data, *raw;
 	size_t len;
+	unsigned char type;
+	size_t data_len;
 
-	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &data, &len) == FAILURE) {
+	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &raw, &len) == FAILURE) {
 		return;
 	}
 
-	res = rad_get_vendor_attr(&vendor, &data, &len);
-	if (res == -1) {
+	if (rad_get_vendor_attr(&vendor, &type, &data, &data_len, raw, len) == -1) {
 		RETURN_FALSE;
 	} else {
 
 		array_init(return_value);
-		add_assoc_long(return_value, "attr", res);
+		add_assoc_long(return_value, "attr", type);
 		add_assoc_long(return_value, "vendor", vendor);
-		add_assoc_stringl(return_value, "data", (char *) data, len, 1);
+		add_assoc_stringl(return_value, "data", (char *) data, data_len, 1);
 		return;
 	}
 }
diff -u php-radius-1.2.5/debian/changelog php-radius-1.2.5/debian/changelog
--- php-radius-1.2.5/debian/changelog
+++ php-radius-1.2.5/debian/changelog
@@ -1,3 +1,11 @@
+php-radius (1.2.5-2.4) unstable; urgency=high
+
+  * Non-maintainer upload.
+  * Fix security issue in radius_get_vendor_attr()
+    (CVE-2013-2220, closes: #714362)
+
+ -- Thijs Kinkhorst <th...@debian.org>  Thu, 25 Jul 2013 14:28:53 +0200
+
 php-radius (1.2.5-2.3) unstable; urgency=high
 
   * Non-maintainer upload.
only in patch2:
unchanged:
--- php-radius-1.2.5.orig/radius-1.2.5/radlib.c
+++ php-radius-1.2.5/radius-1.2.5/radlib.c
@@ -898,15 +898,24 @@
 }
 
 int
-rad_get_vendor_attr(u_int32_t *vendor, const void **data, size_t *len)
+rad_get_vendor_attr(u_int32_t *vendor, unsigned char *type, const void **data, size_t *len, const void *raw, size_t raw_len)
 {
 	struct vendor_attribute *attr;
 
-	attr = (struct vendor_attribute *)*data;
+	if (raw_len < sizeof(struct vendor_attribute)) {
+		return -1;
+	}
+
+	attr = (struct vendor_attribute *) raw;
 	*vendor = ntohl(attr->vendor_value);
+	*type = attr->attrib_type;
 	*data = attr->attrib_data;
 	*len = attr->attrib_len - 2;
 
+	if ((attr->attrib_len + 4) > raw_len) {
+		return -1;
+	}
+
 	return (attr->attrib_type);
 }
 
only in patch2:
unchanged:
--- php-radius-1.2.5.orig/radius-1.2.5/radlib_vs.h
+++ php-radius-1.2.5/radius-1.2.5/radlib_vs.h
@@ -74,7 +74,7 @@
 
 struct rad_handle;
 
-int	rad_get_vendor_attr(u_int32_t *, const void **, size_t *);
+int	rad_get_vendor_attr(u_int32_t *, unsigned char *, const void **, size_t *, const void *, size_t);
 int	rad_put_vendor_addr(struct rad_handle *, int, int, struct in_addr);
 int	rad_put_vendor_attr(struct rad_handle *, int, int, const void *,
 	    size_t);

Reply via email to