CVE:CVE-2009-0135
CNNVD:CNNVD-200901-198
Amarok是Linux/Unix平台下的音乐播放器。
Amarok在解析畸形的Audible数字音频文件时存在多个整数溢出和未检查的内存分配漏洞，远程攻击者可以利用这些漏洞执行任意代码。 
以下是amarok-2.0\src\metadata\audible\audibletag.cpp中有漏洞的代码段：
[...]
140 bool Audible::Tag::readTag( FILE *fp, char **name, char **value)
141 {
142        quint32 nlen;
143 [1]    if ( fread(&nlen, sizeof(nlen), 1, fp) != 1 )
144            return false;
145 
146        nlen = ntohl(nlen);
147        //fprintf(stderr, "tagname len=%x\n", (unsigned)nlen);
148 [2]    *name = new char[nlen+1];
149 [4]    (*name)[nlen] = &'\0&';
150 
151        quint32 vlen;
152 [5]    if ( fread(&vlen, sizeof(vlen), 1, fp) != 1 )
153        {
154            delete [] *name;
155            *name = 0;
156            return false;
157        }
158 
159        vlen = ntohl(vlen);
160        //fprintf(stderr, "tag len=%x\n", (unsigned)vlen);
161 
162 [3]    if ( fread(*name, nlen, 1, fp) != 1 )
163        {
164            delete [] *name;
165            *name = 0;
166            return false;
167        }
168 
169 [6]    *value = new char[vlen+1];
170 [8]    (*value)[vlen] = &'\0&';
171 
172 [7]    if ( fread(*value, vlen, 1, fp) != 1 )
173        {
174            delete [] *value;
175            *value = 0;
176            return false;
177        }
178 
[...]
可导致堆溢出的整数溢出#1： 
[1] 从媒体文件获得用户定义的值并存储在无符int型变量nlen中。
[2] 该行分配了nlen+1字节的堆缓冲区。如果对nlen提供了0xffffffff值，就可以触发整数溢出，导致分配很小的堆缓冲区。 
[3] 将用户控制值nlen用作了长度标识符以将媒体文件中用户控制的数据拷贝到name所指向的之前分配的堆缓冲区。由于nlen值很大(0xffffffff)，媒体文件中的用户控制数据覆盖了堆缓冲区。
可导致内存破坏的未经检查内存分配漏洞#1：
[2]+[4] 这段代码没有检查新的[]语句所返回的空指针，然后用户控制的nlen值引用了所生成指针并为引用的位置分配了8位值0x00。可利用这个漏洞通过1-字节值0x00覆盖任意内存位置。
可导致堆溢出的整数溢出#2：
[5] 从媒体文件获得用户定义的值并存储在无符int型变量vlen中。
[6] 该行分配了vlen+1字节的堆缓冲区。如果对vlen提供了0xffffffff值，就可以触发整数溢出，导致分配很小的堆缓冲区。
[7] 将用户控制值vlen用作了长度标识符以将媒体文件中用户控制的数据拷贝到name所指向的之前分配的堆缓冲区。由于vlen值很大(0xffffffff)，媒体文件中的用户控制数据覆盖了堆缓冲区。
可导致内存破坏的未经检查内存分配漏洞#2：
[6]+[8] 这段代码没有检查新的[]语句所返回的空指针，然后用户控制的nlen值引用了所生成指针并为引用的位置分配了8位值0x00。可利用这个漏洞通过1-字节值0x00覆盖任意内存位置。
solution:Upgrade amarok amarok to a higher version than 1.4.10,2.0,2.0.1,and avoid the version 1.4.10,2.0,2.0.1