Package: libcdio
Severity: grave
Tags: security patch
Justification: user security hole

Hi,
during some reading in libcdio I found a bug in the iso9660_dir_to_name 
function.

855 char *
856 iso9660_dir_to_name (const iso9660_dir_t *iso9660_dir)
857 {
858   char namebuf[256] = { 0, };
859   uint8_t len=iso9660_get_dir_len(iso9660_dir);
860 
861   if (!len) return NULL;
862 
863   cdio_assert (len >= sizeof (iso9660_dir_t));
864 
865   /* (iso9660_dir->file_flags & ISO_DIRECTORY) */
866 ยทยท
867   if (iso9660_dir->filename[0] == '\0')
868     strncpy (namebuf, ".", sizeof("."));
869   else if (iso9660_dir->filename[0] == '\1')
870     strncpy (namebuf, "..", sizeof(".."));
871   else
872     strncpy (namebuf, iso9660_dir->filename, iso9660_dir->filename_len);
873 
874   return strdup (namebuf);
875 }

In line 863 there is check for the size of the directory length. It checks 
whether it's
bigger than the iso9660_dir_t struct which is basically iso9660_dir_s. I did 
not check
the exact size but it's a rather huge structure.

Then in line 872 it copies iso9660_dir->filename to namebuf and uses
iso9660_dir->filename_len as length modifier. This check is wrong.
It should check sizeof(namebuf) instead to prevent a stack-based buffer 
overflow here.

The function itself is not used in libcdio, it's only an API function and every 
program
which uses this could be vulnerable to arbitrary code execution. However I had 
no time to check
the reverse dependencies.

The upstream author confirmed this and already fixed it in CVS:
http://cvs.savannah.gnu.org/viewvc/libcdio/libcdio/lib/iso9660/iso9660_fs.c?r1=1.43&r2=1.44&sortby=date

Kind regards
Nico



-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to