Version in base suite: 1.6.16+dfsg-0+deb13u1 Version in overlay suite: 1.6.17+dfsg-0+deb13u1 Base version: roundcube_1.6.17+dfsg-0+deb13u1 Target version: roundcube_1.6.18+dfsg-0+deb13u1 Base file: /srv/ftp-master.debian.org/ftp/pool/main/r/roundcube/roundcube_1.6.17+dfsg-0+deb13u1.dsc Target file: /srv/ftp-master.debian.org/policy/pool/main/r/roundcube/roundcube_1.6.18+dfsg-0+deb13u1.dsc CHANGELOG.md | 16 ++ debian/changelog | 29 +++ debian/patches/Avoid-dependency-on-new-package-mlocati-ip-lib.patch | 17 +- debian/patches/Fix-FTBFS-with-phpunit-11.patch | 76 +++++----- debian/patches/Fix-PHP-Warning-Undefined-variable-tmp_command-in-.-plugi.patch | 40 +++++ debian/patches/series | 1 plugins/managesieve/lib/Roundcube/rcube_sieve_script.php | 2 plugins/markasjunk/drivers/cmd_learn.php | 24 +-- plugins/password/config.inc.php.dist | 11 + plugins/password/drivers/modoboa.php | 22 +- plugins/password/drivers/zxcvbn.php | 2 program/actions/mail/addcontact.php | 2 program/actions/mail/search.php | 2 program/actions/utils/modcss.php | 18 ++ program/lib/Roundcube/rcube_ldap.php | 5 program/lib/Roundcube/rcube_tnef_decoder.php | 20 ++ program/lib/Roundcube/rcube_utils.php | 11 + program/lib/Roundcube/rcube_washtml.php | 4 public_html/plugins/managesieve/lib/Roundcube/rcube_sieve_script.php | 2 public_html/plugins/markasjunk/drivers/cmd_learn.php | 24 +-- public_html/plugins/password/config.inc.php.dist | 11 + public_html/plugins/password/drivers/modoboa.php | 22 +- public_html/plugins/password/drivers/zxcvbn.php | 2 tests/Framework/TnefDecoder.php | 36 ++++ tests/Framework/Utils.php | 8 + tests/Framework/Washtml.php | 8 + 26 files changed, 317 insertions(+), 98 deletions(-) dpkg-source: warning: cannot verify inline signature for /srv/release.debian.org/tmp/tmp037pr1ph/roundcube_1.6.17+dfsg-0+deb13u1.dsc: no acceptable signature found dpkg-source: warning: cannot verify inline signature for /srv/release.debian.org/tmp/tmp037pr1ph/roundcube_1.6.18+dfsg-0+deb13u1.dsc: no acceptable signature found diff -Nru roundcube-1.6.17+dfsg/CHANGELOG.md roundcube-1.6.18+dfsg/CHANGELOG.md --- roundcube-1.6.17+dfsg/CHANGELOG.md 2026-07-05 10:42:51.000000000 +0000 +++ roundcube-1.6.18+dfsg/CHANGELOG.md 2026-08-09 07:48:13.000000000 +0000 @@ -2,6 +2,22 @@ ## Unreleased +- Password: Fix fatal error "Class 'Zxcvbn' not found" (#10274) +- Fix out-of-bounds string reads on truncated compressed-RTF in the TNEF decoder (#10269) +- Security: Add basic validation for content proxied by the css proxy +- Security: Fix SSRF bypass via specific local address URLs using 100.64.0.0/10 and fe80::/10 nets +- Security: Fix SSRF filter bypass via various forms of nip.io/sslip.io hostnames evading is_local_url() check +- Security: Fix remote content blocking bypass via unclosed url() in a FuncIRI attribute +- Security: Fix LDAP filter injection via unescaped %u/%fu/%d substitution into the `search_filter` +- Security: Fix arbitrary Sieve script injection via a filter rule name bypassing `managesieve_disabled_actions` +- Security: Fix RCE via `cmd_learn` driver of markasjunk plugin +- Security: Fix IMAP command injection via mail search and LITERAL+ byte-count desynchronization +- Security: Fix password's modoboa driver leak of an authentication token to a user-controlled host +- Security: Fix stored XSS in "Add to address book" action +- Security: Fix HTML/CSS sanitization bypass via SVG animate `by` attribute + +## Release 1.6.17 + - Enigma: Support automatic public key lookup (import) using HKP v1 protocol (#5314) - Enigma: Kolab WOAT Support (#8626) - Security: Fix an infinite loop in TNEF (winmail.dat) decoder (#10193) diff -Nru roundcube-1.6.17+dfsg/debian/changelog roundcube-1.6.18+dfsg/debian/changelog --- roundcube-1.6.17+dfsg/debian/changelog 2026-07-08 10:46:28.000000000 +0000 +++ roundcube-1.6.18+dfsg/debian/changelog 2026-08-10 13:45:10.000000000 +0000 @@ -1,3 +1,32 @@ +roundcube (1.6.18+dfsg-0+deb13u1) trixie-security; urgency=high + + * New upstream security and bugfix release (closes: #1144059). + + Fix CVE-2026-74998: Content proxied by the css proxy is not validated + validation. + + Fix CVE-2026-75006: SSRF bypass via specific local address URLs using + 100.64.0.0/10 and fe80::/10 subnets. + + Fix CVE-2026-75006: SSRF filter bypass via various forms of + nip.io/sslip.io hostnames evading `is_local_url()` check. + + Fix CVE-2026-75003: Remote content blocking bypass via unclosed `url()` + in a FuncIRI attribute. + + Fix CVE-2026-75007: LDAP filter injection via unescaped %u/%fu/%d + substitution into the `search_filter`. + + Fix CVE-2026-75004: Arbitrary sieve script injection via a filter rule + name bypassing `managesieve_disabled_actions`. + + Fix CVE-2026-74997: RCE in the `cmd_learn` driver of markasjunk plugin. + + Fix CVE-2026-75002: IMAP command injection via mail search and LITERAL+ + byte-count desynchronization. + + Fix CVE-2026-75010: The modoboa driver of the passwd plugin leaks an + authentication token to a user-controlled host. + + Fix CVE-2026-74999: Stored XSS in "Add to address book" action. + + Fix CVE-2026-75000: HTML/CSS sanitization bypass via SVG animate `by` + attribute. + * Refresh d/patches. + * Cherry-pick follow-up change to fix PHP warning in markasjunk's + cmd_learn.php. + + -- Guilhem Moulin Mon, 10 Aug 2026 15:45:10 +0200 + roundcube (1.6.17+dfsg-0+deb13u1) trixie-security; urgency=high * New upstream security and bugfix release (closes: #1141495). diff -Nru roundcube-1.6.17+dfsg/debian/patches/Avoid-dependency-on-new-package-mlocati-ip-lib.patch roundcube-1.6.18+dfsg/debian/patches/Avoid-dependency-on-new-package-mlocati-ip-lib.patch --- roundcube-1.6.17+dfsg/debian/patches/Avoid-dependency-on-new-package-mlocati-ip-lib.patch 2026-07-08 10:46:28.000000000 +0000 +++ roundcube-1.6.18+dfsg/debian/patches/Avoid-dependency-on-new-package-mlocati-ip-lib.patch 2026-08-10 13:45:10.000000000 +0000 @@ -11,9 +11,9 @@ Forwarded: not-needed --- composer.json-dist | 3 +- - program/lib/Roundcube/rcube_utils.php | 160 +++++++++++++++++++++++++++++----- + program/lib/Roundcube/rcube_utils.php | 164 +++++++++++++++++++++++++++++----- tests/Framework/Utils.php | 85 ++++++++++++++++++ - 3 files changed, 224 insertions(+), 24 deletions(-) + 3 files changed, 226 insertions(+), 26 deletions(-) diff --git a/composer.json-dist b/composer.json-dist index 1807004..ca3de26 100644 @@ -30,7 +30,7 @@ "require-dev": { "phpunit/phpunit": "^9" diff --git a/program/lib/Roundcube/rcube_utils.php b/program/lib/Roundcube/rcube_utils.php -index 8a3d1e9..6c3d04a 100644 +index 673ce69..0c2e293 100644 --- a/program/lib/Roundcube/rcube_utils.php +++ b/program/lib/Roundcube/rcube_utils.php @@ -1,8 +1,5 @@ @@ -159,7 +159,7 @@ /** * Check if an URL point to a local network location. * -@@ -434,37 +541,46 @@ class rcube_utils +@@ -434,14 +541,9 @@ class rcube_utils $host = parse_url($url, \PHP_URL_HOST); if (is_string($host)) { @@ -175,7 +175,8 @@ $host = preg_replace('/^[0:]*:ffff:/i', '', $host); if (preg_match('/([0-9a-f.-]+)\.(nip|sslip)\.io$/i', $host, $matches)) { - $host = trim($matches[1], '-.'); +@@ -455,25 +557,39 @@ class rcube_utils + } } + if (strpos($host, ':') !== false && ($n = strpos($host, '%')) > 0) { @@ -193,8 +194,10 @@ - '172.16.0.0/12', // RFC1918 - '192.168.0.0/16', // RFC1918 - '169.254.0.0/16', // link-local / cloud metadata +- '100.64.0.0/10', // RFC6598: Shared Address Space (carrier-grade NAT) - '::1/128', - 'fc00::/7', +- 'fe80::/10', // IPv6 link-local + if (is_string($address = \rcube_utils::inet_pton2($host))) { + $nets = [ + ['0.0.0.0', '0.0.0.0'], @@ -203,6 +206,7 @@ + ['172.16.0.0', '172.31.255.255'], // RFC1918 + ['192.168.0.0', '192.168.255.255'], // RFC1918 + ['169.254.0.0', '169.254.255.255'], // link-local / cloud metadata ++ ['100.64.0.0', '100.127.255.255'], // RFC6598: Shared Address Space (carrier-grade NAT) ]; + if (defined('AF_INET6')) { + /* IPv4-compatible and IPv4-mapped IPv6 addresses (RFC4291 2.5.5) */ @@ -213,6 +217,7 @@ + } + $nets[] = ['::1', '::1']; + $nets[] = ['fc00::', 'fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff']; ++ $nets[] = ['fe80::', 'febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff']; + } - foreach ($nets as $net) { @@ -226,7 +231,7 @@ } } diff --git a/tests/Framework/Utils.php b/tests/Framework/Utils.php -index 90d8e03..9ad6989 100644 +index 4b8e584..8c69f72 100644 --- a/tests/Framework/Utils.php +++ b/tests/Framework/Utils.php @@ -571,6 +571,86 @@ class Framework_Utils extends TestCase diff -Nru roundcube-1.6.17+dfsg/debian/patches/Fix-FTBFS-with-phpunit-11.patch roundcube-1.6.18+dfsg/debian/patches/Fix-FTBFS-with-phpunit-11.patch --- roundcube-1.6.17+dfsg/debian/patches/Fix-FTBFS-with-phpunit-11.patch 2026-07-08 10:46:28.000000000 +0000 +++ roundcube-1.6.18+dfsg/debian/patches/Fix-FTBFS-with-phpunit-11.patch 2026-08-10 13:45:10.000000000 +0000 @@ -9829,7 +9829,7 @@ $this->assertEquals($expected, $html); diff --git a/tests/Framework/TnefDecoder.php b/tests/Framework/TnefDecoder.php -index f895172..ec5b244 100644 +index 8fb9632..6fec023 100644 --- a/tests/Framework/TnefDecoder.php +++ b/tests/Framework/TnefDecoder.php @@ -1,11 +1,13 @@ @@ -9876,7 +9876,7 @@ $result = $tnef->decompress($body, true); $this->assertCount(0, $result['attachments']); -@@ -84,7 +86,7 @@ class Framework_TnefDecoder extends PHPUnit\Framework\TestCase +@@ -120,7 +122,7 @@ class Framework_TnefDecoder extends PHPUnit\Framework\TestCase function test_rtf2text() { $body = file_get_contents(TESTS_DIR . 'src/sample.rtf'); @@ -9996,7 +9996,7 @@ $idents = $user->list_identities(); diff --git a/tests/Framework/Utils.php b/tests/Framework/Utils.php -index 8ac3a92..90d8e03 100644 +index 4cec5ab..4b8e584 100644 --- a/tests/Framework/Utils.php +++ b/tests/Framework/Utils.php @@ -1,11 +1,15 @@ @@ -10371,7 +10371,7 @@ $this->assertSame($v[2], $result); } } -@@ -633,7 +643,7 @@ class Framework_Utils extends PHPUnit\Framework\TestCase +@@ -641,7 +651,7 @@ class Framework_Utils extends PHPUnit\Framework\TestCase ]; foreach ($test as $datetime => $ts) { @@ -10380,7 +10380,7 @@ $this->assertSame($ts, $result, "Error parsing date: $datetime"); } } -@@ -660,7 +670,7 @@ class Framework_Utils extends PHPUnit\Framework\TestCase +@@ -668,7 +678,7 @@ class Framework_Utils extends PHPUnit\Framework\TestCase ]; foreach ($test as $datetime => $ts) { @@ -10389,7 +10389,7 @@ $this->assertSame($ts, $result ? $result->format('Y-m-d') : false, "Error parsing date: $datetime"); } -@@ -670,7 +680,7 @@ class Framework_Utils extends PHPUnit\Framework\TestCase +@@ -678,7 +688,7 @@ class Framework_Utils extends PHPUnit\Framework\TestCase ]; foreach ($test as $datetime => $ts) { @@ -10398,7 +10398,7 @@ $this->assertSame($ts, $result ? $result->format('Y-m-d H:i:s') : false, "Error parsing date: $datetime"); } -@@ -679,7 +689,7 @@ class Framework_Utils extends PHPUnit\Framework\TestCase +@@ -687,7 +697,7 @@ class Framework_Utils extends PHPUnit\Framework\TestCase ]; foreach ($test as $datetime => $ts) { @@ -10407,7 +10407,7 @@ $this->assertSame($ts, $result ? $result->format('Y-m-d H:i:s O') : false, "Error parsing date: $datetime"); } } -@@ -689,17 +699,17 @@ class Framework_Utils extends PHPUnit\Framework\TestCase +@@ -697,17 +707,17 @@ class Framework_Utils extends PHPUnit\Framework\TestCase */ function test_anytodatetime_timezone() { @@ -10428,7 +10428,7 @@ if ($result) $result->setTimezone($tz); // move to target timezone for comparison $this->assertSame($ts, $result ? $result->format('Y-m-d H:i') : false, "Error parsing date: $datetime"); } -@@ -718,7 +728,7 @@ class Framework_Utils extends PHPUnit\Framework\TestCase +@@ -726,7 +736,7 @@ class Framework_Utils extends PHPUnit\Framework\TestCase ]; foreach ($test as $data) { @@ -10437,7 +10437,7 @@ $this->assertSame($data[2], $result, "Error formatting date: " . $data[0]); } } -@@ -737,7 +747,7 @@ class Framework_Utils extends PHPUnit\Framework\TestCase +@@ -745,7 +755,7 @@ class Framework_Utils extends PHPUnit\Framework\TestCase ]; foreach ($test as $input => $output) { @@ -10446,7 +10446,7 @@ $this->assertSame($output, $result); } } -@@ -762,7 +772,7 @@ class Framework_Utils extends PHPUnit\Framework\TestCase +@@ -770,7 +780,7 @@ class Framework_Utils extends PHPUnit\Framework\TestCase ]; foreach ($test as $input => $output) { @@ -10455,7 +10455,7 @@ $this->assertSame($output, $result, "Error normalizing '$input'"); } } -@@ -785,7 +795,7 @@ class Framework_Utils extends PHPUnit\Framework\TestCase +@@ -793,7 +803,7 @@ class Framework_Utils extends PHPUnit\Framework\TestCase ]; foreach ($test as $idx => $params) { @@ -10464,7 +10464,7 @@ $this->assertSame($params[2], $result, "words_match() at index $idx"); } } -@@ -811,7 +821,7 @@ class Framework_Utils extends PHPUnit\Framework\TestCase +@@ -819,7 +829,7 @@ class Framework_Utils extends PHPUnit\Framework\TestCase } foreach ($test as $input => $output) { @@ -10473,7 +10473,7 @@ $this->assertSame($output, $result); } } -@@ -821,17 +831,17 @@ class Framework_Utils extends PHPUnit\Framework\TestCase +@@ -829,17 +839,17 @@ class Framework_Utils extends PHPUnit\Framework\TestCase */ function test_random_bytes() { @@ -10497,7 +10497,7 @@ { /* -@@ -868,9 +878,10 @@ class Framework_Utils extends PHPUnit\Framework\TestCase +@@ -876,9 +886,10 @@ class Framework_Utils extends PHPUnit\Framework\TestCase * @param string $encoded Encoded email address * @dataProvider data_idn_convert */ @@ -10509,7 +10509,7 @@ } /** -@@ -880,9 +891,10 @@ class Framework_Utils extends PHPUnit\Framework\TestCase +@@ -888,9 +899,10 @@ class Framework_Utils extends PHPUnit\Framework\TestCase * @param string $encoded Encoded email address * @dataProvider data_idn_convert */ @@ -10521,7 +10521,7 @@ } /** -@@ -890,14 +902,14 @@ class Framework_Utils extends PHPUnit\Framework\TestCase +@@ -898,14 +910,14 @@ class Framework_Utils extends PHPUnit\Framework\TestCase */ function test_idn_to_ascii_special() { @@ -10539,7 +10539,7 @@ { return [ ['%z', 'hostname', 'hostname'], -@@ -912,15 +924,16 @@ class Framework_Utils extends PHPUnit\Framework\TestCase +@@ -920,15 +932,16 @@ class Framework_Utils extends PHPUnit\Framework\TestCase * * @dataProvider data_parse_host */ @@ -10558,7 +10558,7 @@ { return [ [['hostname', null, null], ['hostname', null, null]], -@@ -943,15 +956,16 @@ class Framework_Utils extends PHPUnit\Framework\TestCase +@@ -951,15 +964,16 @@ class Framework_Utils extends PHPUnit\Framework\TestCase * * @dataProvider data_parse_host_uri */ @@ -10577,7 +10577,7 @@ return [ ['both', 'Fwd: Re: Test subject both', 'Test subject both'], ['both', 'Re: Fwd: Test subject both', 'Test subject both'], -@@ -969,8 +983,9 @@ class Framework_Utils extends PHPUnit\Framework\TestCase +@@ -977,8 +991,9 @@ class Framework_Utils extends PHPUnit\Framework\TestCase * * @dataProvider data_remove_subject_prefix */ @@ -10588,7 +10588,7 @@ } /** -@@ -978,13 +993,13 @@ class Framework_Utils extends PHPUnit\Framework\TestCase +@@ -986,13 +1001,13 @@ class Framework_Utils extends PHPUnit\Framework\TestCase */ function test_server_name() { @@ -10605,7 +10605,7 @@ } /** -@@ -994,31 +1009,31 @@ class Framework_Utils extends PHPUnit\Framework\TestCase +@@ -1002,31 +1017,31 @@ class Framework_Utils extends PHPUnit\Framework\TestCase { $_SERVER['test'] = 'test.com'; @@ -10804,7 +10804,7 @@ $this->assertSame($result, "BEGIN:VCARD\r\nVERSION:3.0\r\nFN:\r\nN:;;;;\r\nEND:VCARD"); diff --git a/tests/Framework/Washtml.php b/tests/Framework/Washtml.php -index 7d524f4..770ef3a 100644 +index 6b2d026..90b680e 100644 --- a/tests/Framework/Washtml.php +++ b/tests/Framework/Washtml.php @@ -1,11 +1,14 @@ @@ -11005,7 +11005,7 @@ { $svg1 = ""; -@@ -545,9 +548,10 @@ class Framework_Washtml extends PHPUnit\Framework\TestCase +@@ -553,9 +556,10 @@ class Framework_Washtml extends PHPUnit\Framework\TestCase * * @dataProvider data_wash_svg_tests */ @@ -11017,7 +11017,7 @@ $washed = $washer->wash($input); $this->assertSame($expected, $this->cleanupResult($washed), "SVG content"); -@@ -556,7 +560,7 @@ class Framework_Washtml extends PHPUnit\Framework\TestCase +@@ -564,7 +568,7 @@ class Framework_Washtml extends PHPUnit\Framework\TestCase /** * Test cases for various XSS issues */ @@ -11026,7 +11026,7 @@ { return [ [ -@@ -611,9 +615,10 @@ class Framework_Washtml extends PHPUnit\Framework\TestCase +@@ -619,9 +623,10 @@ class Framework_Washtml extends PHPUnit\Framework\TestCase * * @dataProvider data_wash_xss_tests */ @@ -11038,7 +11038,7 @@ $washed = $washer->wash($input); $this->assertSame($expected, $this->cleanupResult($washed), "XSS issues"); -@@ -627,7 +632,7 @@ class Framework_Washtml extends PHPUnit\Framework\TestCase +@@ -635,7 +640,7 @@ class Framework_Washtml extends PHPUnit\Framework\TestCase $html = ""; $exp = ""; @@ -11047,7 +11047,7 @@ $washed = $washer->wash($html); $this->assertTrue(strpos($washed, $exp) !== false, "Position:fixed (#5264)"); -@@ -671,7 +676,7 @@ class Framework_Washtml extends PHPUnit\Framework\TestCase +@@ -679,7 +684,7 @@ class Framework_Washtml extends PHPUnit\Framework\TestCase I_D = \frac{1}{2} k_n \frac{W}{L} (V_{GS}-V_t)^2 '; @@ -11056,7 +11056,7 @@ $washed = $washer->wash($mathml); // remove whitespace between tags -@@ -688,7 +693,7 @@ class Framework_Washtml extends PHPUnit\Framework\TestCase +@@ -696,7 +701,7 @@ class Framework_Washtml extends PHPUnit\Framework\TestCase { $html = ""; @@ -11065,7 +11065,7 @@ $washed = $washer->wash($html); $this->assertTrue($washer->extlinks); -@@ -696,7 +701,7 @@ class Framework_Washtml extends PHPUnit\Framework\TestCase +@@ -704,7 +709,7 @@ class Framework_Washtml extends PHPUnit\Framework\TestCase $html = "