Biblioteka ruby-jwt przed wersjami 2.10.3 i 3.2.0 akceptuje tokeny JWT sfałszowane przez atakującego, gdy klucz HMAC jest pustym ciągiem znaków lub wartością nil. Błąd pozwala obejść mechanizm uwierzytelnienia w aplikacjach opartych na JWT.
▸ Pokaż oryginał (EN)
ruby-jwt is a Ruby implementation of the RFC 7519 OAuth JSON Web Token standard. Prior to 2.10.3 and 3.2.0, JWT.decode(token, '', true, algorithm: 'HS256') accepts an attacker-forged token because OpenSSL::HMAC.digest('SHA256', '', payload) returns a valid digest under an empty key and no empty-key precondition exists in the HMAC algorithm. The same path is reached when a keyfinder block or key_finder: argument returns an empty string, nil, or an array containing nil for an unknown key, affecting HS256, HS384, and HS512 verification through JWT.decode and JWT::EncodedToken#verify_signature!. This issue is fixed in versions 2.10.3 and 3.2.0.
Podatność wynika z braku walidacji warunku niepustości klucza przed wykonaniem operacji HMAC. Wywołanie JWT.decode z pustym kluczem (np. '') powoduje, że OpenSSL::HMAC.digest oblicza poprawny skrót dla pustego klucza, co sprawia, że podpis sfałszowanego tokenu jest akceptowany jako prawidłowy. Ten sam błędny kod jest osiągany, gdy blok lub argument key_finder zwraca pusty ciąg, nil lub tablicę zawierającą nil dla nieznanego identyfikatora klucza. Problem dotyczy algorytmów HS256, HS384 i HS512 zarówno w JWT.decode, jak i JWT::EncodedToken#verify_signature!.
Atakujący może sfabrykować dowolny token JWT, który zostanie uznany za prawidłowo podpisany, co umożliwia pełne ominięcie uwierzytelnienia i autoryzacji w aplikacji. W zależności od zastosowania tokenu może to prowadzić do nieautoryzowanego dostępu do danych (C:H) lub modyfikacji zasobów (I:H).
Należy zaktualizować ruby-jwt do wersji 2.10.3 (gałąź 2.x) lub 3.2.0 (gałąź 3.x). Dodatkowo zaleca się audyt kodu aplikacji pod kątem miejsc, gdzie klucz HMAC może być pustym ciągiem lub nil, oraz wprowadzenie jawnej walidacji niepustości klucza przed przekazaniem go do JWT.decode lub key_finder.
Biblioteka ruby-jwt we wszystkich wersjach przed 2.10.3 (gałąź 2.x) oraz przed 3.2.0 (gałąź 3.x), przy użyciu algorytmów HS256, HS384 lub HS512, gdy klucz weryfikacji może przyjąć wartość pustego ciągu, nil lub tablicy zawierającej nil.
Podatność opisana w security advisory GHSA-c32j-vqhx-rx3x w repozytorium ruby-jwt. Poprawki zostały wprowadzone w commitach 9820020869ad147b941e49d96ab8beba35532964 oraz db560b769a07bd9724e77ff505011ac01872106f.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N