commit 5fa73017cc821fb38cd321596bb05f4614be959f Author: Stefano Rivera Date: Sun Oct 30 11:54:46 2022 +0200 SECURITY UPDATE: Fix buffer overflow in SHA3 (Keccak) implementation. * SECURITY UPDATE: Fix buffer overflow in SHA3 (Keccak) implementation. * References: CVE-2022-37454 (LP: #1995197) diff --git a/debian/changelog b/debian/changelog index 288d0818..63aa0486 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +pypy3 (7.3.9+dfsg-4ubuntu0.1) kinetic-security; urgency=high + + * SECURITY UPDATE: Fix buffer overflow in SHA3 (Keccak) implementation. + * References: CVE-2022-37454 (LP: #1995197) + + -- Stefano Rivera Sun, 30 Oct 2022 11:54:18 +0200 + pypy3 (7.3.9+dfsg-4) unstable; urgency=medium * Upload to unstable. diff --git a/debian/patches/CVE-2022-37454 b/debian/patches/CVE-2022-37454 new file mode 100644 index 00000000..19d198c9 --- /dev/null +++ b/debian/patches/CVE-2022-37454 @@ -0,0 +1,78 @@ +From: Matti Picus +Date: Sat, 29 Oct 2022 15:44:25 +0200 +Subject: fix segfault from CVE-2022-37454 via cpython PR 98527 + +Origin: upstream, https://foss.heptapod.net/pypy/pypy/-/commit/860b897b2611a4099ef9c63ce848fdec89c74b31 +--- + lib-python/3/test/test_hashlib.py | 9 +++++++++ + lib_pypy/_sha3/kcp/KeccakSponge.inc | 14 ++++++++------ + 2 files changed, 17 insertions(+), 6 deletions(-) + +diff --git a/lib-python/3/test/test_hashlib.py b/lib-python/3/test/test_hashlib.py +index 8b53d23..8743c9d 100644 +--- a/lib-python/3/test/test_hashlib.py ++++ b/lib-python/3/test/test_hashlib.py +@@ -434,6 +434,15 @@ class HashLibTestCase(unittest.TestCase): + def test_case_md5_uintmax(self, size): + self.check('md5', b'A'*size, '28138d306ff1b8281f1a9067e1a1a2b3') + ++ @unittest.skipIf(sys.maxsize < _4G - 1, 'test cannot run on 32-bit systems') ++ @bigmemtest(size=_4G - 1, memuse=1, dry_run=False) ++ def test_sha3_update_overflow(self, size): ++ """Regression test for cpython gh-98517 CVE-2022-37454.""" ++ h = hashlib.sha3_224() ++ h.update(b'\x01') ++ h.update(b'\x01'*0xffff_ffff) ++ self.assertEqual(h.hexdigest(), '80762e8ce6700f114fec0f621fd97c4b9c00147fa052215294cceeed') ++ + # use the three examples from Federal Information Processing Standards + # Publication 180-1, Secure Hash Standard, 1995 April 17 + # http://www.itl.nist.gov/div897/pubs/fip180-1.htm +diff --git a/lib_pypy/_sha3/kcp/KeccakSponge.inc b/lib_pypy/_sha3/kcp/KeccakSponge.inc +index e10739d..7241010 100644 +--- a/lib_pypy/_sha3/kcp/KeccakSponge.inc ++++ b/lib_pypy/_sha3/kcp/KeccakSponge.inc +@@ -171,7 +171,7 @@ int SpongeAbsorb(SpongeInstance *instance, const unsigned char *data, size_t dat + i = 0; + curData = data; + while(i < dataByteLen) { +- if ((instance->byteIOIndex == 0) && (dataByteLen >= (i + rateInBytes))) { ++ if ((instance->byteIOIndex == 0) && (dataByteLen-i >= rateInBytes)) { + #ifdef SnP_FastLoop_Absorb + /* processing full blocks first */ + +@@ -200,9 +200,10 @@ int SpongeAbsorb(SpongeInstance *instance, const unsigned char *data, size_t dat + else { + /* normal lane: using the message queue */ + +- partialBlock = (unsigned int)(dataByteLen - i); +- if (partialBlock+instance->byteIOIndex > rateInBytes) ++ if (dataByteLen-i > rateInBytes-instance->byteIOIndex) + partialBlock = rateInBytes-instance->byteIOIndex; ++ else ++ partialBlock = (unsigned int)(dataByteLen - i); + #ifdef KeccakReference + displayBytes(1, "Block to be absorbed (part)", curData, partialBlock); + #endif +@@ -281,7 +282,7 @@ int SpongeSqueeze(SpongeInstance *instance, unsigned char *data, size_t dataByte + i = 0; + curData = data; + while(i < dataByteLen) { +- if ((instance->byteIOIndex == rateInBytes) && (dataByteLen >= (i + rateInBytes))) { ++ if ((instance->byteIOIndex == rateInBytes) && (dataByteLen-i >= rateInBytes)) { + for(j=dataByteLen-i; j>=rateInBytes; j-=rateInBytes) { + SnP_Permute(instance->state); + SnP_ExtractBytes(instance->state, curData, 0, rateInBytes); +@@ -299,9 +300,10 @@ int SpongeSqueeze(SpongeInstance *instance, unsigned char *data, size_t dataByte + SnP_Permute(instance->state); + instance->byteIOIndex = 0; + } +- partialBlock = (unsigned int)(dataByteLen - i); +- if (partialBlock+instance->byteIOIndex > rateInBytes) ++ if (dataByteLen-i > rateInBytes-instance->byteIOIndex) + partialBlock = rateInBytes-instance->byteIOIndex; ++ else ++ partialBlock = (unsigned int)(dataByteLen - i); + i += partialBlock; + + SnP_ExtractBytes(instance->state, curData, instance->byteIOIndex, partialBlock); diff --git a/debian/patches/series b/debian/patches/series index e1555108..92e55906 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -20,3 +20,4 @@ tkinter-import noise python3-sphinx setuptools-59-editable-installs +CVE-2022-37454