Package: release.debian.org
Severity: normal
Tags: trixie
X-Debbugs-Cc: [email protected]
Control: affects -1 + src:lrzsz
User: [email protected]
Usertags: pu

[ Reason ]
Fix CVE-2026-105840 and CVE-2026-105842 (see #1150240).

[ Impact ]
Users are vulnerable to the two bugs.

[ Tests ]
Just compile-tested.

[ Risks ]
Two more checks and two additional NUL bytes. Pretty trivial, so not
very risky.

[ 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 (old)stable
  [x] the issue is verified as fixed in unstable

[ Changes ]
Include two upstream patches to address the two CVEs.

[ Other info ]
The maintainer agreed to this stable update request at #1150240.
diff -Nru lrzsz-0.12.21rc/debian/changelog lrzsz-0.12.21rc/debian/changelog
--- lrzsz-0.12.21rc/debian/changelog    2025-01-01 13:16:48.000000000 +0100
+++ lrzsz-0.12.21rc/debian/changelog    2026-10-11 23:22:00.000000000 +0200
@@ -1,3 +1,14 @@
+lrzsz (0.12.21rc-0.2+deb13u1) trixie; urgency=medium
+
+  * CVE-2026-105840, 01-rz-reject-absolute-paths.diff:
+    reject sender-supplied absolute paths in rz restricted mode.
+  * CVE-2026-105842, 02-rz-terminate-received-strings.diff:
+    reject over-length received file names,
+    fixing an out-of-bounds read and a one-byte heap overwrite on
+    maximum-length ZFILE names; also terminate the receiver buffer.
+
+ -- Bastian Germann <[email protected]>  Sun, 11 Oct 2026 23:22:00 +0200
+
 lrzsz (0.12.21rc-0.2) unstable; urgency=medium
 
   * Non-maintainer upload.
diff -Nru lrzsz-0.12.21rc/debian/patches/01-rz-reject-absolute-paths.diff 
lrzsz-0.12.21rc/debian/patches/01-rz-reject-absolute-paths.diff
--- lrzsz-0.12.21rc/debian/patches/01-rz-reject-absolute-paths.diff     
1970-01-01 01:00:00.000000000 +0100
+++ lrzsz-0.12.21rc/debian/patches/01-rz-reject-absolute-paths.diff     
2026-10-11 23:20:12.000000000 +0200
@@ -0,0 +1,18 @@
+Description: rz: reject absolute pathnames in restricted mode
+ Without PUBDIR (the Debian default build) checkpath() only rejected the
+ literal "../" and accepted sender-supplied absolute pathnames, so a remote
+ sender could create files and directories at any receiver-writable absolute
+ path. Reject a leading '/' when no PUBDIR is configured, restoring the
+ restricted-mode behaviour that rz(1) documents.
+Forwarded: no
+--- fixed.orig/src/lrz.c
++++ fixed/src/lrz.c
+@@ -1629,6 +1629,8 @@ checkpath(const char *name)
+ #ifdef PUBDIR
+                || (name[0]== '/' && strncmp(name, PUBDIR, 
+                       strlen(PUBDIR)))
++#else
++               || (name[0] == '/')
+ #endif
+               ) {
+                       canit(STDOUT_FILENO);
diff -Nru lrzsz-0.12.21rc/debian/patches/02-rz-terminate-received-strings.diff 
lrzsz-0.12.21rc/debian/patches/02-rz-terminate-received-strings.diff
--- lrzsz-0.12.21rc/debian/patches/02-rz-terminate-received-strings.diff        
1970-01-01 01:00:00.000000000 +0100
+++ lrzsz-0.12.21rc/debian/patches/02-rz-terminate-received-strings.diff        
2026-10-11 23:20:12.000000000 +0200
@@ -0,0 +1,45 @@
+Description: rz: bound received file name length and terminate data subpackets
+ zrdata()/zrdat32() left the receive buffer unterminated, and procheader() then
+ read the name with strlen() and parsed trailing attributes at
+ name + 1 + strlen(name). A maximum-length ZFILE name without a NUL byte caused
+ an out-of-bounds read, and copying such a name into the PATH_MAX*2 Pathname
+ buffer overran it by one byte. Terminate the buffer after the payload, and
+ reject names of PATH_MAX or longer in procheader(): on this platform PATH_MAX
+ (4096) is below the receive buffer size, so the bound keeps both the attribute
+ parsing and the Pathname copy inside their buffers, and such names cannot name
+ a file anyway.
+Forwarded: no
+--- fixed.orig/src/zm.c
++++ fixed/src/zm.c
+@@ -576,6 +576,7 @@ crcfoo:
+                                               return ERROR;
+                                       }
+                                       *bytes_received = length - (end - buf);
++                                      *buf = '\0';    /* terminate: name/attn 
parsed as C string */
+                                       COUNT_BLK(*bytes_received);
+                                       VPRINTF(3,("zrdata: %lu  %s", (unsigned 
long) (*bytes_received), 
+                                                       
Zendnames[(d-GOTCRCE)&3]));
+@@ -636,6 +637,7 @@ crcfoo:
+                                       return ERROR;
+                               }
+                               *bytes_received = length - (end - buf);
++                              *buf = '\0';    /* terminate: name/attn parsed 
as C string */
+                               COUNT_BLK(*bytes_received);
+                               VPRINTF(3,("zrdat32: %lu %s", (unsigned long) 
*bytes_received, 
+                                       Zendnames[(d-GOTCRCE)&3]));
+--- fixed.orig/src/lrz.c
++++ fixed/src/lrz.c
+@@ -1141,6 +1141,13 @@ procheader(char *name, struct zm_fileinf
+                       name=p;
+               }
+       }
++      if (strlen(name) >= PATH_MAX) {
++              /* over-long names cannot open and would overrun 
nameend/Pathname */
++              if (Verbose) {
++                      vstringf(_("file name too long, skipped: %s\n"), name);
++              }
++              return ERROR;
++      }
+       name_static=malloc(strlen(name)+1);
+       if (!name_static)
+               error(1,0,_("out of memory"));
diff -Nru lrzsz-0.12.21rc/debian/patches/series 
lrzsz-0.12.21rc/debian/patches/series
--- lrzsz-0.12.21rc/debian/patches/series       2024-09-13 08:57:20.000000000 
+0200
+++ lrzsz-0.12.21rc/debian/patches/series       2026-10-11 23:20:37.000000000 
+0200
@@ -13,3 +13,5 @@
 ansi2knr.diff
 gettext_external.diff
 ignore-intl.diff
+01-rz-reject-absolute-paths.diff
+02-rz-terminate-received-strings.diff

Reply via email to