Package: release.debian.org
Severity: normal
Tags: bookworm
X-Debbugs-Cc: python-aiosm...@packages.debian.org, d...@dalerichards.net
Control: affects -1 + src:python-aiosmtpd
User: release.debian....@packages.debian.org
Usertags: pu

[ Reason ]
This update resolves two security vulnerabilities present in
the version of python-aiosmtpd in Bookworm (1.4.3-1.1):

  * CVE-2024-27305 - SMTP smuggling due to poor handling of
    non-standard line endings (Bug: #1066820)
  * CVE-2024-34083 - STARTTLS unencrypted command injection
    (Bug: #1072119)

These have both been deemed unworthy of a DSA, but the
Security Team have suggested we update this package for the
next Bookworm point release.

[ Impact ]
Without this update, Debian 12 systems running aiosmtpd would
remain vulnerable to the two CVEs listed above.

[ Tests ]
The upstream package includes a comprehensive suite of tests,
all of which are passing with this new version. Additionally,
I have installed the new package on a Bookworm test box and
performed manual testing, confirming that the package's main
functionality works and that the two vulnerabilties are
correctly resolved.

[ Risks ]
The code changes are minor, and bring aiosmtpd into compliance
with the relevant sections of RFC 3207[1] and RFC 5321[2].
The update can therefore be considered low risk, and will not
cause an issue with any RFC-compliant SMTP client or MTA.

[ 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 ]
  * CVE-2024-27305 - Patch aiosmtpd/smtp.py to accept only <CRLF>
    as a line terminator, as mandated by RFC 5321[2]. This patch
    has been adapted from the fix committed upstream[3].
  * CVE-2024-34083 - Patch aiosmtpd/smtp.py to discard any
    remaining unencrypted data in the input buffer upon completion
    of a STARTTLS handshake, as mandated by RFC 3207[1]. This patch
    has been adapted from the fix committed upstream[4].

[ Other info ]

References:

[1] https://datatracker.ietf.org/doc/html/rfc3207#page-7
[2] https://datatracker.ietf.org/doc/html/rfc5321#section-2.3.8
[3] https://github.com/aio-
libs/aiosmtpd/commit/24b6c79c8921cf1800e27ca144f4f37023982bbb
[4] https://github.com/aio-
libs/aiosmtpd/commit/b3a4a2c6ecfd228856a20d637dc383541fcdbfda
diff -Nru python-aiosmtpd-1.4.3/debian/changelog 
python-aiosmtpd-1.4.3/debian/changelog
--- python-aiosmtpd-1.4.3/debian/changelog      2023-05-25 15:09:53.000000000 
+0100
+++ python-aiosmtpd-1.4.3/debian/changelog      2024-06-07 18:11:07.000000000 
+0100
@@ -1,3 +1,13 @@
+python-aiosmtpd (1.4.3-1.1+deb12u1) bookworm; urgency=medium
+
+  * Team upload.
+  * CVE-2024-27305 - SMTP smuggling due to poor handling of
+    non-standard line endings (Closes: #1066820)
+  * CVE-2024-34083 - STARTTLS unencrypted command injection
+      (Closes: #1072119)
+
+ -- Dale Richards <d...@dalerichards.net>  Fri, 07 Jun 2024 18:11:07 +0100
+
 python-aiosmtpd (1.4.3-1.1) unstable; urgency=medium
 
   * Non-maintainer upload.
diff -Nru python-aiosmtpd-1.4.3/debian/patches/0005-cve-2024-34083.patch 
python-aiosmtpd-1.4.3/debian/patches/0005-cve-2024-34083.patch
--- python-aiosmtpd-1.4.3/debian/patches/0005-cve-2024-34083.patch      
1970-01-01 01:00:00.000000000 +0100
+++ python-aiosmtpd-1.4.3/debian/patches/0005-cve-2024-34083.patch      
2024-06-07 18:11:07.000000000 +0100
@@ -0,0 +1,19 @@
+Description: CVE-2024-34083 - STARTTLS unencrypted command injection
+Author: Dale Richards <d...@dalerichards.net>
+Origin: upstream, 
https://github.com/aio-libs/aiosmtpd/commit/b3a4a2c6ecfd228856a20d637dc383541fcdbfda
+Bug: 
https://github.com/aio-libs/aiosmtpd/security/advisories/GHSA-wgjv-9j3q-jhg8
+Last-Update: 2024-06-07
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+--- a/aiosmtpd/smtp.py
++++ b/aiosmtpd/smtp.py
+@@ -504,6 +504,9 @@
+             self._reader._transport = transport
+             self._writer._transport = transport
+             self.transport = transport
++            # Discard any leftover unencrypted data
++            # See https://tools.ietf.org/html/rfc3207#page-7
++            self._reader._buffer.clear()  # type: ignore[attr-defined]
+             # Do SSL certificate checking as rfc3207 part 4.1 says.  Why is
+             # _extra a protected attribute?
+             self.session.ssl = self._tls_protocol._extra
diff -Nru python-aiosmtpd-1.4.3/debian/patches/0006-cve-2024-27305.patch 
python-aiosmtpd-1.4.3/debian/patches/0006-cve-2024-27305.patch
--- python-aiosmtpd-1.4.3/debian/patches/0006-cve-2024-27305.patch      
1970-01-01 01:00:00.000000000 +0100
+++ python-aiosmtpd-1.4.3/debian/patches/0006-cve-2024-27305.patch      
2024-06-07 18:11:07.000000000 +0100
@@ -0,0 +1,51 @@
+Description: CVE-2024-27305 - SMTP smuggling
+ SMTP smuggling due to poor handling of
+ non-standard line endings
+Author: Dale Richards <d...@dalerichards.net>
+Origin: upstream, 
https://github.com/aio-libs/aiosmtpd/commit/24b6c79c8921cf1800e27ca144f4f37023982bbb
+Bug: 
https://github.com/aio-libs/aiosmtpd/security/advisories/GHSA-pr2m-px7j-xg65
+Last-Update: 2024-06-07
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+--- a/aiosmtpd/smtp.py
++++ b/aiosmtpd/smtp.py
+@@ -86,7 +86,7 @@
+ EMPTY_BARR = bytearray()
+ EMPTYBYTES = b''
+ MISSING = _Missing()
+-NEWLINE = '\n'
++NEWLINE = '\r\n'
+ VALID_AUTHMECH = re.compile(r"[A-Z0-9_-]+\Z")
+ 
+ # https://tools.ietf.org/html/rfc3207.html#page-3
+@@ -1375,9 +1375,10 @@
+             # Since eof_received cancels this coroutine,
+             # readuntil() can never raise asyncio.IncompleteReadError.
+             try:
+-                line: bytes = await self._reader.readuntil()
++                # https://datatracker.ietf.org/doc/html/rfc5321#section-2.3.8
++                line: bytes = await self._reader.readuntil(b'\r\n')
+                 log.debug('DATA readline: %s', line)
+-                assert line.endswith(b'\n')
++                assert line.endswith(b'\r\n')
+             except asyncio.CancelledError:
+                 # The connection got reset during the DATA command.
+                 log.info('Connection lost during DATA')
+@@ -1394,7 +1395,7 @@
+                 data *= 0
+                 # Drain the stream anyways
+                 line = await self._reader.read(e.consumed)
+-                assert not line.endswith(b'\n')
++                assert not line.endswith(b'\r\n')
+             # A lone dot in a line signals the end of DATA.
+             if not line_fragments and line == b'.\r\n':
+                 break
+@@ -1406,7 +1407,7 @@
+                 # Discard data immediately to prevent memory pressure
+                 data *= 0
+             line_fragments.append(line)
+-            if line.endswith(b'\n'):
++            if line.endswith(b'\r\n'):
+                 # Record data only if state is "NOMINAL"
+                 if state == _DataState.NOMINAL:
+                     line = EMPTY_BARR.join(line_fragments)
diff -Nru python-aiosmtpd-1.4.3/debian/patches/series 
python-aiosmtpd-1.4.3/debian/patches/series
--- python-aiosmtpd-1.4.3/debian/patches/series 2023-05-25 15:09:53.000000000 
+0100
+++ python-aiosmtpd-1.4.3/debian/patches/series 2024-06-07 18:11:07.000000000 
+0100
@@ -2,3 +2,5 @@
 0002-Drop-sphinx-autofixture-extension-requirement.patch
 0003-Remove-imported-images-from-the-web-for-privacy.patch
 0004-Replace-a-dynamic-date-in-copyright-by-a-static-one.patch
+0005-cve-2024-34083.patch
+0006-cve-2024-27305.patch

Reply via email to