Florian Ernst wrote:
> Hello there,
>
> On Thu, Jun 02, 2005 at 05:53:19PM +0200, Martin Schulze wrote:
> > Florian Ernst wrote:
> > > On Sat, May 28, 2005 at 12:32:39AM +0200, Florian Ernst wrote:
> > > > Find attached the backported patch I sent to the security team.
> > >
> > > Well, now, really, that is.
> >
> > I may be stupid, but how can this prevent an integer overflow:
> >
> > - thunk_table=(PE_THUNK_DATA*)malloc(sizeof *thunk_table *
> > thunk_count);
> > + if (thunk_count) {
> > + thunk_table=(PE_THUNK_DATA*)malloc(sizeof
> > *thunk_table * thunk_count);
> >
> > Just set thunk_count to MAX_UINT-1 and see what the result of
> > the multiplication is.
>
> I believe this change wasn't aimed at preventing an integer overflow
> at all, but rather at preventing a "malloc(0)".
In that case the patch is not needed in a security update since a
malloc (0) for a structure that is always referenced by the factor
it caused the 0, does not hurt.
I've checked this for the one location only which said/says:
thunk_table=(PE_THUNK_DATA*)malloc(sizeof *thunk_table * thunk_count);
...
for (UINT i=0; i<thunk_count; i++) {
^^^^^^^^^^^
...
for (dword i=0; i<thunk_count; i++) {
^^^^^^^^^^^
Both loops won't be entered if thunk_count is zero anyway
--> superflous crap for a security update.
> The preceding part of the code tries to limit the maximum size
> "thunk_count" could reach via the "if (!thunk.ordinal) break;"
> (all code taken from 0.5.0):
> | PE_THUNK_DATA thunk;
> | dword thunk_count = 0;
> | file->seek(thunk_ofs);
> | while (1) {
> | file->read(&thunk, sizeof thunk);
> | create_host_struct(&thunk, PE_THUNK_DATA_struct,
> little_endian);
> | if (!thunk.ordinal) break;
> | thunk_count++;
> | }
> |
> | PE_THUNK_DATA *thunk_table;
>
> But if "!thunk.ordinal" is (for whatever reasons) met during the first
> cycle "thunk_count" will remain zero and thus the following code
It's ok to fix or change that upstream but it must not clutter
a security update.
> | thunk_table=(PE_THUNK_DATA*)malloc(sizeof *thunk_table *
> thunk_count);
> | file->seek(thunk_ofs);
> | file->read(thunk_table, sizeof *thunk_table * thunk_count);
> | // FIXME: ?
> | for (UINT i=0; i<thunk_count; i++) {
> would effectively read
> | thunk_table=(PE_THUNK_DATA*)malloc(0);
> | [...]
> | file->read(thunk_table, 0);
> | [...]
> | for (UINT i=0; i<0; i++) {
> which is, err, not that good. OTOH, as Debian utilizes glibc which
> AFAIK supports malloc(0), this particular change might not be strictly
> necessary for Debian security purposes. I have to admit my changelog
> entry is quite misleading wrt this change, I just did a simple copy
> and paste of the description as it appeared sufficient to me.
Yes.
> This is my interpretation of this change, please hit me (hard) with a
> cluebat if I'm wrong.
I had hoped you would have come up with a different explanation, since
this is what I thought as well. :-%
Regards,
Joey
--
Long noun chains don't automatically imply security. -- Bruce Schneier
Please always Cc to me when replying to me on the lists.
--
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]