Skip to content

GitLab

  • Projects
  • Groups
  • Snippets
  • Help
    • Loading...
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in / Register
Vorbis
Vorbis
  • Project overview
    • Project overview
    • Details
    • Activity
    • Releases
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 21
    • Issues 21
    • List
    • Boards
    • Labels
    • Service Desk
    • Milestones
  • Merge Requests 0
    • Merge Requests 0
  • CI / CD
    • CI / CD
    • Pipelines
    • Jobs
    • Schedules
  • Operations
    • Operations
    • Incidents
    • Environments
  • Packages & Registries
    • Packages & Registries
    • Container Registry
  • Analytics
    • Analytics
    • CI / CD
    • Repository
    • Value Stream
  • Wiki
    • Wiki
  • Members
    • Members
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • Xiph.Org
  • VorbisVorbis
  • Issues
  • #2335

Closed
Open
Opened Apr 25, 2018 by Jiangxin@Jiangxin

Four heap buffer overflow(read and write) vuls in function mapping0_forward() of libvorbis-1.3.6, which is caused by lacking of var “channels” check.

I found four heap buffer overflow vuls in function mapping0_forward() of libvorbis-1.3.6 by fuzzing libtheora, one of the crash sample behaves as follows, others behave similar:

Program received signal SIGABRT, Aborted.
0x00007ffff6fdfb55 in raise () from /lib64/libc.so.6
(gdb) bt
#0  0x00007ffff6fdfb55 in raise () from /lib64/libc.so.6
#1  0x00007ffff6fe1131 in abort () from /lib64/libc.so.6
#2  0x0000000000520a0b in __sanitizer::Abort () at /home/jiangxin/hunter-tool/llvm5/projects/compiler-rt/lib/sanitizer_common/sanitizer_posix_libcdep.cc:146
#3  0x000000000051eb3a in __sanitizer::Die () at /home/jiangxin/hunter-tool/llvm5/projects/compiler-rt/lib/sanitizer_common/sanitizer_termination.cc:59
#4  0x00000000005051a5 in ~ScopedInErrorReport (this=<optimized out>, __in_chrg=<optimized out>) at /home/jiangxin/hunter-tool/llvm5/projects/compiler-rt/lib/asan/asan_report.cc:225
#5  __asan::ReportGenericError (pc=<optimized out>, bp=bp@entry=140737488324304, sp=sp@entry=140737488324296, addr=<optimized out>, is_write=is_write@entry=false, access_size=access_size@entry=4, exp=<optimized out>, exp@entry=0, fatal=<optimized out>, fatal@entry=true) at /home/jiangxin/hunter-tool/llvm5/projects/compiler-rt/lib/asan/asan_report.cc:420
#6  0x0000000000505c03 in __asan::__asan_report_load4 (addr=<optimized out>) at /home/jiangxin/hunter-tool/llvm5/projects/compiler-rt/lib/asan/asan_rtl.cc:133
#7  0x000000000069fac3 in mapping0_forward (vb=0x7fffffffd330) at mapping0.c:370
#8  0x00000000006244af in vorbis_analysis (vb=0x7fffffffd330, op=0x0) at analysis.c:46
#9  0x000000000052f14e in fetch_and_process_audio (audio=0x616000000380, audiopage=0x7fffffffd5e0, vo=0x7fffffffceb0, vd=0x7fffffffd260, vb=0x7fffffffd330, audioflag=0) at encoder_example.c:996
#10 0x0000000000536546 in main (argc=5, argv=0x7fffffffdfe8) at encoder_example.c:1754
(gdb) 

These vuls are because of lacking of var “channels” check”, and here is the details of these four vuls in mapping0.c: vul 1: line 370 of mapping0.c

    366     for(i=0;i<vi->channels;i++){
    367       /* the encoder setup assumes that all the modes used by any
    368          specific bitrate tweaking use the same floor */
    369 
    370       int submap=info->chmuxlist[i];//int array[256] oob read, vi->channels need check

vul 2: line 614 of mapping0.c

    612       /* encode floor, compute masking curve, sep out residue */
    613       for(i=0;i<vi->channels;i++){
    614         int submap=info->chmuxlist[i];//int array[256] oob read, vi->channels need check
    615         int *ilogmask=iwork[i];

vul 3 and 4: line 666 and 678 of mapping0.c

    665         for(j=0;j<vi->channels;j++){
    666           if(info->chmuxlist[j]==i){//int array[256] oob write, vi->channels need check
    667             zerobundle[ch_in_bundle]=0;
    668             if(nonzero[j])zerobundle[ch_in_bundle]=1;
    669             couple_bundle[ch_in_bundle++]=iwork[j];
    670           }
    671         }
    672 
    673         classifications=_residue_P[ci->residue_type[resnum]]->
    674           class(vb,b->residue[resnum],couple_bundle,zerobundle,ch_in_bundle);
    675 
    676         ch_in_bundle=0;
    677         for(j=0;j<vi->channels;j++)
    678           if(info->chmuxlist[j]==i)//int array[256] oob write, vi->channels need check
    679             couple_bundle[ch_in_bundle++]=iwork[j];
    680 
    681         _residue_P[ci->residue_type[resnum]]->
    682           forward(opb,vb,b->residue[resnum],
    683                   couple_bundle,zerobundle,ch_in_bundle,classifications,i);

Note: I need compile libtheora and libvorbis by clang asan and use encoder_example of libtheora to reproduce this vul.

The cmdline to reproduce this vul is like this : ./encoder_example crash_sample xxx.y4m -o out.ogv

The binary encoder_example belongs to libtheora.

recommanded patch : adding on line 238 of mapping0.c

    230 static int mapping0_forward(vorbis_block *vb){
    231   vorbis_dsp_state      *vd=vb->vd;
    232   vorbis_info           *vi=vd->vi;
    233   codec_setup_info      *ci=vi->codec_setup;
    234   private_state         *b=vb->vd->backend_state;
    235   vorbis_block_internal *vbi=(vorbis_block_internal *)vb->internal;
    236   int                    n=vb->pcmend;
    237   int i,j,k;
    238   if(vi->channels > MAX_CHANNEL || vi->channels < 0) return -1;//recommanded patch for these vuls
Edited May 09, 2018 by Jiangxin
Assignee
Assign to
None
Milestone
None
Assign milestone
Time tracking
None
Due date
None
Reference: xiph/vorbis#2335