[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#836592: jessie-pu: package gdcm/2.4.4-3



Package: release.debian.org
Severity: normal
Tags: jessie
User: release.debian.org@packages.debian.org
Usertags: pu

Dear release team,

The version of gdcm in jessie suffers from two security problems:

  CVE-2015-8396 [1]
  CVE-2015-8397 [2]

However, the security team notified my that the issue does not warrant a DSA
and I should instead just fix it via a jessie point release.

The proposed patch against the package is enclosed, it adds the according fixes
from the upstream repository.

best regards,
Gert

[1] https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-8396
[2] https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-8397



-- System Information:
Debian Release: stretch/sid
  APT prefers unstable-debug
  APT policy: (500, 'unstable-debug'), (500, 'unstable'), (500, 'testing'), (1,
'experimental')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 4.6.0-1-amd64 (SMP w/2 CPU cores)
Locale: LANG=de_DE.UTF-8, LC_CTYPE=de_DE.UTF-8 (charmap=UTF-8)
diff -ruN gdcm-2.4.4/debian/changelog gdcm-2.4.4.new/debian/changelog
--- gdcm-2.4.4/debian/changelog	2014-10-06 08:08:33.000000000 +0100
+++ gdcm-2.4.4.new/debian/changelog	2016-08-23 18:45:09.415835673 +0100
@@ -1,3 +1,11 @@
+gdcm (2.4.4-3+deb8u1) jessie-proposed-updates; urgency=medium
+
+  * add patches:  
+    - d/p/CVE-2015-8396.patch: fix according security vunerability
+    - d/p/CVE-2015-8397.patch: fix according security vunerability
+
+ -- Gert Wollny <gw.fossdev@gmail.com>  Sat, 20 Aug 2016 22:25:15 +0100
+
 gdcm (2.4.4-3) unstable; urgency=medium
 
   * Fix issue introduced by multiarch switch. Closes: #764029
diff -ruN gdcm-2.4.4/debian/patches/CVE-2015-8396.patch gdcm-2.4.4.new/debian/patches/CVE-2015-8396.patch
--- gdcm-2.4.4/debian/patches/CVE-2015-8396.patch	1970-01-01 01:00:00.000000000 +0100
+++ gdcm-2.4.4.new/debian/patches/CVE-2015-8396.patch	2016-08-20 23:23:27.990220328 +0100
@@ -0,0 +1,103 @@
+Author: Mathieu Malaterre <mathieu.malaterre@gmail.com>
+Date:   Fri Dec 18 12:18:02 2015 +0100
+Description: Patches fixing CVE-2015-8396
+ Patches were backported from upstream commits 
+  92cd6d7 Always prefer boxRegion computation for area
+  9cbca25 Fix a case when Region was never initialized
+  e0dd111 Add an extra layer of check
+  0f6f820 Actually handle the case of error in ComputeBufferLength
+
+Index: gdcm-2.4.4/Source/MediaStorageAndFileFormat/gdcmImageRegionReader.cxx
+===================================================================
+--- gdcm-2.4.4.orig/Source/MediaStorageAndFileFormat/gdcmImageRegionReader.cxx
++++ gdcm-2.4.4/Source/MediaStorageAndFileFormat/gdcmImageRegionReader.cxx
+@@ -85,6 +85,7 @@ Region const &ImageRegionReader::GetRegi
+ size_t ImageRegionReader::ComputeBufferLength() const
+ {
+   // Is this a legal extent:
++  size_t npixels = 0;
+   if( Internals->GetRegion() )
+     {
+     if( !Internals->GetRegion()->IsValid() )
+@@ -92,10 +93,26 @@ size_t ImageRegionReader::ComputeBufferL
+       gdcmDebugMacro( "Sorry not a valid extent. Giving up" );
+       return 0;
+       }
++    npixels = this->Internals->GetRegion()->Area();
+     }
+-  PixelFormat pixelInfo = ImageHelper::GetPixelFormatValue(GetFile());
+-  size_t bytesPerPixel = pixelInfo.GetPixelSize();
+-  return this->Internals->GetRegion()->Area()*bytesPerPixel;
++  else
++  {
++    std::vector<unsigned int> dims = ImageHelper::GetDimensionsValue(GetFile());
++    BoxRegion full;
++    // Use BoxRegion to do robust computation
++    full.SetDomain(0, dims[0] - 1,
++                   0, dims[1] - 1,
++                   0, dims[2] - 1 );
++    if( full.IsValid() )
++    {
++      gdcmDebugMacro( "Sorry not a valid extent. Giving up" );
++      return 0;
++     }
++    npixels = full.Area();
++  }
++  const PixelFormat pixelInfo = ImageHelper::GetPixelFormatValue(GetFile());
++  const size_t bytesPerPixel = pixelInfo.GetPixelSize();
++  return npixels*bytesPerPixel;
+ }
+ 
+ bool ImageRegionReader::ReadInformation()
+@@ -371,7 +388,17 @@ bool ImageRegionReader::ReadJPEGIntoBuff
+   theCodec.SetPixelFormat( ImageHelper::GetPixelFormatValue(GetFile()) );
+ 
+   std::istream* theStream = GetStreamPtr();
+-  const BoxRegion &boundingbox = this->Internals->GetRegion()->ComputeBoundingBox();
++  BoxRegion boundingbox;
++  if( Internals->GetRegion() )
++    boundingbox = this->Internals->GetRegion()->ComputeBoundingBox();
++  else
++  {
++    std::vector<unsigned int> dims = ImageHelper::GetDimensionsValue(GetFile());
++    boundingbox.SetDomain(
++      0, dims[0] - 1,
++      0, dims[1] - 1,
++      0, dims[2] - 1 );
++  }
+   unsigned int xmin = boundingbox.GetXMin();
+   unsigned int xmax = boundingbox.GetXMax();
+   unsigned int ymin = boundingbox.GetYMin();
+@@ -445,7 +472,13 @@ bool ImageRegionReader::ReadJPEGLSIntoBu
+ bool ImageRegionReader::ReadIntoBuffer(char *buffer, size_t buflen)
+ {
+   size_t thelen = ComputeBufferLength();
+-  if( buflen < thelen )
++  if( thelen == 0 )
++    {
++    // does not sound right, something seems odd.
++    gdcmDebugMacro( "Cannot load an image of 0 bytes" );
++    return false;
++    }
++   if( buflen < thelen )
+     {
+     gdcmDebugMacro( "buffer cannot be smaller than computed buffer length" );
+     return false;
+Index: gdcm-2.4.4/Source/Common/gdcmBoxRegion.cxx
+===================================================================
+--- gdcm-2.4.4.orig/Source/Common/gdcmBoxRegion.cxx
++++ gdcm-2.4.4/Source/Common/gdcmBoxRegion.cxx
+@@ -79,6 +79,13 @@ bool BoxRegion::IsValid() const
+     {
+     return false;
+     }
++  // Some properly crafted DICOM could have bigger values, reject them:
++  // technically there is no such restrictions for Z direction
++  if (Internals->XMax > std::numeric_limits<uint16_t>::max() ||
++      Internals->YMax > std::numeric_limits<uint16_t>::max() )
++  {
++    return false;
++  }
+   return true;
+ }
+ 
diff -ruN gdcm-2.4.4/debian/patches/CVE-2015-8397.patch gdcm-2.4.4.new/debian/patches/CVE-2015-8397.patch
--- gdcm-2.4.4/debian/patches/CVE-2015-8397.patch	1970-01-01 01:00:00.000000000 +0100
+++ gdcm-2.4.4.new/debian/patches/CVE-2015-8397.patch	2016-08-20 22:30:26.000000000 +0100
@@ -0,0 +1,36 @@
+Description: Fix CVE-2015-8397 in jessie 
+ backported upstream commit: 
+ e547b1d Avoid a buffer over run with properly crafted JPEG-LS
+Author: Mathieu Malaterre <mathieu.malaterre@gmail.com>
+Date:   Fri Dec 11 14:35:08 2015 +0100
+
+Index: gdcm-2.4.4/Source/MediaStorageAndFileFormat/gdcmJPEGLSCodec.cxx
+===================================================================
+--- gdcm-2.4.4.orig/Source/MediaStorageAndFileFormat/gdcmJPEGLSCodec.cxx
++++ gdcm-2.4.4/Source/MediaStorageAndFileFormat/gdcmJPEGLSCodec.cxx
+@@ -449,6 +449,12 @@ bool JPEGLSCodec::DecodeExtent(
+     const unsigned int colsize = ymax - ymin + 1;
+     const unsigned int bytesPerPixel = pf.GetPixelSize();
+ 
++    if( outv.size() != dimensions[0] * dimensions[1] * bytesPerPixel )
++    {
++       gdcmDebugMacro( "Inconsistant buffer size. Giving up" );
++       return false;
++    }
++
+     const unsigned char *tmpBuffer1 = raw;
+     unsigned int z = 0;
+     for (unsigned int y = ymin; y <= ymax; ++y)
+@@ -505,6 +511,12 @@ bool JPEGLSCodec::DecodeExtent(
+       const unsigned int colsize = ymax - ymin + 1;
+       const unsigned int bytesPerPixel = pf.GetPixelSize();
+ 
++      if( outv.size() != dimensions[0] * dimensions[1] * bytesPerPixel )
++      {
++         gdcmDebugMacro( "Inconsistant buffer size. Giving up" );
++         return false;
++      }
++
+       const unsigned char *tmpBuffer1 = raw;
+       for (unsigned int y = ymin; y <= ymax; ++y)
+         {
diff -ruN gdcm-2.4.4/debian/patches/series gdcm-2.4.4.new/debian/patches/series
--- gdcm-2.4.4/debian/patches/series	2014-10-06 08:08:33.000000000 +0100
+++ gdcm-2.4.4.new/debian/patches/series	2016-08-20 22:28:52.000000000 +0100
@@ -2,3 +2,5 @@
 fixhurd.patch
 linkvtkdoc.patch
 multiarch.patch
+CVE-2015-8396.patch
+CVE-2015-8397.patch

Reply to: