From 7261774f66928869281ee91966be4aee8f34b154 Mon Sep 17 00:00:00 2001 From: Ioan Moldovan Date: Wed, 17 Sep 2025 02:00:01 -0300 Subject: [PATCH 1/3] fix: maximum call stack size exceed error --- .../js/common/core/crypto/pgp/pgp-armor.ts | 19 +++++++-- test/source/tests/unit-node.ts | 41 +++++++++++++++++++ 2 files changed, 57 insertions(+), 3 deletions(-) diff --git a/extension/js/common/core/crypto/pgp/pgp-armor.ts b/extension/js/common/core/crypto/pgp/pgp-armor.ts index d885f4cb73f..5c4215ec0d6 100644 --- a/extension/js/common/core/crypto/pgp/pgp-armor.ts +++ b/extension/js/common/core/crypto/pgp/pgp-armor.ts @@ -70,14 +70,27 @@ export class PgpArmor { } public static clipIncomplete(text: string): string | undefined { - const match = text?.match(/(-----BEGIN PGP (MESSAGE|SIGNED MESSAGE|SIGNATURE|PUBLIC KEY BLOCK)-----[^]+)/gm); + // Prevent processing extremely large strings that could cause performance issues + const maxLength = 10 * 1024 * 1024; // 10MB limit + if (!text || text.length > maxLength) { + return undefined; + } + + // Use [\s\S]+ instead of [^]+ to avoid potential regex issues + const match = text.match(/(-----BEGIN PGP (MESSAGE|SIGNED MESSAGE|SIGNATURE|PUBLIC KEY BLOCK)-----[\s\S]+)/gm); return match?.length ? match[0] : undefined; } public static clip(text: string): string | undefined { - if (text?.includes(PgpArmor.ARMOR_HEADER_DICT.null.begin) && text.includes(String(PgpArmor.ARMOR_HEADER_DICT.null.end))) { + // Prevent processing extremely large strings that could cause performance issues + const maxLength = 10 * 1024 * 1024; // 10MB limit + if (!text || text.length > maxLength) { + return undefined; + } + + if (text.includes(PgpArmor.ARMOR_HEADER_DICT.null.begin) && text.includes(String(PgpArmor.ARMOR_HEADER_DICT.null.end))) { const match = text.match( - /(-----BEGIN PGP (MESSAGE|SIGNED MESSAGE|SIGNATURE|PUBLIC KEY BLOCK)-----[^]+-----END PGP (MESSAGE|SIGNATURE|PUBLIC KEY BLOCK)-----)/gm + /(-----BEGIN PGP MESSAGE-----[\s\S]*?-----END PGP MESSAGE-----|-----BEGIN PGP SIGNED MESSAGE-----[\s\S]*?-----END PGP SIGNATURE-----|-----BEGIN PGP SIGNATURE-----[\s\S]*?-----END PGP SIGNATURE-----|-----BEGIN PGP PUBLIC KEY BLOCK-----[\s\S]*?-----END PGP PUBLIC KEY BLOCK-----)/gm ); return match?.length ? match[0] : undefined; } diff --git a/test/source/tests/unit-node.ts b/test/source/tests/unit-node.ts index 8bb87b5f49f..4ba409a2137 100644 --- a/test/source/tests/unit-node.ts +++ b/test/source/tests/unit-node.ts @@ -2762,6 +2762,47 @@ AAAAAAAAAAAAAAAAzzzzzzzzzzzzzzzzzzzzzzzzzzzz.....`) t.pass(); }); + test(`[unit][PgpArmor.clip] correctly handles all the cases including edge cases`, async t => { + // Test empty and plain text + expect(PgpArmor.clip('')).to.be.an.undefined; + expect(PgpArmor.clip('plain text')).to.be.an.undefined; + + // Test valid PGP messages + const validMessage = '-----BEGIN PGP MESSAGE-----\n\ntest content\n-----END PGP MESSAGE-----'; + expect(PgpArmor.clip(validMessage)).to.equal(validMessage); + + // Test with prefix and suffix + const messageWithNoise = 'prefix text ' + validMessage + ' suffix text'; + expect(PgpArmor.clip(messageWithNoise)).to.equal(validMessage); + + // Test multiple messages (should return first) + const multipleMessages = validMessage + '\n\n' + validMessage; + expect(PgpArmor.clip(multipleMessages)).to.equal(validMessage); + + // Test with different block types + const publicKeyBlock = '-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nkey data\n-----END PGP PUBLIC KEY BLOCK-----'; + expect(PgpArmor.clip(publicKeyBlock)).to.equal(publicKeyBlock); + + // Test with signed message + const signedMessage = '-----BEGIN PGP SIGNED MESSAGE-----\n\nmessage\n-----BEGIN PGP SIGNATURE-----\nsig\n-----END PGP SIGNATURE-----'; + expect(PgpArmor.clip(signedMessage)).to.equal(signedMessage); + + // Test with mismatched begin/end (should not match) + const mismatchedMessage = '-----BEGIN PGP MESSAGE-----\n\ntest\n-----END PGP SIGNATURE-----'; + expect(PgpArmor.clip(mismatchedMessage)).to.be.an.undefined; + + // Test with very large input (over 10MB limit) + const largeInput = 'a'.repeat(11 * 1024 * 1024); + expect(PgpArmor.clip(largeInput)).to.be.an.undefined; + + // Test with pathological input that would have caused stack overflow + const pathologicalBase = '-----BEGIN PGP MESSAGE-----\n' + 'a'.repeat(1000); + const pathologicalInput = pathologicalBase + '\n-----END PGP MESSAGE-----'; + expect(PgpArmor.clip(pathologicalInput)).to.equal(pathologicalInput); + + t.pass(); + }); + test(`[unit][Str] splitAlphanumericExtended returns all parts extendec till the end of the original string`, async t => { expect(Str.splitAlphanumericExtended('part1.part2@part3.part4')).to.eql(['part1.part2@part3.part4', 'part2@part3.part4', 'part3.part4', 'part4']); t.pass(); From 30a756ce567bb738f985ac5c64360f70dd9b9aa7 Mon Sep 17 00:00:00 2001 From: Ioan Moldovan Date: Thu, 18 Sep 2025 09:58:09 -0300 Subject: [PATCH 2/3] fix: pr review --- .../js/common/core/crypto/pgp/pgp-armor.ts | 37 +++++++++++-------- test/source/tests/unit-node.ts | 7 ---- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/extension/js/common/core/crypto/pgp/pgp-armor.ts b/extension/js/common/core/crypto/pgp/pgp-armor.ts index 5c4215ec0d6..fd436899deb 100644 --- a/extension/js/common/core/crypto/pgp/pgp-armor.ts +++ b/extension/js/common/core/crypto/pgp/pgp-armor.ts @@ -69,18 +69,6 @@ export class PgpArmor { return !!new RegExp(`${PgpArmor.ARMOR_HEADER_DICT.encryptedMsg.begin}.*${PgpArmor.ARMOR_HEADER_DICT.encryptedMsg.end}`).exec(msg); } - public static clipIncomplete(text: string): string | undefined { - // Prevent processing extremely large strings that could cause performance issues - const maxLength = 10 * 1024 * 1024; // 10MB limit - if (!text || text.length > maxLength) { - return undefined; - } - - // Use [\s\S]+ instead of [^]+ to avoid potential regex issues - const match = text.match(/(-----BEGIN PGP (MESSAGE|SIGNED MESSAGE|SIGNATURE|PUBLIC KEY BLOCK)-----[\s\S]+)/gm); - return match?.length ? match[0] : undefined; - } - public static clip(text: string): string | undefined { // Prevent processing extremely large strings that could cause performance issues const maxLength = 10 * 1024 * 1024; // 10MB limit @@ -89,10 +77,27 @@ export class PgpArmor { } if (text.includes(PgpArmor.ARMOR_HEADER_DICT.null.begin) && text.includes(String(PgpArmor.ARMOR_HEADER_DICT.null.end))) { - const match = text.match( - /(-----BEGIN PGP MESSAGE-----[\s\S]*?-----END PGP MESSAGE-----|-----BEGIN PGP SIGNED MESSAGE-----[\s\S]*?-----END PGP SIGNATURE-----|-----BEGIN PGP SIGNATURE-----[\s\S]*?-----END PGP SIGNATURE-----|-----BEGIN PGP PUBLIC KEY BLOCK-----[\s\S]*?-----END PGP PUBLIC KEY BLOCK-----)/gm - ); - return match?.length ? match[0] : undefined; + // Define the PGP armor headers we want to match + const pgpHeaders = [ + PgpArmor.ARMOR_HEADER_DICT.encryptedMsg, + PgpArmor.ARMOR_HEADER_DICT.signedMsg, + PgpArmor.ARMOR_HEADER_DICT.signature, + PgpArmor.ARMOR_HEADER_DICT.publicKey, + ]; + + // Build regex patterns from headers, escaping special regex characters + const patterns = pgpHeaders.map(header => { + const escapedBegin = header.begin.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + // header.end can be string or RegExp, handle both cases + const escapedEnd = typeof header.end === 'string' ? header.end.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') : header.end.source; // If it's already a RegExp, use its source + return `(${escapedBegin}[\\s\\S]*?${escapedEnd})`; + }); + + // Create regex with alternation, 'm' flag for multiline (no 'g' needed for single match) + const regex = new RegExp(patterns.join('|'), 'm'); + const match = text.match(regex); + + return match ? match[0] : undefined; } return undefined; } diff --git a/test/source/tests/unit-node.ts b/test/source/tests/unit-node.ts index 4ba409a2137..cb246849a14 100644 --- a/test/source/tests/unit-node.ts +++ b/test/source/tests/unit-node.ts @@ -2755,13 +2755,6 @@ AAAAAAAAAAAAAAAAzzzzzzzzzzzzzzzzzzzzzzzzzzzz.....`) t.pass(); }); - test(`[unit][PgpArmor.clipIncomplete] correctly handles all the cases`, async t => { - expect(PgpArmor.clipIncomplete('')).to.be.an.undefined; - expect(PgpArmor.clipIncomplete('plain text')).to.be.an.undefined; - expect(PgpArmor.clipIncomplete('prefix -----BEGIN PGP MESSAGE-----\n\nexample')).to.equal('-----BEGIN PGP MESSAGE-----\n\nexample'); - t.pass(); - }); - test(`[unit][PgpArmor.clip] correctly handles all the cases including edge cases`, async t => { // Test empty and plain text expect(PgpArmor.clip('')).to.be.an.undefined; From e6283253a4a5ef9c9b83a0ea2dbb6c4ef6b88d24 Mon Sep 17 00:00:00 2001 From: Ioan Moldovan Date: Mon, 22 Sep 2025 04:57:32 -0300 Subject: [PATCH 3/3] fix: expired key --- ...iaseduserexamplecom-0x357B908F62498DF8.asc | 75 ++++++++++++++++++ ...iaseduserexamplecom-0x357B908F62498DF8.key | Bin 3377 -> 0 bytes test/source/tests/setup.ts | 2 +- 3 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 test/samples/openpgp/multialiaseduserexamplecom-0x357B908F62498DF8.asc delete mode 100644 test/samples/openpgp/multialiaseduserexamplecom-0x357B908F62498DF8.key diff --git a/test/samples/openpgp/multialiaseduserexamplecom-0x357B908F62498DF8.asc b/test/samples/openpgp/multialiaseduserexamplecom-0x357B908F62498DF8.asc new file mode 100644 index 00000000000..aed0ce25d81 --- /dev/null +++ b/test/samples/openpgp/multialiaseduserexamplecom-0x357B908F62498DF8.asc @@ -0,0 +1,75 @@ +-----BEGIN PGP PRIVATE KEY BLOCK----- + +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 +T9hnbh8WlHmouxmPg+GyCDI= +=DSs3 +-----END PGP PRIVATE KEY BLOCK----- diff --git a/test/samples/openpgp/multialiaseduserexamplecom-0x357B908F62498DF8.key b/test/samples/openpgp/multialiaseduserexamplecom-0x357B908F62498DF8.key deleted file mode 100644 index dd6d90dcce1ccfe942918501258327fb165b8985..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3377 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 diff --git a/test/source/tests/setup.ts b/test/source/tests/setup.ts index 7160d7b8c51..ccac7b5b4d4 100644 --- a/test/source/tests/setup.ts +++ b/test/source/tests/setup.ts @@ -2660,7 +2660,7 @@ AN8G3r5Htj8olot+jm9mIa5XLXWzMNUZgg== const settingsPage = await BrowserRecipe.openSettingsLoginApprove(t, browser, acct); const key = { title: 'unarmored OpenPGP key', - filePath: 'test/samples/openpgp/multialiaseduserexamplecom-0x357B908F62498DF8.key', + filePath: 'test/samples/openpgp/multialiaseduserexamplecom-0x357B908F62498DF8.asc', armored: null, // eslint-disable-line no-null/no-null passphrase: '1basic passphrase to use', longid: null, // eslint-disable-line no-null/no-null