From b50ffea546e762943dee8c68e6707dba02d29cbe Mon Sep 17 00:00:00 2001 From: Karel Miko Date: Sat, 1 Aug 2026 15:43:21 +0200 Subject: [PATCH] PBES - fix stack over-read with malformed PBES2 parameters --- src/misc/pbes/pbes.c | 2 ++ src/misc/pbes/pbes2.c | 3 +++ tests/pem/pkcs/invalid/pbes2-no-iv.pk8 | 12 ++++++++++++ 3 files changed, 17 insertions(+) create mode 100644 tests/pem/pkcs/invalid/pbes2-no-iv.pk8 diff --git a/src/misc/pbes/pbes.c b/src/misc/pbes/pbes.c index b4231234a..22e711589 100644 --- a/src/misc/pbes/pbes.c +++ b/src/misc/pbes/pbes.c @@ -44,6 +44,8 @@ int pbes_decrypt(const pbes_arg *arg, unsigned char *dec_data, unsigned long *d if (arg->iv != NULL) { iv = arg->iv->data; } else { + /* PBES1 derives key and IV in one go, the IV follows the key in k; blocklen is 0 for PBES2, which has no IV to derive from */ + if (arg->type.blocklen != (unsigned long)cipher_descriptor[cid].block_length) return CRYPT_INVALID_PACKET; iv = k + klen; klen += arg->type.blocklen; } diff --git a/src/misc/pbes/pbes2.c b/src/misc/pbes/pbes2.c index a8db5bd46..1b6ebf812 100644 --- a/src/misc/pbes/pbes2.c +++ b/src/misc/pbes/pbes2.c @@ -197,6 +197,9 @@ int pbes2_extract(const ltc_asn1_list *s, pbes_arg *res) } else { return CRYPT_INVALID_PACKET; } + } else { + /* PBES2 always carries the IV in the parameters, there is nothing to derive it from */ + return CRYPT_INVALID_PACKET; } return CRYPT_OK; diff --git a/tests/pem/pkcs/invalid/pbes2-no-iv.pk8 b/tests/pem/pkcs/invalid/pbes2-no-iv.pk8 new file mode 100644 index 000000000..861c5242a --- /dev/null +++ b/tests/pem/pkcs/invalid/pbes2-no-iv.pk8 @@ -0,0 +1,12 @@ +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIIBzTBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQIDvEXvzqHE1ICAggA +MAwGCCqGSIb3DQILBQAwHQYJYIZIAWUDBAEqAhCj/pJclOyl8T9QLQ5hST9UBIIB +cAhS99K8b/rp2TaTvSSuwTS1qFcJ0O33zSSIprhVriNdArgQC0sX3XZKe5tyzWSD ++ZJZXJhcnQKRauDGhiF7dJWSgM0MbL90ZgwFyQvwzl1kxfKheaS8Hv/xGDvx+eAU +XwOAddifqcSediLUwtf5SRUmPy12gxcMFN0gY7fvjA0Wb/fDn6UuG0iu+y/msiu/ +S+dW+PbOZBDiQb1u/U+wKTdvQxowlu6zkapxRFRWC1i2S7vBtdK7aLTERUJwdEf/ +RdAMLXQdr5zhKHTjx7nQiPCksbNrpdTQHw/nsrNtE0pPvde3MCNIfvaDgHXyCV8F +Fo/fn97YhaKH8zCfvWhduuY2Bj3M1jBLRxGQZ2cs4hb6Ua3R2GiTD0h5zp9uNXRH +SrECToksdY5jNz1qMV6TA7gAOZ477sZCkJ0WU68B0jUVJKlEYCPzyTVcoy3a1hiF +Lx2H5WbsXSsZGaX+wyUUicYm8J+YnGtVd+FgS5e8Lh4w +-----END ENCRYPTED PRIVATE KEY-----