Podatność integer underflow w module ERTS (Erlang/OTP) pozwala atakującemu na natychmiastowe awaryjne zakończenie (abort) całego węzła Erlang poprzez wysłanie spreparowanego termu ETF. Jest szczególnie niebezpieczna, ponieważ awarii nie można przechwycić żadnym mechanizmem obsługi błędów w samym środowisku OTP.
▸ Pokaż oryginał (EN)
Integer Underflow (Wrap or Wraparound) vulnerability in erlang otp erlang/otp (erts modules), erlang otp erts (erts modules) allows Forced Integer Overflow, Excessive Allocation. This vulnerability is associated with program files erts/emulator/beam/external.c, emulator/beam/external.c. The BIT_BINARY_EXT tag (77) handler in the External Term Format (ETF) decoder accepts an encoding with both length and trailing-bits fields set to zero. The subsequent computation of the bitstring size underflows an unsigned integer, producing a value of roughly 2^64 that is then passed as a memory allocation size. The allocator aborts the entire node with a message such as "Cannot allocate 2305843009213693951 bytes of memory (of type binary)". The crash is a VM-level abort, not an Erlang-level exception. It cannot be intercepted by supervision trees, by try/catch, or by passing the [safe] option to binary_to_term/2 (which only restricts atom creation and does not perform structural validation of binary encodings). Any application that decodes ETF from untrusted sources via binary_to_term/1,2 or enif_binary_to_term() is exposed. The Erlang distribution protocol also decodes incoming terms through the same code path, but distribution is expected to run on trusted networks per the OTP Secure Coding Guidelines (DSG-011). This issue affects OTP from OTP 27.0 before OTP 29.0.4, OTP 28.5.0.4 and OTP 27.3.4.15, corresponding to erts from 15.0 before 17.0.4, 16.4.0.4 and 15.2.7.11.
Procedura obsługi znacznika BIT_BINARY_EXT (77) w dekoderze formatu External Term Format (ETF) akceptuje kodowanie, w którym zarówno pole długości (length), jak i pole bitów końcowych (trailing-bits) wynoszą zero. W wyniku tego dochodzi do integer underflow na liczbie całkowitej bez znaku — obliczony rozmiar bitstringa przyjmuje wartość zbliżoną do 2^64. Ta gigantyczna wartość jest następnie przekazywana jako argument do alokatora pamięci, który nie jest w stanie zrealizować alokacji i przerywa działanie całego węzła VM komunikatem o treści np. 'Cannot allocate 2305843009213693951 bytes of memory (of type binary)'. Awaria następuje na poziomie maszyny wirtualnej (VM-level abort) i nie może zostać przechwycona przez drzewa nadzoru (supervision trees), bloki try/catch ani przez opcję [safe] przekazywaną do binary_to_term/2 — opcja ta ogranicza jedynie tworzenie atomów i nie wykonuje walidacji strukturalnej kodowań binarnych.
Atakujący może spowodować natychmiastowe, nieodwracalne zatrzymanie (Denial of Service) całego węzła Erlang bez możliwości przechwycenia błędu przez aplikację. Dotyczy to każdej aplikacji dekodującej ETF z niezaufanych źródeł za pomocą binary_to_term/1,2 lub enif_binary_to_term().
Należy zaktualizować Erlang/OTP do wersji OTP 27.3.4.15, OTP 28.5.0.4 lub OTP 29.0.4 (odpowiednio ERTS 15.2.7.11, 16.4.0.4, 17.0.4). Do czasu aktualizacji zaleca się unikanie dekodowania danych ETF pochodzących z niezaufanych źródeł oraz izolowanie węzłów Erlang obsługujących zewnętrzne dane. Poprawka dostępna jest w repozytorium GitHub Erlang/OTP (commit dc1bf9344c0ce62717cf60866590cea0242780fd).
Erlang/OTP od wersji OTP 27.0 do przed OTP 27.3.4.15, OTP 28.x do przed OTP 28.5.0.4 oraz OTP 29.x do przed OTP 29.0.4; odpowiadające wersje ERTS: od 15.0 do przed 15.2.7.11, 16.x do przed 16.4.0.4 oraz 17.x do przed 17.0.4
Podatność dotyczy wyłącznie aplikacji dekodujących ETF z niezaufanych źródeł. Protokół dystrybucji Erlang również korzysta z tego samego kodu, jednak zgodnie z OTP Secure Coding Guidelines (DSG-011) jest przeznaczony do pracy w zaufanych sieciach. Opcja [safe] w binary_to_term/2 NIE chroni przed tą podatnością.
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:XErlang Erlang\/otp
APPErlang27.0 – 27.3.4.15 (bez)28.0 – 28.5.0.4 (bez)29.0 – 29.0.4 (bez)Erlang Erts
APPErlang15.0 – 15.2.7.11 (bez)16.0 – 16.4.0.4 (bez)17.0 – 17.0.4 (bez)
Powiązane podatności
Erlang/OTP SSH — nieuwierzytelniony RCE (CVSS 10.0)
The Erlang/OTP ssl TLS 1.2 (and earlier) and DTLS client does not verify that the cipher suite selected by the...
Erlang/OTP – obejście uwierzytelniania klienta w SSL/TLS/DTLS
Heap overflow w generowaniu wyrażeń regularnych w Erlang/OTP 18.x
Erlang/OTP TLS/DTLS: nieskończona rekurencja przy cross-signed certyfikatach (DoS)