Package: release.debian.org
Severity: normal
User: release.debian....@packages.debian.org
Usertags: unblock
X-Debbugs-Cc: r...@packages.debian.org, d...@fifthhorseman.net
Control: affects -1 + src:rnp
Control: blocks -1 + 1034558

Please unblock package rnp

[ Reason ]

RNP upstream provided a narrowly-targeted point release (0.16.3) for
fixing two CVEs.  It is a small diff from 0.16.2, which is already in
testing.

[ Impact ]

Without this fix, the two CVEs will remain open:

 - CVE-2023-29479 (possible hang on malformed inputs)
 - CVE-2023-29480 (some secret keys may remain unlocked after use) 

Anyone using thunderbird (the most prominent consumer of librnp for
OpenPGP messages) will be vulnerable to them.

>From a debian perspective, debian RC bug #1034558 could cause the
ejection of librnp from testing, which would damage our ability to
ship thunderbird.

[ Tests ]

librnp upstream ships a substantial test suite in src/tests/ --
src/tests/ffi-enc.cpp has been updated to ensure that secret keys
remain locked (CVE-2023-29480).  I haven't seen a test for
CVE-2023-29479, but i've asked upstream for one (they might not want
to include a PoC artifact until the fix is more widely distributed):

   https://github.com/rnpgp/rnp/issues/2082

[ Risks ]

The code changes are small and relatively compact.  there are a few
other source changes beyond the CVE fixes, mostly either shell script
cleanup or improvements to builds on MacOS.  I've opted to go with
upstream's 0.16.3 rather than cherry-picking the CVE fixes because the
differences are relatively small and it's better for the user to see
that they're running the upstream bugfix release explicitly.

[ 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 rnp/0.16.3-1
diff -Nru rnp-0.16.2/CHANGELOG.md rnp-0.16.3/CHANGELOG.md
--- rnp-0.16.2/CHANGELOG.md     2022-09-22 05:27:54.000000000 -0400
+++ rnp-0.16.3/CHANGELOG.md     2023-04-12 20:27:38.000000000 -0400
@@ -1,5 +1,12 @@
 ## Changelog
 
+### 0.16.3 [2023-04-11]
+
+#### Security
+
+* Fixed issue with possible hang on malformed inputs (CVE-2023-29479).
+* Fixed issue where in some cases, secret keys remain unlocked after use 
(CVE-2023-29480).
+
 ### 0.16.2 [2022-09-20]
 
 #### General
diff -Nru rnp-0.16.2/ci/lib/install_functions.inc.sh 
rnp-0.16.3/ci/lib/install_functions.inc.sh
--- rnp-0.16.2/ci/lib/install_functions.inc.sh  2022-09-22 05:27:54.000000000 
-0400
+++ rnp-0.16.3/ci/lib/install_functions.inc.sh  2023-04-12 20:27:38.000000000 
-0400
@@ -19,6 +19,11 @@
 : "${RECOMMENDED_CMAKE_VERSION:=3.20.5}"
 : "${RECOMMENDED_PYTHON_VERSION:=3.9.2}"
 : "${RECOMMENDED_RUBY_VERSION:=2.5.8}"
+# Bundler version to use if Ruby version is less then
+# FALLBACK_BUNDLER_RUBY_VERSION
+: "${FALLBACK_BUNDLER_VERSION:=2.3.26}"
+: "${FALLBACK_BUNDLER_RUBY_VERSION:=2.6.0}"
+
 : "${RECOMMENDED_BOTAN_VERSION_MSYS:=${RECOMMENDED_BOTAN_VERSION}-1}"
 
 : "${CMAKE_VERSION:=${RECOMMENDED_CMAKE_VERSION}}"
@@ -69,6 +74,17 @@
   rm /usr/local/Cellar/openssl || true
   # homebrew fails to update python 3.9.1 to 3.9.1.1 due to unlinking failure
   rm /usr/local/bin/2to3 || true
+  # homebrew fails to update python from 3.9 to 3.10 due to another unlinking 
failure
+  rm /usr/local/bin/idle3 || true
+  rm /usr/local/bin/pydoc3 || true
+  rm /usr/local/bin/python3 || true
+  rm /usr/local/bin/python3-config || true
+  # homebrew fails to update python from 3.11.0 to 3.11.1
+  rm /usr/local/bin/2to3-3.11 || true
+  rm /usr/local/bin/idle3.11 || true
+  rm /usr/local/bin/pydoc3.11 || true
+  rm /usr/local/bin/python3.11 || true
+  rm /usr/local/bin/python3.11-config || true
   # homebrew fails to update openssl@1.1 1.1.1l to 1.1.1l_1 due to linking 
failure of nghttp2.h
   brew unlink nghttp2 || true
   brew update
@@ -252,6 +268,7 @@
 }
 
 linux_install_centos8() {
+  "${SUDO}" "${YUM}" -y -q install 'dnf-command(config-manager)'
   "${SUDO}" "${YUM}" config-manager --set-enabled powertools
   yum_prepare_repos epel-release
   yum_install_build_dependencies \
@@ -492,7 +509,7 @@
   automake_build=${LOCAL_BUILDS}/automake
   mkdir -p "${automake_build}"
   pushd "${automake_build}"
-  curl -L -o automake.tar.xz 
https://ftp.gnu.org/gnu/automake/automake-${AUTOMAKE_VERSION}.tar.xz
+  curl -L -o automake.tar.xz 
"https://ftp.gnu.org/gnu/automake/automake-${AUTOMAKE_VERSION}.tar.xz";
   tar -xf automake.tar.xz --strip 1
   ./configure --enable-optimizations --prefix=/usr && ${MAKE} 
-j"${MAKE_PARALLEL}" && ${SUDO} make install
   popd
@@ -687,7 +704,11 @@
 
 # ruby-rnp
 install_bundler() {
-  gem_install bundler bundle
+  if is_version_at_least ruby "${FALLBACK_BUNDLER_RUBY_VERSION}" command ruby 
-e 'puts RUBY_VERSION'; then
+    gem_install bundler bundle
+  else
+    gem_install "bundler:${FALLBACK_BUNDLER_VERSION}" bundle
+  fi
 }
 
 install_asciidoctor() {
@@ -747,7 +768,7 @@
       ;;
     *)
       # TODO: handle ubuntu?
-      >&2 echo Error: Need to install ruby ${MINIMUM_RUBY_VERSION}+
+      >&2 echo "Error: Need to install ruby ${MINIMUM_RUBY_VERSION}+"
       exit 1
   esac
 }
@@ -931,7 +952,7 @@
   local rnpsrc="$PWD"
   pushd "$(mktemp -d)" || return 1
 
-  # shellcheck disable=SC2046
+  # shellcheck disable=SC2046,SC2086
   gcc "${rnpsrc}/src/examples/generate.c" -ogenerate $(pkg-config --cflags 
--libs $pkgflags librnp) $gccflags
   ./generate
   readelf -d generate
diff -Nru rnp-0.16.2/debian/changelog rnp-0.16.3/debian/changelog
--- rnp-0.16.2/debian/changelog 2022-10-03 21:30:25.000000000 -0400
+++ rnp-0.16.3/debian/changelog 2023-05-24 09:06:07.000000000 -0400
@@ -1,3 +1,14 @@
+rnp (0.16.3-1) unstable; urgency=medium
+
+  * New upstream release, Closes: #1034558
+    - Fixes CVE-2023-29479
+    - Fixes CVE-2023-29480
+  * standards-version: bump to 4.6.2 (no changes needed)
+  * drop unnecessary lintian overrides
+  * d/copyright: include 2023
+
+ -- Daniel Kahn Gillmor <d...@fifthhorseman.net>  Wed, 24 May 2023 09:06:07 
-0400
+
 rnp (0.16.2-1) unstable; urgency=medium
 
   * New upstream release
diff -Nru rnp-0.16.2/debian/control rnp-0.16.3/debian/control
--- rnp-0.16.2/debian/control   2022-09-09 19:03:00.000000000 -0400
+++ rnp-0.16.3/debian/control   2023-05-24 09:06:07.000000000 -0400
@@ -15,7 +15,7 @@
  python3 <!nocheck>,
  python3-distutils <!nocheck>,
  zlib1g-dev,
-Standards-Version: 4.6.1
+Standards-Version: 4.6.2
 Vcs-Git: https://salsa.debian.org/debian/rnp.git
 Vcs-Browser: https://salsa.debian.org/debian/rnp
 Homepage: https://www.rnpgp.com/software/rnp/
diff -Nru rnp-0.16.2/debian/copyright rnp-0.16.3/debian/copyright
--- rnp-0.16.2/debian/copyright 2022-09-09 15:36:52.000000000 -0400
+++ rnp-0.16.3/debian/copyright 2023-05-24 09:06:07.000000000 -0400
@@ -5,7 +5,7 @@
 
 Files: *
 Copyright:
- 2017-2022, Ribose Inc.
+ 2017-2023, Ribose Inc.
  2009-2010, The NetBSD Foundation, Inc.
 License: BSD-2-clause
 
@@ -30,7 +30,7 @@
 
 Files: debian/*
 Copyright:
- 2021-2022 Daniel Kahn Gillmor <d...@fifthhorseman.net>
+ 2021-2023 Daniel Kahn Gillmor <d...@fifthhorseman.net>
 License: BSD-2-clause
 
 License: BSD-2-clause
diff -Nru rnp-0.16.2/debian/source/lintian-overrides 
rnp-0.16.3/debian/source/lintian-overrides
--- rnp-0.16.2/debian/source/lintian-overrides  2022-09-09 19:03:00.000000000 
-0400
+++ rnp-0.16.3/debian/source/lintian-overrides  2023-05-24 09:06:07.000000000 
-0400
@@ -1,5 +1,2 @@
-# These two files are OpenPGP packets that libmagic is confused about.
-rnp source: source-contains-prebuilt-windows-binary 
[src/tests/data/test_key_validity/case8/subkey-no-sig.pgp]
-rnp source: source-contains-prebuilt-windows-binary 
[src/tests/data/test_key_validity/case8/subkey.pgp]
 # these are test elements that are expected to be long:
 rnp source: very-long-line-length-in-source-file * > 512 [src/tests/data/*]
diff -Nru rnp-0.16.2/docs/installation.adoc rnp-0.16.3/docs/installation.adoc
--- rnp-0.16.2/docs/installation.adoc   2022-09-22 05:27:54.000000000 -0400
+++ rnp-0.16.3/docs/installation.adoc   2023-04-12 20:27:38.000000000 -0400
@@ -55,7 +55,7 @@
 [source,console]
 ----
 # Clone the repository by version tag (or omit it to get the latest sources)
-git clone https://github.com/rnpgp/rnp.git -b v0.16.2
+git clone https://github.com/rnpgp/rnp.git -b v0.16.3
 
 # Install required packages
 sudo apt install g++-8 cmake libbz2-dev zlib1g-dev libjson-c-dev \
@@ -91,7 +91,7 @@
 [source,console]
 ----
 # Clone the repository by version tag (or omit it to get the latest sources)
-git clone https://github.com/rnpgp/rnp.git -b v0.16.2
+git clone https://github.com/rnpgp/rnp.git -b v0.16.3
 
 # Enable access to `testing` packages by editing /etc/apt/sources.list
 # deb http://deb.debian.org/debian testing main
diff -Nru rnp-0.16.2/.github/workflows/macos.yml 
rnp-0.16.3/.github/workflows/macos.yml
--- rnp-0.16.2/.github/workflows/macos.yml      2022-09-22 05:27:54.000000000 
-0400
+++ rnp-0.16.3/.github/workflows/macos.yml      2023-04-12 20:27:38.000000000 
-0400
@@ -42,7 +42,7 @@
     strategy:
       fail-fast: false
       matrix:
-        os: [macos-10.15, macos-11.0]
+        os: [macos-11, macos-12]
         env:
           - CC: gcc
             CXX: g++
diff -Nru rnp-0.16.2/src/librepgp/stream-parse.cpp 
rnp-0.16.3/src/librepgp/stream-parse.cpp
--- rnp-0.16.2/src/librepgp/stream-parse.cpp    2022-09-22 05:27:54.000000000 
-0400
+++ rnp-0.16.3/src/librepgp/stream-parse.cpp    2023-04-12 20:27:38.000000000 
-0400
@@ -1919,9 +1919,10 @@
     int ptype;
     /* Reading pk/sk encrypted session key(s) */
     try {
-        bool stop = false;
+        size_t errors = 0;
+        bool   stop = false;
         while (!stop) {
-            if (param->pubencs.size() + param->symencs.size() > 
MAX_RECIPIENTS) {
+            if (param->pubencs.size() + param->symencs.size() + errors > 
MAX_RECIPIENTS) {
                 RNP_LOG("Too many recipients of the encrypted message. 
Aborting.");
                 return RNP_ERROR_BAD_STATE;
             }
@@ -1935,8 +1936,13 @@
             case PGP_PKT_SK_SESSION_KEY: {
                 pgp_sk_sesskey_t skey;
                 rnp_result_t     ret = skey.parse(*param->pkt.readsrc);
+                if (ret == RNP_ERROR_READ) {
+                    RNP_LOG("SKESK: Premature end of data.");
+                    return ret;
+                }
                 if (ret) {
                     RNP_LOG("Failed to parse SKESK, skipping.");
+                    errors++;
                     continue;
                 }
                 param->symencs.push_back(skey);
@@ -1945,8 +1951,13 @@
             case PGP_PKT_PK_SESSION_KEY: {
                 pgp_pk_sesskey_t pkey;
                 rnp_result_t     ret = pkey.parse(*param->pkt.readsrc);
+                if (ret == RNP_ERROR_READ) {
+                    RNP_LOG("PKESK: Premature end of data.");
+                    return ret;
+                }
                 if (ret) {
                     RNP_LOG("Failed to parse PKESK, skipping.");
+                    errors++;
                     continue;
                 }
                 param->pubencs.push_back(pkey);
diff -Nru rnp-0.16.2/src/librepgp/stream-write.cpp 
rnp-0.16.3/src/librepgp/stream-write.cpp
--- rnp-0.16.2/src/librepgp/stream-write.cpp    2022-09-22 05:27:54.000000000 
-0400
+++ rnp-0.16.3/src/librepgp/stream-write.cpp    2023-04-12 20:27:38.000000000 
-0400
@@ -1126,7 +1126,7 @@
     }
 
     /* decrypt the secret key if needed */
-    rnp::KeyLocker(*signer.key);
+    rnp::KeyLocker keylock(*signer.key);
     if (signer.key->encrypted() &&
         !signer.key->unlock(*param.password_provider, PGP_OP_SIGN)) {
         RNP_LOG("wrong secret key password");
diff -Nru rnp-0.16.2/src/tests/CMakeLists.txt 
rnp-0.16.3/src/tests/CMakeLists.txt
--- rnp-0.16.2/src/tests/CMakeLists.txt 2022-09-22 05:27:54.000000000 -0400
+++ rnp-0.16.3/src/tests/CMakeLists.txt 2023-04-12 20:27:38.000000000 -0400
@@ -222,11 +222,11 @@
     GIT_SHALLOW yes
     SOURCE_DIR "${_sourcedir}"
     BUILD_IN_SOURCE yes
-    CONFIGURE_COMMAND ""
+    CONFIGURE_COMMAND bundle config set --local path '.'
     BUILD_COMMAND
       COMMAND bundle add ffi --version 1.15.5
       COMMAND bundle show parallel_tests || bundle add parallel_tests
-      COMMAND bundle install --path .
+      COMMAND bundle install
     INSTALL_COMMAND ""
     TEST_COMMAND ""
   )
diff -Nru rnp-0.16.2/src/tests/ffi-enc.cpp rnp-0.16.3/src/tests/ffi-enc.cpp
--- rnp-0.16.2/src/tests/ffi-enc.cpp    2022-09-22 05:27:54.000000000 -0400
+++ rnp-0.16.3/src/tests/ffi-enc.cpp    2023-04-12 20:27:38.000000000 -0400
@@ -670,6 +670,28 @@
     // make sure the output file was created
     assert_true(rnp_file_exists("encrypted"));
 
+    // check whether keys are locked
+    rnp_identifier_iterator_t it = NULL;
+    assert_rnp_success(rnp_identifier_iterator_create(ffi, &it, 
"fingerprint"));
+    const char *fprint = NULL;
+    while (!rnp_identifier_iterator_next(it, &fprint)) {
+        if (!fprint) {
+            break;
+        }
+        SCOPED_TRACE(fprint);
+        rnp_key_handle_t skey = NULL;
+        assert_rnp_success(rnp_locate_key(ffi, "fingerprint", fprint, &skey));
+        bool secret = true;
+        assert_rnp_success(rnp_key_have_secret(skey, &secret));
+        if (secret) {
+            bool locked = false;
+            assert_rnp_success(rnp_key_is_locked(skey, &locked));
+            assert_true(locked);
+        }
+        rnp_key_handle_destroy(skey);
+    }
+    rnp_identifier_iterator_destroy(it);
+
     // cleanup
     assert_rnp_success(rnp_input_destroy(input));
     input = NULL;
@@ -762,6 +784,25 @@
     assert_string_equal(hname, "SHA512");
     rnp_buffer_destroy(hname);
     hname = NULL;
+    // make sure keys are locked
+    assert_rnp_success(rnp_identifier_iterator_create(ffi, &it, 
"fingerprint"));
+    while (!rnp_identifier_iterator_next(it, &fprint)) {
+        if (!fprint) {
+            break;
+        }
+        SCOPED_TRACE(fprint);
+        rnp_key_handle_t skey = NULL;
+        assert_rnp_success(rnp_locate_key(ffi, "fingerprint", fprint, &skey));
+        bool secret = true;
+        assert_rnp_success(rnp_key_have_secret(skey, &secret));
+        if (secret) {
+            bool locked = false;
+            assert_rnp_success(rnp_key_is_locked(skey, &locked));
+            assert_true(locked);
+        }
+        rnp_key_handle_destroy(skey);
+    }
+    rnp_identifier_iterator_destroy(it);
     // cleanup
     rnp_op_verify_destroy(verify);
     rnp_input_destroy(input);
diff -Nru rnp-0.16.2/version.txt rnp-0.16.3/version.txt
--- rnp-0.16.2/version.txt      2022-09-22 05:27:54.000000000 -0400
+++ rnp-0.16.3/version.txt      2023-04-12 20:27:38.000000000 -0400
@@ -1 +1 @@
-0.16.2
+0.16.3

Reply via email to