All of lore.kernel.org
 help / color / mirror / Atom feed
From: Thiemo Nagel <thiemo.nagel@ph.tum.de>
To: Theodore Tso <tytso@mit.edu>
Cc: Ext4 Developers List <linux-ext4@vger.kernel.org>
Subject: Re: [PATCH] ext4: fix null pointer deref on mount
Date: Mon, 05 Jan 2009 21:50:13 +0100	[thread overview]
Message-ID: <49627285.8060407@ph.tum.de> (raw)
In-Reply-To: <20090105170259.GB8939@mit.edu>

Theodore Tso wrote:
> On Mon, Jan 05, 2009 at 02:19:55AM +0100, Thiemo Nagel wrote:
>> I came across a null pointer dereference when mounting an intentionally  
>> corrupted filesystem (cf. debug.dmesg).  In my opinion, the problem lies  
>> in ext4_fill_super(), where truncation may occur on setting the integer  
>> db_count, which results in too little memory being allocated for  
>> sbi->s_group_desc.  The attached patch (against 2.6.28) fixes this by  
>> changing the type of db_count to unsigned long.  I also took the  
>> opportunity to make the check against sign extension in calculation of  
>> db_count more strict, so that it now excludes cases in which db_count  
>> comes out as zero.
> 
> Usigned unsigned long is almost always wrong, because it's not a fixed
> size; it's 32 bits on x86_32, but 64 bits on x86_64.  In this
> particular case, db_count is always going to well under 32-bits for
> any legitimate filesystem. 

I have chosen unsigned long for the sole reason to avoid truncation in 
the assignment

db_count = (sbi->s_groups_count + EXT4_DESC_PER_BLOCK(sb) - 1) /
	   EXT4_DESC_PER_BLOCK(sb);

where the operands on the right side are of type unsigned long and 
ext4_group_t (which is typedef unsigned long), so I don't think to make 
db_count an unsigned long is hurting anything.

But maybe it's not desireable to allow filesystems which are mountable 
on x86_64 but not on x86_32?  Then a different solution would be to 
enforce s_groups_count < (1<<31).

But there is another caveat:  We also need to take care of the overflow 
in the argument to kmalloc(), and that further reduces the allowed range 
of s_groups_count for x86_32 (but not for x86_64):

sbi->s_group_desc = kmalloc(db_count * sizeof(struct buffer_head *),
			    GFP_KERNEL);

So, which approach do you think would be best?

> If it isn't we need to have better checks;
> it sounds like the checks we need are ones that do a better job
> checking s_blocks_per_group; am I right in assuming that
> s_blocks_per_group was something ridiculous and that is what caused
> the overflow?

No, it was a very large block count (but the small blocks per group 
helped, too):

block count 562949953423360, first data block 8257, blocks per group 512

BTW:  In case anybody likes to have a look at the corrupt filesystem:
It's available at 
http://www.e18.physik.tu-muenchen.de/~tnagel/misc/ext4.null_deref.image.bz2
The size of the download is 88k.

Kind regards,
Thiemo

  reply	other threads:[~2009-01-05 20:47 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-01-05  1:19 [PATCH] ext4: fix null pointer deref on mount Thiemo Nagel
2009-01-05 17:02 ` Theodore Tso
2009-01-05 20:50   ` Thiemo Nagel [this message]
2009-01-05 21:39     ` Theodore Tso
2009-01-05 22:50       ` Thiemo Nagel
2009-01-05 23:34         ` Theodore Tso
2009-01-05 23:44         ` Theodore Tso
2009-01-06  4:12           ` Theodore Tso
2009-01-22  0:43             ` Thiemo Nagel
2009-01-06 12:46           ` Thiemo Nagel
2009-01-06 13:25             ` Theodore Tso
2009-01-06 16:32               ` Thiemo Nagel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=49627285.8060407@ph.tum.de \
    --to=thiemo.nagel@ph.tum.de \
    --cc=linux-ext4@vger.kernel.org \
    --cc=tytso@mit.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.