[kernel] r9718 - in dists/sarge-security/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian: . patches patches/series
Dann Frazier
dannf at alioth.debian.org
Mon Nov 12 23:30:31 UTC 2007
Author: dannf
Date: Mon Nov 12 23:30:31 2007
New Revision: 9718
Log:
* 249_openpromfs-signedness-bug.diff
250_openpromfs-checks-1.diff
251_openpromfs-checks-2.diff
252_openpromfs-checks-3.diff
[SECURITY] Fix a number of data checks in openprom code
See CVE-2004-2731
Added:
dists/sarge-security/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/patches/249_openpromfs-signedness-bug.diff
dists/sarge-security/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/patches/250_openpromfs-checks-1.diff
dists/sarge-security/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/patches/251_openpromfs-checks-2.diff
dists/sarge-security/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/patches/252_openpromfs-checks-3.diff
Modified:
dists/sarge-security/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/changelog
dists/sarge-security/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/patches/series/2.4.27-10sarge6
Modified: dists/sarge-security/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/changelog
==============================================================================
--- dists/sarge-security/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/changelog (original)
+++ dists/sarge-security/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/changelog Mon Nov 12 23:30:31 2007
@@ -35,8 +35,14 @@
[SECURITY] Fix a bug in the random driver reseeding code that reduces
entropy by reseeding a smaller buffer size than expected
See CVE-2007-4311
-
- -- dann frazier <dannf at debian.org> Wed, 07 Nov 2007 23:13:28 -0700
+ * 249_openpromfs-signedness-bug.diff
+ 250_openpromfs-checks-1.diff
+ 251_openpromfs-checks-2.diff
+ 252_openpromfs-checks-3.diff
+ [SECURITY] Fix a number of data checks in openprom code
+ See CVE-2004-2731
+
+ -- dann frazier <dannf at debian.org> Mon, 12 Nov 2007 16:29:16 -0700
kernel-source-2.4.27 (2.4.27-10sarge5) stable-security; urgency=high
Added: dists/sarge-security/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/patches/249_openpromfs-signedness-bug.diff
==============================================================================
--- (empty file)
+++ dists/sarge-security/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/patches/249_openpromfs-signedness-bug.diff Mon Nov 12 23:30:31 2007
@@ -0,0 +1,37 @@
+From: dann frazier <dannf at dannf.org>
+Date: Tue, 6 Nov 2007 22:36:46 +0000 (-0700)
+Subject: [PATCH 1/4] [OpenPROM]: Fix signedness bug in openprom char driver
+X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fwtarreau%2Flinux-2.4.git;a=commitdiff_plain;h=996bad4803a2ebfebe7b27a431fbcae591f7d199
+
+[PATCH 1/4] [OpenPROM]: Fix signedness bug in openprom char driver
+
+CVE-2004-2731 describes two issues in the openprom driver.
+The first issue, an integer overflow in copyin_string(), appears to be
+fixed in 2.4. The second issue, an overflow in copyin(), is still present.
+
+A description of both issues is here:
+ http://www.securityfocus.com/archive/1/367575
+
+The user-provided 'bufsize' is checked for being too large, but is not checked
+for being negative. This patch avoids this situation by making bufsize
+unsigned.
+
+This change has been in 2.6 for a number of years now:
+ http://linux.bkbits.net:8080/linux-2.6/?PAGE=patch&REV=3d686423le0SEotURGfYEbgMpPGKqw
+
+Signed-off-by: dann frazier <dannf at hp.com>
+---
+
+diff --git a/drivers/sbus/char/openprom.c b/drivers/sbus/char/openprom.c
+index 7f74f9f..33e4ec7 100644
+--- a/drivers/sbus/char/openprom.c
++++ b/drivers/sbus/char/openprom.c
+@@ -68,7 +68,7 @@ static int options_node = 0;
+ */
+ static int copyin(struct openpromio *info, struct openpromio **opp_p)
+ {
+- int bufsize;
++ unsigned int bufsize;
+
+ if (!info || !opp_p)
+ return -EFAULT;
Added: dists/sarge-security/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/patches/250_openpromfs-checks-1.diff
==============================================================================
--- (empty file)
+++ dists/sarge-security/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/patches/250_openpromfs-checks-1.diff Mon Nov 12 23:30:31 2007
@@ -0,0 +1,240 @@
+From: dann frazier <dannf at dannf.org>
+Date: Tue, 6 Nov 2007 22:37:30 +0000 (-0700)
+Subject: [PATCH 2/4] [OpenPROM]: Fix user-access checking bugs in openpromfs
+X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fwtarreau%2Flinux-2.4.git;a=commitdiff_plain;h=a545dd4118eba7242bb390a76b2a1bb3dce0430e
+
+[PATCH 2/4] [OpenPROM]: Fix user-access checking bugs in openpromfs
+
+This patch backports a number of user-access checking fixes, originally
+submitted to 2.5 by Dave Miller:
+ http://linux.bkbits.net:8080/linux-2.6/?PAGE=cset&REV=3d686423le0SEotURGfYEbgMpPGKqw
+
+Signed-off-by: dann frazier <dannf at hp.com>
+---
+
+diff --git a/fs/openpromfs/inode.c b/fs/openpromfs/inode.c
+index 8822345..8aca488 100644
+--- a/fs/openpromfs/inode.c
++++ b/fs/openpromfs/inode.c
+@@ -79,7 +79,8 @@ static ssize_t nodenum_read(struct file *file, char *buf,
+ return 0;
+ if (count > 9 - pos)
+ count = 9 - pos;
+- copy_to_user(buf, buffer + pos, count);
++ if (copy_to_user(buf, buffer + pos, count))
++ return -EFAULT;
+ *ppos = pos + count;
+ return count;
+ }
+@@ -187,7 +188,8 @@ static ssize_t property_read(struct file *filp, char *buf,
+ if (count > i - k) count = i - k;
+ if (op->flag & OPP_STRING) {
+ if (!k) {
+- __put_user('\'', buf);
++ if (put_user('\'', buf))
++ return -EFAULT;
+ k++;
+ count--;
+ }
+@@ -198,17 +200,21 @@ static ssize_t property_read(struct file *filp, char *buf,
+ j = count;
+
+ if (j >= 0) {
+- copy_to_user(buf + k - pos,
+- op->value + k - 1, j);
++ if (copy_to_user(buf + k - pos,
++ op->value + k - 1, j))
++ return -EFAULT;
+ count -= j;
+ k += j;
+ }
+
+- if (count)
+- __put_user('\'', &buf [k++ - pos]);
+- if (count > 1)
+- __put_user('\n', &buf [k++ - pos]);
+-
++ if (count) {
++ if (put_user('\'', &buf [k++ - pos]))
++ return -EFAULT;
++ }
++ if (count > 1) {
++ if (put_user('\n', &buf [k++ - pos]))
++ return -EFAULT;
++ }
+ } else if (op->flag & OPP_STRINGLIST) {
+ char *tmp;
+
+@@ -228,7 +234,8 @@ static ssize_t property_read(struct file *filp, char *buf,
+ }
+ strcpy(s, "'\n");
+
+- copy_to_user(buf, tmp + k, count);
++ if (copy_to_user(buf, tmp + k, count))
++ return -EFAULT;
+
+ kfree(tmp);
+ k += count;
+@@ -246,27 +253,34 @@ static ssize_t property_read(struct file *filp, char *buf,
+
+ if (first == last) {
+ sprintf (buffer, "%08x.", *first);
+- copy_to_user (buf, buffer + first_off, last_cnt - first_off);
++ if (copy_to_user(buf, buffer + first_off,
++ last_cnt - first_off))
++ return -EFAULT;
+ buf += last_cnt - first_off;
+ } else {
+ for (q = first; q <= last; q++) {
+ sprintf (buffer, "%08x.", *q);
+ if (q == first) {
+- copy_to_user (buf, buffer + first_off,
+- 9 - first_off);
++ if (copy_to_user(buf, buffer + first_off,
++ 9 - first_off))
++ return -EFAULT;
+ buf += 9 - first_off;
+ } else if (q == last) {
+- copy_to_user (buf, buffer, last_cnt);
++ if (copy_to_user(buf, buffer, last_cnt))
++ return -EFAULT;
+ buf += last_cnt;
+ } else {
+- copy_to_user (buf, buffer, 9);
++ if (copy_to_user(buf, buffer, 9))
++ return -EFAULT;
+ buf += 9;
+ }
+ }
+ }
+
+- if (last == (u32 *)(op->value + op->len - 4) && last_cnt == 9)
+- __put_user('\n', (buf - 1));
++ if (last == (u32 *)(op->value + op->len - 4) && last_cnt == 9) {
++ if (put_user('\n', (buf - 1)))
++ return -EFAULT;
++ }
+
+ k += count;
+
+@@ -275,24 +289,29 @@ static ssize_t property_read(struct file *filp, char *buf,
+
+ if ((k < i - 1) && (k & 1)) {
+ sprintf (buffer, "%02x", *(op->value + (k >> 1)));
+- __put_user(buffer[1], &buf[k++ - pos]);
++ if (put_user(buffer[1], &buf[k++ - pos]))
++ return -EFAULT;
+ count--;
+ }
+
+ for (; (count > 1) && (k < i - 1); k += 2) {
+ sprintf (buffer, "%02x", *(op->value + (k >> 1)));
+- copy_to_user (buf + k - pos, buffer, 2);
++ if (copy_to_user (buf + k - pos, buffer, 2))
++ return -EFAULT;
+ count -= 2;
+ }
+
+ if (count && (k < i - 1)) {
+ sprintf (buffer, "%02x", *(op->value + (k >> 1)));
+- __put_user(buffer[0], &buf[k++ - pos]);
++ if (put_user(buffer[0], &buf[k++ - pos]))
++ return -EFAULT;
+ count--;
+ }
+
+- if (count)
+- __put_user('\n', &buf [k++ - pos]);
++ if (count) {
++ if (put_user('\n', &buf [k++ - pos]))
++ return -EFAULT;
++ }
+ }
+ count = k - pos;
+ *ppos = k;
+@@ -330,7 +349,8 @@ static ssize_t property_write(struct file *filp, const char *buf,
+ if (j == 9) j = 0;
+ if (!j) {
+ char ctmp;
+- __get_user(ctmp, &buf[i]);
++ if (get_user(ctmp, &buf[i]))
++ return -EFAULT;
+ if (ctmp != '.') {
+ if (ctmp != '\n') {
+ if (op->flag & OPP_BINARY)
+@@ -345,7 +365,8 @@ static ssize_t property_write(struct file *filp, const char *buf,
+ }
+ } else {
+ char ctmp;
+- __get_user(ctmp, &buf[i]);
++ if (get_user(ctmp, &buf[i]))
++ return -EFAULT;
+ if (ctmp < '0' ||
+ (ctmp > '9' && ctmp < 'A') ||
+ (ctmp > 'F' && ctmp < 'a') ||
+@@ -383,8 +404,10 @@ static ssize_t property_write(struct file *filp, const char *buf,
+ last_cnt = (k + count) % 9;
+ if (first + 1 == last) {
+ memset (tmp, '0', 8);
+- copy_from_user (tmp + first_off, buf,
+- (count + first_off > 8) ? 8 - first_off : count);
++ if (copy_from_user(tmp + first_off, buf,
++ (count + first_off > 8) ?
++ 8 - first_off : count))
++ return -EFAULT;
+ mask = 0xffffffff;
+ mask2 = 0xffffffff;
+ for (j = 0; j < first_off; j++)
+@@ -403,8 +426,10 @@ static ssize_t property_write(struct file *filp, const char *buf,
+ if (q == first) {
+ if (first_off < 8) {
+ memset (tmp, '0', 8);
+- copy_from_user (tmp + first_off, buf,
+- 8 - first_off);
++ if (copy_from_user(tmp + first_off,
++ buf,
++ 8 - first_off))
++ return -EFAULT;
+ mask = 0xffffffff;
+ for (j = 0; j < first_off; j++)
+ mask >>= 1;
+@@ -415,7 +440,8 @@ static ssize_t property_write(struct file *filp, const char *buf,
+ } else if ((q == last - 1) && last_cnt
+ && (last_cnt < 8)) {
+ memset (tmp, '0', 8);
+- copy_from_user (tmp, buf, last_cnt);
++ if (copy_from_user(tmp, buf, last_cnt))
++ return -EFAULT;
+ mask = 0xffffffff;
+ for (j = 0; j < 8 - last_cnt; j++)
+ mask <<= 1;
+@@ -425,7 +451,8 @@ static ssize_t property_write(struct file *filp, const char *buf,
+ } else {
+ char tchars[17]; /* XXX yuck... */
+
+- copy_from_user(tchars, buf, 16);
++ if (copy_from_user(tchars, buf, 16))
++ return -EFAULT;
+ *q = simple_strtoul (tchars, 0, 16);
+ buf += 9;
+ }
+@@ -449,7 +476,8 @@ write_try_string:
+ */
+ if (k > 0)
+ return -EINVAL;
+- __get_user(ctmp, buf);
++ if (get_user(ctmp, buf))
++ return -EFAULT;
+ if (ctmp == '\'') {
+ op->flag |= OPP_QUOTED;
+ buf++;
+@@ -482,7 +510,8 @@ write_try_string:
+ kfree (b);
+ }
+ p = op->value + pos - ((op->flag & OPP_QUOTED) ? 1 : 0);
+- copy_from_user (p, buf, count);
++ if (copy_from_user (p, buf, count))
++ return -EFAULT;
+ op->flag |= OPP_DIRTY;
+ for (i = 0; i < count; i++, p++)
+ if (*p == '\n') {
Added: dists/sarge-security/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/patches/251_openpromfs-checks-2.diff
==============================================================================
--- (empty file)
+++ dists/sarge-security/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/patches/251_openpromfs-checks-2.diff Mon Nov 12 23:30:31 2007
@@ -0,0 +1,51 @@
+From: dann frazier <dannf at dannf.org>
+Date: Tue, 6 Nov 2007 22:37:56 +0000 (-0700)
+Subject: [PATCH 3/4] [OpenPROM] Prevent overflow of sprintf buffer
+X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fwtarreau%2Flinux-2.4.git;a=commitdiff_plain;h=6ab2cfa4f0a04c11932af701b5437879dd14d8bb
+
+[PATCH 3/4] [OpenPROM] Prevent overflow of sprintf buffer
+
+This patch fixes a few potential overflows, originally submitted to 2.5 by
+Dave Miller:
+ http://linux.bkbits.net:8080/linux-2.6/?PAGE=cset&REV=3d69d753xoJv6rAeuQzdAcJK6Njncg
+ http://linux.bkbits.net:8080/linux-2.6/?PAGE=cset&REV=3d6aabcc3jBCcQB6wlZ7s3G9WGPYsg
+
+Signed-off-by: dann frazier <dannf at hp.com>
+---
+
+diff --git a/fs/openpromfs/inode.c b/fs/openpromfs/inode.c
+index 8aca488..5d2712f 100644
+--- a/fs/openpromfs/inode.c
++++ b/fs/openpromfs/inode.c
+@@ -285,24 +285,27 @@ static ssize_t property_read(struct file *filp, char *buf,
+ k += count;
+
+ } else if (op->flag & OPP_HEXSTRING) {
+- char buffer[2];
++ char buffer[3];
+
+ if ((k < i - 1) && (k & 1)) {
+- sprintf (buffer, "%02x", *(op->value + (k >> 1)));
++ sprintf (buffer, "%02x",
++ (unsigned char) *(op->value + (k >> 1)) & 0xff);
+ if (put_user(buffer[1], &buf[k++ - pos]))
+ return -EFAULT;
+ count--;
+ }
+
+ for (; (count > 1) && (k < i - 1); k += 2) {
+- sprintf (buffer, "%02x", *(op->value + (k >> 1)));
++ sprintf (buffer, "%02x",
++ (unsigned char) *(op->value + (k >> 1)) & 0xff);
+ if (copy_to_user (buf + k - pos, buffer, 2))
+ return -EFAULT;
+ count -= 2;
+ }
+
+ if (count && (k < i - 1)) {
+- sprintf (buffer, "%02x", *(op->value + (k >> 1)));
++ sprintf (buffer, "%02x",
++ (unsigned char) *(op->value + (k >> 1)) & 0xff);
+ if (put_user(buffer[0], &buf[k++ - pos]))
+ return -EFAULT;
+ count--;
Added: dists/sarge-security/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/patches/252_openpromfs-checks-3.diff
==============================================================================
--- (empty file)
+++ dists/sarge-security/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/patches/252_openpromfs-checks-3.diff Mon Nov 12 23:30:31 2007
@@ -0,0 +1,37 @@
+From: dann frazier <dannf at dannf.org>
+Date: Tue, 6 Nov 2007 22:38:31 +0000 (-0700)
+Subject: [PATCH 4/4] [OpenPROM] Prevent unsigned roll-overs in
+X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fwtarreau%2Flinux-2.4.git;a=commitdiff_plain;h=090a4d5713b462e039e2896ac8092769c42ea742
+
+[PATCH 4/4] [OpenPROM] Prevent unsigned roll-overs in
+property_read/property_write
+
+These overflow fixes were originally submitted to 2.5 by Dave Miller:
+ http://linux.bkbits.net:8080/linux-2.6/?PAGE=cset&REV=3d69d83b4f8vl6uetYp1vi77lhBJOQ
+ http://linux.bkbits.net:8080/linux-2.6/?PAGE=cset&REV=3d6aabcc3jBCcQB6wlZ7s3G9WGPYsg
+
+Signed-off-by: dann frazier <dannf at hp.com>
+---
+
+diff --git a/fs/openpromfs/inode.c b/fs/openpromfs/inode.c
+index 5d2712f..1963e66 100644
+--- a/fs/openpromfs/inode.c
++++ b/fs/openpromfs/inode.c
+@@ -97,7 +97,7 @@ static ssize_t property_read(struct file *filp, char *buf,
+ openprom_property *op;
+ char buffer[64];
+
+- if (pos < 0 || pos >= 0xffffff)
++ if (pos < 0 || pos >= 0xffffff || count >= 0xffffff)
+ return -EINVAL;
+ if (!filp->private_data) {
+ node = nodes[(u16)((long)inode->u.generic_ip)].node;
+@@ -331,7 +331,7 @@ static ssize_t property_write(struct file *filp, const char *buf,
+ void *b;
+ openprom_property *op;
+
+- if (pos < 0 || pos >= 0xffffff)
++ if (pos < 0 || pos >= 0xffffff || count >= 0xffffff)
+ return -EINVAL;
+ if (!filp->private_data) {
+ i = property_read (filp, NULL, 0, 0);
Modified: dists/sarge-security/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/patches/series/2.4.27-10sarge6
==============================================================================
--- dists/sarge-security/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/patches/series/2.4.27-10sarge6 (original)
+++ dists/sarge-security/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/patches/series/2.4.27-10sarge6 Mon Nov 12 23:30:31 2007
@@ -8,3 +8,7 @@
+ 246_dn_fib-out-of-bounds.diff
+ 247_reset-pdeathsig-on-suid.diff
+ 248_random-reseed-sizeof-fix.diff
++ 249_openpromfs-signedness-bug.diff
++ 250_openpromfs-checks-1.diff
++ 251_openpromfs-checks-2.diff
++ 252_openpromfs-checks-3.diff
More information about the Kernel-svn-changes
mailing list