<html>
    <head>
      <base href="https://bugzilla.libav.org/" />
    </head>
    <body><table border="1" cellspacing="0" cellpadding="8">
        <tr>
          <th>Bug ID</th>
          <td><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - There is a heap based buffer overflow in the avconv && avprobe tools of the libav library. A crafted input can lead to a heap buffer overflow resulting in multiple damages."
   href="https://bugzilla.libav.org/show_bug.cgi?id=1067">1067</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>There is a heap based buffer overflow in the avconv && avprobe tools of the libav library. A crafted input can lead to a heap buffer overflow resulting in multiple damages.
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>Libav
          </td>
        </tr>

        <tr>
          <th>Version</th>
          <td>12
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>X86
          </td>
        </tr>

        <tr>
          <th>OS</th>
          <td>Linux
          </td>
        </tr>

        <tr>
          <th>Status</th>
          <td>NEW
          </td>
        </tr>

        <tr>
          <th>Severity</th>
          <td>critical
          </td>
        </tr>

        <tr>
          <th>Priority</th>
          <td>---
          </td>
        </tr>

        <tr>
          <th>Component</th>
          <td>release
          </td>
        </tr>

        <tr>
          <th>Assignee</th>
          <td>bugzilla@libav.org
          </td>
        </tr>

        <tr>
          <th>Reporter</th>
          <td>v.owl337@gmail.com
          </td>
        </tr></table>
      <p>
        <div>
        <pre>Created <span class=""><a href="attachment.cgi?id=669" name="attach_669" title="Description contains the trigger method">attachment 669</a> <a href="attachment.cgi?id=669&action=edit" title="Description contains the trigger method">[details]</a></span>
Description contains the trigger method

The debugging information is as follows:

$ ./avconv -i POC1 -f null 
avconv version 12.1, Copyright (c) 2000-2017 the Libav developers
  built on May 20 2017 04:46:17 with clang version 3.8.0-2ubuntu4
(tags/RELEASE_380/final)
[h263 @ 0x21ec040] Format detected only with low score of 25, misdetection
possible!
[h263 @ 0x21f8080] warning: first frame is no keyframe
[h263 @ 0x21f8080] Error at MB: 1
[h263 @ 0x21f8080] I cbpy damaged at 13 0
[h263 @ 0x21f8080] Error at MB: 13
[h263 @ 0x21f8080] illegal ac vlc code at 0x0
[h263 @ 0x21f8080] Error at MB: 0
[h263 @ 0x21f8080] Error at MB: 4989
[h263 @ 0x21f8080] illegal ac vlc code at 0x0
[h263 @ 0x21f8080] Error at MB: 0
Segmentation fault

The vulnerability was triggered in function hpel_motion() at
mpegvideo_motion.c:192 . With a special input,the pointer 'src' will point to
an illegal address that cause a Segmentation fault of the program. This bug not
crash until the function hpel_motion() being called multiple times.

192 static inline int hpel_motion(MpegEncContext *s,
193                               uint8_t *dest, uint8_t *src,
194                               int src_x, int src_y,
195                               op_pixels_func *pix_op,
196                               int motion_x, int motion_y)
197 {
198     int dxy = 0;
199     int emu = 0;
200 
201     src_x += motion_x >> 1;
202     src_y += motion_y >> 1;
203 
204     /* WARNING: do no forget half pels */
205     src_x = av_clip(src_x, -16, s->width); // FIXME unneeded for emu?
206     if (src_x != s->width)
207         dxy |= motion_x & 1;
208     src_y = av_clip(src_y, -16, s->height);
209     if (src_y != s->height)
210         dxy |= (motion_y & 1) << 1;
211     src += src_y * s->linesize + src_x;

The bug result in multi crashes in different function, all the crashes are
caused by calling the same function hpel_motion().  gdb debug information is
below, we just list 5 poc and each bring different affact.

$ gdb ./avconv

(gdb) set args -i POC1 -f null
(gdb) r
...

Trailing options were found on the commandline.
[h263 @ 0x1bd0060] Format detected only with low score of 25, misdetection
possible!
[h263 @ 0x1bdc080] warning: first frame is no keyframe
[h263 @ 0x1bdc080] Error at MB: 1
[h263 @ 0x1bdc080] I cbpy damaged at 13 0
[h263 @ 0x1bdc080] Error at MB: 13
[h263 @ 0x1bdc080] illegal ac vlc code at 0x0
[h263 @ 0x1bdc080] Error at MB: 0
[h263 @ 0x1bdc080] Error at MB: 4989
[h263 @ 0x1bdc080] illegal ac vlc code at 0x0
[h263 @ 0x1bdc080] Error at MB: 0

Program received signal SIGSEGV, Segmentation fault.
0x0000000000f5f7d0 in ff_put_pixels8_mmx (block=0x7ffff7e4f078 "", 
    pixels=0x7ffff7359afa <error: Cannot access memory at address
0x7ffff7359afa>, line_size=1408, h=8)
    at libavcodec/x86/fpel_mmx.c:81
81        __asm__ volatile (

(gdb) set args -i  POC2  -f null
(gdb) r
...

Trailing options were found on the commandline.
[h263 @ 0x1bd0060] Format detected only with low score of 25, misdetection
possible!
[h263 @ 0x1bdc080] warning: first frame is no keyframe

Program received signal SIGSEGV, Segmentation fault.
0x0000000000f8bf94 in ff_put_pixels8_y2_mmxext ()

(gdb) set args -i  POC3  -f null
(gdb) r
...
Trailing options were found on the commandline.
[h263 @ 0x1bdc080] run overflow at 0x0 i:0
[h263 @ 0x1bdc080] Error at MB: 0
[h263 @ 0x1bdc080] run overflow at 6x0 i:0
[h263 @ 0x1bdc080] Error at MB: 6
...

Program received signal SIGSEGV, Segmentation fault.
ff_put_pixels8_xy2_mmx (block=0x7ffff7e4f098 "", 
    pixels=0x7ffff7359b1e <error: Cannot access memory at address
0x7ffff7359b1e>, line_size=1408, h=8)
    at libavcodec/x86/rnd_template.c:38
38        __asm__ volatile(

(gdb) set args -i  POC4  -f null
(gdb) r
...
Trailing options were found on the commandline.
[h263 @ 0x1bd0060] Format detected only with low score of 25, misdetection
possible!
[h263 @ 0x1bdc080] warning: first frame is no keyframe
[h263 @ 0x1bdc080] illegal ac vlc code at 2x0
...

Program received signal SIGSEGV, Segmentation fault.
0x0000000000f8bd04 in ff_put_pixels8_x2_mmxext.loop ()

(gdb) set args -i  POC5  -f null 
(gdb) r
...
Trailing options were found on the commandline.
[h263 @ 0x1bd0060] Format detected only with low score of 25, misdetection
possible!
[h263 @ 0x1bdc080] Syntax-based Arithmetic Coding (SAC) not supported
[h263 @ 0x1bdc080] header damaged
...

Program received signal SIGSEGV, Segmentation fault.
put_no_rnd_pixels8_xy2_mmx (block=0x7ffff7e4f040 "", 
    pixels=0x7ffff7357f40 <error: Cannot access memory at address
0x7ffff7357f40>, line_size=1408, h=8)
    at libavcodec/x86/rnd_template.c:38
38        __asm__ volatile(
...

Credits:

This vulnerability is detected by team OWL337, with our custom fuzzer collAFL.
Please contact <a href="mailto:ganshuitao@gmail.com">ganshuitao@gmail.com</a>   and <a href="mailto:chaoz@tsinghua.edu.cn">chaoz@tsinghua.edu.cn</a> if you need
more info about the team, the tool or the vulnerability.</pre>
        </div>
      </p>
      <hr>
      <span>You are receiving this mail because:</span>
      
      <ul>
          <li>You are watching all bug changes.</li>
      </ul>
    </body>
</html>