Karmic, Lucid, Maverick: SRU: CVE-2010-3865

Stefan Bader stefan.bader at canonical.com
Fri Jan 28 15:12:24 UTC 2011


On 01/28/2011 04:01 PM, Tim Gardner wrote:
> On 01/28/2011 07:36 AM, Stefan Bader wrote:
>> Code has changed reasonable since Maverick but same patch applies to
>> all older affected releases.
>>
>>  From 2a8309b4f615072025743fae22147be5aa8e86cd Mon Sep 17 00:00:00 2001
>> From: Linus Torvalds<torvalds at linux-foundation.org>
>> Date: Thu, 28 Oct 2010 15:40:55 +0000
>> Subject: [PATCH] net: fix rds_iovec page count overflow
>>
>> BugLink: http://bugs.launchpad.net/bugs/709153
>> CVE-2010-3865
>>
>> As reported by Thomas Pollet, the rdma page counting can overflow.  We
>> get the rdma sizes in 64-bit unsigned entities, but then limit it to
>> UINT_MAX bytes and shift them down to pages (so with a possible "+1" for
>> an unaligned address).
>>
>> So each individual page count fits comfortably in an 'unsigned int' (not
>> even close to overflowing into signed), but as they are added up, they
>> might end up resulting in a signed return value. Which would be wrong.
>>
>> Catch the case of tot_pages turning negative, and return the appropriate
>> error code.
>>
>> Reported-by: Thomas Pollet<thomas.pollet at gmail.com>
>> Signed-off-by: Linus Torvalds<torvalds at linux-foundation.org>
>> Signed-off-by: Andy Grover<andy.grover at oracle.com>
>> Signed-off-by: David S. Miller<davem at davemloft.net>
>> (backported from commit 1b1f693d7ad6d193862dcb1118540a030c5e761f upstream)
>> Signed-off-by: Stefan Bader<stefan.bader at canonical.com>
>> ---
>>   net/rds/rdma.c |   10 ++++++++++
>>   1 files changed, 10 insertions(+), 0 deletions(-)
>>
>> diff --git a/net/rds/rdma.c b/net/rds/rdma.c
>> index 3998967..0a403a7 100644
>> --- a/net/rds/rdma.c
>> +++ b/net/rds/rdma.c
>> @@ -500,6 +500,16 @@ static struct rds_rdma_op *rds_rdma_prepare(struct
>> rds_sock *rs,
>>
>>           max_pages = max(nr, max_pages);
>>           nr_pages += nr;
>> +
>> +        /*
>> +         * nr for one entry in limited to (UINT_MAX>>PAGE_SHIFT)+1
>> +         * so nr_pages cannot overflow without first going negative.
>> +         * If nr cannot overflow then max_pages should be ok.
>> +         */
>> +        if (nr_pages<  0) {
>> +            ret = -EINVAL;
>> +            goto out;
>> +        }
>>       }
>>
>>       pages = kcalloc(max_pages, sizeof(struct page *), GFP_KERNEL);
> 
> I'm kind of uncomfortable comparing an 'unsigned int' against 0. IIRC the
> results are somewhat compiler dependent. Wouldn't it be clearer if it was 'if
> (nr_pages >= INT_MAX)' ?
> 
> rtg

Likely better. Just made it >INT_MAX (though that should not make that much
difference).

-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-net-fix-rds_iovec-page-count-overflow.patch
Type: text/x-diff
Size: 1929 bytes
Desc: not available
URL: <https://lists.ubuntu.com/archives/kernel-team/attachments/20110128/eadc522b/attachment.patch>


More information about the kernel-team mailing list