Package: release.debian.org
Severity: normal
User: release.debian....@packages.debian.org
Usertags: unblock

Please unblock package lib3mf

[ Reason ]

This is a targeted fix, a backport of upstream fix for CVE-2021-21772, which
is a use-after-free on user-controlled input:

  https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=985092
  https://github.com/3MFConsortium/lib3mf/issues/254

[ Impact ]

This is a published security bug in upstream lib3mf.

[ Tests ]

 - We obtained a (non-published) .3mf that triggers the bug. I verified
   (with Valgrind) that opening this 3MF file triggers a use-after-free in
   lib3mf_1.8.1+ds-3.1 and that it does not in lib3mf_1.8.1+ds-4.

 - Package `openscad', the main reverse dependency, has a comprehensive
   testsuite which passes with lib3mf_1.8.1+ds-4.

[ Checklist ]
  [x] all changes are documented in the d/changelog
  [x] I reviewed all changes and I approve them
  [x] attach debdiff against the package in testing

unblock lib3mf/1.8.1+ds-4

-- System Information:
Debian Release: 10.9
  APT prefers stable-updates
  APT policy: (500, 'stable-updates'), (500, 'stable')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 5.4.0-0.bpo.4-amd64 (SMP w/8 CPU cores)
Kernel taint flags: TAINT_UNSIGNED_MODULE
Locale: LANG=en_GB.UTF-8, LC_CTYPE=en_GB.UTF-8 (charmap=UTF-8), 
LANGUAGE=en_GB.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled
diff -Nru lib3mf-1.8.1+ds/debian/changelog lib3mf-1.8.1+ds/debian/changelog
--- lib3mf-1.8.1+ds/debian/changelog    2020-12-06 02:27:21.000000000 +0100
+++ lib3mf-1.8.1+ds/debian/changelog    2021-04-01 21:25:54.000000000 +0200
@@ -1,3 +1,10 @@
+lib3mf (1.8.1+ds-4) unstable; urgency=medium
+
+  * Fix use-after-free (CVE-2021-21772), backporting fix from v2.1.1
+    (Closes: #985092)
+
+ -- Kristian Nielsen <kniel...@knielsen-hq.org>  Thu, 01 Apr 2021 21:25:54 
+0200
+
 lib3mf (1.8.1+ds-3.1) unstable; urgency=medium
 
   * Non-maintainer upload.
diff -Nru lib3mf-1.8.1+ds/debian/control lib3mf-1.8.1+ds/debian/control
--- lib3mf-1.8.1+ds/debian/control      2019-01-20 18:32:34.000000000 +0100
+++ lib3mf-1.8.1+ds/debian/control      2021-04-01 21:25:54.000000000 +0200
@@ -2,6 +2,7 @@
 Section: libs
 Priority: optional
 Maintainer: Torsten Paul <torsten.p...@gmx.de>
+Uploaders: Kristian Nielsen <kniel...@knielsen-hq.org>
 Build-Depends: debhelper (>=12~), pkg-kde-tools, cmake, libzip-dev, 
zlib1g-dev, uuid-dev
 Standards-Version: 4.3.0
 Homepage: https://github.com/3MFConsortium/lib3mf
diff -Nru lib3mf-1.8.1+ds/debian/patches/fix_use_after_free.patch 
lib3mf-1.8.1+ds/debian/patches/fix_use_after_free.patch
--- lib3mf-1.8.1+ds/debian/patches/fix_use_after_free.patch     1970-01-01 
01:00:00.000000000 +0100
+++ lib3mf-1.8.1+ds/debian/patches/fix_use_after_free.patch     2021-04-01 
21:25:54.000000000 +0200
@@ -0,0 +1,76 @@
+From: Kristian Nielsen <kniel...@knielsen-hq.org>
+Date: Thu, 1 Apr 2021 21:28:00 +0100
+Subject: Remove unnecessary zip_source_close
+
+This patch fixes CVE-2021-21772, a use-after-free bug. It is a
+backport of the upstream fix in v2.1.1.
+
+Forwarded: not-needed
+---
+ Include/Common/OPC/NMR_OpcPackageReader.h  |  1 -
+ Source/Common/OPC/NMR_OpcPackageReader.cpp | 16 ++++++----------
+ 2 files changed, 6 insertions(+), 11 deletions(-)
+
+--- a/Include/Common/OPC/NMR_OpcPackageReader.h
++++ b/Include/Common/OPC/NMR_OpcPackageReader.h
+@@ -54,7 +54,6 @@ namespace NMR {
+               std::vector<nfByte> m_Buffer;
+               zip_error_t m_ZIPError;
+               zip_t * m_ZIParchive;
+-              zip_source_t * m_ZIPsource;
+               std::map <std::string, nfUint64> m_ZIPEntries;
+               std::map <std::string, POpcPackagePart> m_Parts;
+ 
+diff --git a/Source/Common/OPC/NMR_OpcPackageReader.cpp 
b/Source/Common/OPC/NMR_OpcPackageReader.cpp
+index 16dd2e8c..4f3a604d 100644
+--- a/Source/Common/OPC/NMR_OpcPackageReader.cpp
++++ b/Source/Common/OPC/NMR_OpcPackageReader.cpp
+@@ -111,7 +111,7 @@ namespace NMR {
+               m_ZIPError.sys_err = 0;
+               m_ZIPError.zip_err = 0;
+               m_ZIParchive = nullptr;
+-              m_ZIPsource = nullptr;
++              zip_source_t* pZIPsource = nullptr;
+ 
+               try {
+                       // determine stream size
+@@ -131,20 +131,20 @@ namespace NMR {
+ #endif
+                       if (bUseCallback) {
+                               // read ZIP from callback: faster and requires 
less memory
+-                              m_ZIPsource = 
zip_source_function_create(custom_zip_source_callback, pImportStream.get(), 
&m_ZIPError);
++                              pZIPsource = 
zip_source_function_create(custom_zip_source_callback, pImportStream.get(), 
&m_ZIPError);
+                       }
+                       else {
+                               // read ZIP into memory
+                               m_Buffer.resize((size_t)nStreamSize);
+                               pImportStream->readBuffer(&m_Buffer[0], 
nStreamSize, true);
+-                              m_ZIPsource = 
zip_source_buffer_create(&m_Buffer[0], (size_t)nStreamSize, 0, &m_ZIPError);
++                              pZIPsource = 
zip_source_buffer_create(&m_Buffer[0], (size_t)nStreamSize, 0, &m_ZIPError);
+                       }
+-                      if (m_ZIPsource == nullptr)
++                      if (pZIPsource == nullptr)
+                               throw 
CNMRException(NMR_ERROR_COULDNOTREADZIPFILE);
+ 
+-                      m_ZIParchive = zip_open_from_source(m_ZIPsource, 
ZIP_RDONLY | ZIP_CHECKCONS, &m_ZIPError);
++                      m_ZIParchive = zip_open_from_source(pZIPsource, 
ZIP_RDONLY | ZIP_CHECKCONS, &m_ZIPError);
+                       if (m_ZIParchive == nullptr) {
+-                              m_ZIParchive = 
zip_open_from_source(m_ZIPsource, ZIP_RDONLY, &m_ZIPError);
++                              m_ZIParchive = zip_open_from_source(pZIPsource, 
ZIP_RDONLY, &m_ZIPError);
+                               if (m_ZIParchive == nullptr)
+                                       throw 
CNMRException(NMR_ERROR_COULDNOTREADZIPFILE);
+                               else
+@@ -208,13 +208,9 @@ namespace NMR {
+               if (m_ZIParchive != nullptr)
+                       zip_close(m_ZIParchive);
+ 
+-              if (m_ZIPsource != nullptr)
+-                      zip_source_close(m_ZIPsource);
+-
+               zip_error_fini(&m_ZIPError);
+               m_Buffer.resize(0);
+ 
+-              m_ZIPsource = nullptr;
+               m_ZIParchive = nullptr;
+       }
+ 
diff -Nru lib3mf-1.8.1+ds/debian/patches/series 
lib3mf-1.8.1+ds/debian/patches/series
--- lib3mf-1.8.1+ds/debian/patches/series       2020-12-06 02:26:45.000000000 
+0100
+++ lib3mf-1.8.1+ds/debian/patches/series       2021-04-01 21:07:16.000000000 
+0200
@@ -1 +1,2 @@
 link-z.patch
+fix_use_after_free.patch

Reply via email to