Control: tags -1 + patch
On Sun, Jul 02, 2017 at 11:12:36AM +0200, Salvatore Bonaccorso wrote:
> Source: mpg123
> Version: 1.25.0-1
> Severity: important
> Tags: upstream security
>
> Hi,
>
> the following vulnerability was published for mpg123.
>
> CVE-2017-10683[0]:
> | In mpg123 1.25.0, there is a heap-based buffer over-read in the
> | convert_latin1 function in libmpg123/id3.c. A crafted input will lead
> | to a remote denial of service attack.
>
> This was reported at [1], but Hanno Boeck recently reported [2] as
> well.
>
> Looking at both cases i think those should be the same issues, and
> upstream has a patch for the issue.
>
> If you fix the vulnerability please also make sure to include the
> CVE (Common Vulnerabilities & Exposures) id in your changelog entry.
>
> For further information see:
>
> [0] https://security-tracker.debian.org/tracker/CVE-2017-10683
> https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-10683
> [1] https://bugzilla.redhat.com/show_bug.cgi?id=1465819
> [2] https://sourceforge.net/p/mpg123/bugs/252/
Attaching the extracted patch.
Regards,
Salvatore
Index: NEWS
===
--- NEWS (revision 4251)
+++ NEWS (revision 4252)
@@ -2,6 +2,9 @@
---
- libmpg123:
-- Avoid memset(NULL, 0, 0) to calm down the paranoid.
+-- Fix bug 252, invalid read of size 1 in ID3v2 parser due to forgotten
+ offset from the frame flag bytes (unnoticed in practice for a long
+ time).
1.25.0: MP3 now patent-free worldwide!
---
Index: src/libmpg123/id3.c
===
--- src/libmpg123/id3.c (revision 4251)
+++ src/libmpg123/id3.c (revision 4252)
@@ -700,6 +700,8 @@
/* length-10 or length-20 (footer present); 4 synchsafe integers == 28 bit number */
/* we have already read 10 bytes, so left are length or length+10 bytes belonging to tag */
+ /* Note: This is an 28 bit value in 32 bit storage, plenty of space for */
+ /* length+x for reasonable x. */
if(!synchsafe_to_long(buf+2,length))
{
if(NOQUIET) error4("Bad tag length (not synchsafe): 0x%02x%02x%02x%02x; You got a bad ID3 tag here.", buf[2],buf[3],buf[4],buf[5]);
@@ -764,13 +766,16 @@
char id[5];
unsigned long framesize;
unsigned long fflags; /* need 16 bits, actually */
+ /* bytes of frame title and of framesize value */
+ int head_part = fr->id3v2.version > 2 ? 4 : 3;
+ int flag_part = fr->id3v2.version > 2 ? 2 : 0;
id[4] = 0;
/* pos now advanced after ext head, now a frame has to follow */
- while(tagpos < length-10) /* I want to read at least a full header */
+ /* I want to read at least one full header now. */
+ while(tagpos <= length-head_part-head_part-flag_part)
{
int i = 0;
unsigned long pos = tagpos;
- int head_part = fr->id3v2.version == 2 ? 3 : 4; /* bytes of frame title and of framesize value */
/* level 1,2,3 - 0 is info from lame/info tag! */
/* rva tags with ascending significance, then general frames */
enum frame_types tt = unknown;
@@ -801,7 +806,7 @@
}
if(VERBOSE3) fprintf(stderr, "Note: ID3v2 %s frame of size %lu\n", id, framesize);
tagpos += head_part + framesize; /* the important advancement in whole tag */
- if(tagpos > length)
+ if(tagpos > length-flag_part)
{
if(NOQUIET) error("Whoa! ID3v2 frame claims to be larger than the whole rest of the tag.");
break;
Index: .
===
--- . (revision 4251)
+++ . (revision 4252)
Property changes on: .
___
Modified: svn:mergeinfo
## -0,0 +0,1 ##
Merged /trunk:r4249
___
pkg-multimedia-maintainers mailing list
pkg-multimedia-maintainers@lists.alioth.debian.org
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-multimedia-maintainers