** Changed in: foo2zjs (Ubuntu)
       Status: New => Confirmed

** Changed in: foo2zjs (Ubuntu)
   Importance: Undecided => Low

-- 
You received this bug notification because you are a member of Desktop
Packages, which is subscribed to foo2zjs in Ubuntu.
https://bugs.launchpad.net/bugs/1653729

Title:
  Heap based OOB READ  in hbpldecode.c

Status in foo2zjs package in Ubuntu:
  Confirmed

Bug description:
  hbpldecode is used to decode a HBPL stream into human readbal form , and HBPL 
is Host Based Printer Language , it belongs to the foo2zjs project , whose 
official page is http://foo2hbpl.rkkda.com/ .
  hbpldecode locates in /usr/bin/ directory of ubuntu ,  a heap based OOB will 
occur if hbpldecode try to decode a crafted HBPL stream thus resulting in info 
leak in the heap ,  which is a security problem .

  The problem lies in decode2 function . when the header of crafted file
  is "PS" ,  the program will allocate "len" byte heap chunk to mbuf ,
  and then call print_bih(mbuf)  . the print_bih will output 20 bytes
  infomation of mbuf regardless of its actual size , when the "len" read
  from file is smaller than 20 ,  it causes an out of bound read issue .

  related code snippets :

  #decode2:
      if (header[1] == '%' && header[2] == '-') //end of file
        len = 15;
      else
      {
          if (header[1] == 'J' && header[2] == 'P')
          len = 60;    // JP doesn't have len
          else
          len = header[3];
          printf("RECTYPE %c%c - size=%d ", header[1], header[2], len);
      }

      curOff += len+4;
      rc = fread(buf, 1, len, fp);
      //....

      if (header[1] == 'P' && header[2] == 'S'){
      //...
          len = getLEdword(&buf[12]);
          mbuf = malloc(len);
          if ( color == 1 ){
              //...
              print_bih(mbuf);
              print_bih(mbuf + offbih[0]);
              print_bih(mbuf + offbih[0] + offbih[1]);
              //...
          }else{
              //...
              print_bih(mbuf);
              //...
          }
      }
  # print_bih:
  void
  print_bih(unsigned char bih[20])
  {
      unsigned int xd, yd, l0;

      xd = (bih[4] << 24) | (bih[5] << 16) | (bih[6] << 8) | (bih[7] << 0);
      yd = (bih[8] << 24) | (bih[9] << 16) | (bih[10] << 8) | (bih[11] << 0);
      l0 = (bih[12] << 24) | (bih[13] << 16) | (bih[14] << 8) | (bih[15] << 0);

      printf("        DL = %d, D = %d, P = %d, - = %d, XY = %d x %d\n",
       bih[0], bih[1], bih[2], bih[3], xd, yd);

      printf("        L0 = %d, MX = %d, MY = %d\n",
       l0, bih[16], bih[17]);

      printf("        Order   = %d %s%s%s%s%s\n", bih[18],
      bih[18] & JBG_HITOLO ? " HITOLO" : "",
      bih[18] & JBG_SEQ ? " SEQ" : "",
      bih[18] & JBG_ILEAVE ? " ILEAVE" : "",
      bih[18] & JBG_SMID ? " SMID" : "",
      bih[18] & 0xf0 ? " other" : "");

      printf("        Options = %d %s%s%s%s%s%s%s%s\n", bih[19],
      bih[19] & JBG_LRLTWO ? " LRLTWO" : "",
      bih[19] & JBG_VLENGTH ? " VLENGTH" : "",
      bih[19] & JBG_TPDON ? " TPDON" : "",
      bih[19] & JBG_TPBON ? " TPBON" : "",
      bih[19] & JBG_DPON ? " DPON" : "",
      bih[19] & JBG_DPPRIV ? " DPPRIV" : "",
      bih[19] & JBG_DPLAST ? " DPLAST" : "",
      bih[19] & 0x80 ? " other" : "");
      printf("        %u stripes, %d layers, %d planes\n",
      ((yd >> bih[1]) +  ((((1UL << bih[1]) - 1) & xd) != 0) + l0 - 1) / l0,
      bih[1] - bih[0], bih[2]);
  }

  Sanitizer output : 
  ==114006==ERROR: AddressSanitizer: heap-buffer-overflow on address 
0x60200000eff4 at pc 0x000000405552 bp 0x7ffdf9162dc0 sp 0x7ffdf9162db0
  READ of size 4 at 0x60200000eff4 thread T0
      #0 0x405551 in print_bih 
/home/bobb/fuzz-workspace/foo2zjs/hbpldecode.c:183
      #1 0x406937 in decode2 /home/bobb/fuzz-workspace/foo2zjs/hbpldecode.c:431
      #2 0x40f20b in decode /home/bobb/fuzz-workspace/foo2zjs/hbpldecode.c:865
      #3 0x401ea9 in main /home/bobb/fuzz-workspace/foo2zjs/hbpldecode.c:928
      #4 0x7fe49830882f in __libc_start_main 
(/lib/x86_64-linux-gnu/libc.so.6+0x2082f)
      #5 0x402148 in _start 
(/home/bobb/fuzz-workspace/foo2zjs-workspace/hbpldecode+0x402148)

  0x60200000eff4 is located 3 bytes to the right of 1-byte region 
[0x60200000eff0,0x60200000eff1)
  allocated by thread T0 here:
      #0 0x7fe498749602 in malloc 
(/usr/lib/x86_64-linux-gnu/libasan.so.2+0x98602)
      #1 0x4067ba in decode2 /home/bobb/fuzz-workspace/foo2zjs/hbpldecode.c:383

  SUMMARY: AddressSanitizer: heap-buffer-overflow /home/bobb/fuzz-
  workspace/foo2zjs/hbpldecode.c:183 print_bih

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/foo2zjs/+bug/1653729/+subscriptions

-- 
Mailing list: https://launchpad.net/~desktop-packages
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~desktop-packages
More help   : https://help.launchpad.net/ListHelp

Reply via email to