Skip to content

Commit

Permalink
Fix potential DoS issue with p2c header
Browse files Browse the repository at this point in the history
Unbounded p2c headers may be used to cause an application that accept
PBES algorithms to spend a lot of resources running PBKDF2 with a very
high number of iterations.

Limit the maximum number of iterations to to 32768.

Fixes: CVE-2023-50967

Signed-off-by: Sergio Correia <[email protected]>
  • Loading branch information
sergio-correia committed Apr 3, 2024
1 parent dae5654 commit 4ee7708
Show file tree
Hide file tree
Showing 5 changed files with 16 additions and 2 deletions.
9 changes: 7 additions & 2 deletions lib/openssl/pbes2.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@
#include <string.h>

#define NAMES "PBES2-HS256+A128KW", "PBES2-HS384+A192KW", "PBES2-HS512+A256KW"
#define P2C_MIN_ITERATIONS 1000
#define P2C_MAX_ITERATIONS 32768

static json_t *
pbkdf2(const char *alg, jose_cfg_t *cfg, const json_t *jwk, int iter,
Expand Down Expand Up @@ -193,7 +195,7 @@ alg_wrap_wrp(const jose_hook_alg_t *alg, jose_cfg_t *cfg, json_t *jwe,
json_auto_t *hdr = NULL;
const char *aes = NULL;
json_t *h = NULL;
int p2c = 10000;
int p2c = P2C_MAX_ITERATIONS;
size_t stl = 0;

if (!json_object_get(cek, "k") && !jose_jwk_gen(cfg, cek))
Expand Down Expand Up @@ -226,7 +228,7 @@ alg_wrap_wrp(const jose_hook_alg_t *alg, jose_cfg_t *cfg, json_t *jwe,
json_object_set_new(h, "p2c", json_integer(p2c)) < 0)
return false;

if (p2c < 1000)
if (p2c < P2C_MIN_ITERATIONS || p2c > P2C_MAX_ITERATIONS)
return false;

if (json_object_set_new(h, "p2s", jose_b64_enc(st, stl)) == -1)
Expand Down Expand Up @@ -268,6 +270,9 @@ alg_wrap_unw(const jose_hook_alg_t *alg, jose_cfg_t *cfg, const json_t *jwe,
if (json_unpack(hdr, "{s:I}", "p2c", &p2c) == -1)
return false;

if (p2c > P2C_MAX_ITERATIONS)
return false;

stl = jose_b64_dec(json_object_get(hdr, "p2s"), NULL, 0);
if (stl < 8 || stl > sizeof(st))
return false;
Expand Down
1 change: 1 addition & 0 deletions tests/cve-2023-50967/cve-2023-50967.jwe
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"ciphertext":"aaPb-JYGACs-loPwJkZewg","encrypted_key":"P1h8q8wLVxqYsZUuw6iEQTzgXVZHCsu8Eik-oqbE4AJGIDto3gb3SA","header":{"alg":"PBES2-HS256+A128KW","p2c":1000000000,"p2s":"qUQQWWkyyIqculSiC93mlg"},"iv":"Clg3JX9oNl_ck3sLSGrlgg","protected":"eyJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","tag":"i7vga9tJkwRswFd7HlyD_A"}
1 change: 1 addition & 0 deletions tests/cve-2023-50967/cve-2023-50967.jwk
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"alg":"PBES2-HS256+A128KW","k":"VHBLJ4-PmnqELoKbQoXuRA","key_ops":["wrapKey","unwrapKey"],"kty":"oct"}
5 changes: 5 additions & 0 deletions tests/jose-jwe-dec
Original file line number Diff line number Diff line change
Expand Up @@ -53,3 +53,8 @@ test "`jose jwe dec -i $prfx.12.jweg -k $prfx.12.jwk`" = "`cat $prfx.12.pt`"
test "`jose jwe dec -i $prfx.13.jweg -k $prfx.13.1.jwk`" = "`cat $prfx.13.pt`"
test "`jose jwe dec -i $prfx.13.jweg -k $prfx.13.2.jwk`" = "`cat $prfx.13.pt`"
test "`jose jwe dec -i $prfx.13.jweg -k $prfx.13.3.jwk`" = "`cat $prfx.13.pt`"

# CVE-2023-50967 - test originally from https:/P3ngu1nW/CVE_Request/blob/main/latch-jose.md
# This test is expected to fail quickly on patched systems.
prfx="${CVE_2023_50967}/cve-2023-50967"
! test "$(jose jwe dec -i $prfx.jwe -k $prfx.jwk)"
2 changes: 2 additions & 0 deletions tests/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ progs = [
e = environment()
e.prepend('PATH', meson.current_build_dir() + '/../cmd', separator: ':')
e.set('VECTORS', meson.current_source_dir() + '/vectors')
e.set('CVE_2023_50967', meson.current_source_dir() + '/cve-2023-50967')


foreach p: progs
exe = executable(p, p + '.c', dependencies: libjose_dep)
Expand Down

0 comments on commit 4ee7708

Please sign in to comment.