classification
Title: audioop.adpcm2lin Buffer Over-read
Type: security Stage: resolved
Components: Versions: Python 3.6, Python 3.5, Python 3.4, Python 2.7
process
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: serhiy.storchaka Nosy List: Arfrever, JohnLeitch, python-dev, serhiy.storchaka
Priority: normal Keywords: patch

Created on 2015-06-15 20:57 by JohnLeitch, last changed 2015-07-05 21:07 by Arfrever. This issue is now closed.

Files
File name Uploaded Description Edit
audioop.adpcm2lin_buffer_over-read.py JohnLeitch, 2015-06-15 20:57
audioop_adpcm_range_check.patch serhiy.storchaka, 2015-06-26 12:41 review
Messages (4)
msg245407 - (view) Author: John Leitch (JohnLeitch) * Date: 2015-06-15 20:57
The audioop.adpcm2lin function suffers from a buffer over-read caused by unchecked access to stepsizeTable at line 1545 of Modules\audioop.c:

    } else if ( !PyArg_ParseTuple(state, "ii", &valpred, &index) )
        return 0;

    step = stepsizeTable[index];
    
Because the index variable can be controlled via the third parameter of audioop.adpcm2lin, this behavior could potentially be exploited to disclose arbitrary memory, should an application expose the parameter to the attack surface.

0:000> r
eax=01f13474 ebx=00000000 ecx=00000002 edx=01f13460 esi=01f13460 edi=00000001
eip=1e01c4f0 esp=0027fcdc ebp=7e86ecdd iopl=0         nv up ei pl nz na po nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00010202
python27!audioop_adpcm2lin+0xe0:
1e01c4f0 8b04adb0dd1f1e  mov     eax,dword ptr python27!stepsizeTable (1e1fddb0)[ebp*4] ss:002b:183b9124=????????
0:000> k
ChildEBP RetAddr
0027fd18 1e0aafd7 python27!audioop_adpcm2lin+0xe0
0027fd30 1e0edd10 python27!PyCFunction_Call+0x47
0027fd5c 1e0f017a python27!call_function+0x2b0
0027fdcc 1e0f1150 python27!PyEval_EvalFrameEx+0x239a
0027fe00 1e0f11b2 python27!PyEval_EvalCodeEx+0x690
0027fe2c 1e11707a python27!PyEval_EvalCode+0x22
0027fe44 1e1181c5 python27!run_mod+0x2a
0027fe64 1e118760 python27!PyRun_FileExFlags+0x75
0027fea4 1e1190d9 python27!PyRun_SimpleFileExFlags+0x190
0027fec0 1e038d35 python27!PyRun_AnyFileExFlags+0x59
0027ff3c 1d00116d python27!Py_Main+0x965
0027ff80 76477c04 python!__tmainCRTStartup+0x10f
0027ff94 7799ad1f KERNEL32!BaseThreadInitThunk+0x24
0027ffdc 7799acea ntdll!__RtlUserThreadStart+0x2f
0027ffec 00000000 ntdll!_RtlUserThreadStart+0x1b
0:000>

To fix this issue, it is recommended that bounds checking be performed prior to accessing stepsizeTable.
msg245850 - (view) Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) Date: 2015-06-26 12:41
Here is a patch that checks the state and raises ValueError if integer values out of range.
msg245906 - (view) Author: Roundup Robot (python-dev) Date: 2015-06-28 14:57
New changeset 1f6c096ee772 by Serhiy Storchaka in branch '2.7':
Issue #24456: Fixed possible buffer over-read in adpcm2lin() and lin2adpcm()
https://hg.python.org/cpython/rev/1f6c096ee772

New changeset fd17e168b59f by Serhiy Storchaka in branch '3.4':
Issue #24456: Fixed possible buffer over-read in adpcm2lin() and lin2adpcm()
https://hg.python.org/cpython/rev/fd17e168b59f

New changeset 3039cb5b673c by Serhiy Storchaka in branch '3.5':
Issue #24456: Fixed possible buffer over-read in adpcm2lin() and lin2adpcm()
https://hg.python.org/cpython/rev/3039cb5b673c

New changeset 0e1d9018e74b by Serhiy Storchaka in branch 'default':
Issue #24456: Fixed possible buffer over-read in adpcm2lin() and lin2adpcm()
https://hg.python.org/cpython/rev/0e1d9018e74b
msg245907 - (view) Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) Date: 2015-06-28 14:58
The patch for 2.7 also fixed SystemError and possible memory leak.
History
Date User Action Args
2015-07-05 21:07:40Arfreversetnosy: + Arfrever
2015-06-28 16:31:26serhiy.storchakasetstatus: open -> closed
resolution: fixed
stage: needs patch -> resolved
2015-06-28 14:58:06serhiy.storchakasetmessages: + msg245907
2015-06-28 14:57:01python-devsetnosy: + python-dev
messages: + msg245906
2015-06-26 12:56:36serhiy.storchakalinkissue24457 superseder
2015-06-26 12:41:30serhiy.storchakasetfiles: + audioop_adpcm_range_check.patch
keywords: + patch
messages: + msg245850
2015-06-26 09:10:48serhiy.storchakasetstage: needs patch
versions: + Python 3.4, Python 3.5, Python 3.6
2015-06-16 13:41:38serhiy.storchakasetassignee: serhiy.storchaka

nosy: + serhiy.storchaka
2015-06-15 20:57:26JohnLeitchcreate