Katalog CVE

CVE-2026-77999

WysokieCVSS 8.7
Opublikowano: Zaktualizowano: Przetłumaczono: NVD NIST

Streszczenie

W rozszerzeniu Joomla J2Store (wersje 1.0.0-3.3.21, 4.0.0-4.0.21, 4.1.0-4.1.6) wykryto podatność umożliwiającą nieuwierzytelnione fałszowanie wywołania zwrotnego PayPal, prowadzące do oszustwa związanego z potwierdzeniem zamówienia. Listener PayPal IPN akceptował odpowiedzi `UNVERIFIED` i każdą nie-`INVALID` jako ważne, wyłączał weryfikację SSL (CURLOPT_SSL_VERIFYPEER) i przechowywał werdykt w polu, którego nic później nie sprawdzało — więc przetwarzanie kontynuowało się niezależnie od wyniku. Dodatkowo porównanie zapłaconej kwoty działało tylko, gdy `mc_gross` było liczbą dodatnią; pominięcie pola w treści POST (`floatval(null) == 0`) pomijało sprawdzenie. W połączeniu z `receiver_email` skonfigurowanym przez sprzedawcę i sekwencyjnym, możliwym do odgadnięcia identyfikatorem zamówienia odczytanym z pola `custom`, anonimowy POST wystarczył, aby przenieść oczekujące zamówienie bezpośrednio do statusu `CONFIRMED` bez płatności lub wymusić na innym kliencie zmianę statusu oczekującego zamówienia na `FAILED`. `paypalv2.php` nie przeprowadzał żadnej kontroli kwoty w żadnych okolicznościach.

Ocena ryzyka

Ryzyko obejmuje możliwość potwierdzania zamówień bez płatności, co prowadzi do strat finansowych, oraz manipulację statusami zamówień innych klientów, co narusza integralność procesu zamówień.

Rekomendacja

Zaleca się aktualizację J2Store do wersji zawierającej poprawkę oraz wdrożenie ścisłej weryfikacji podpisów PayPal, włączenie weryfikacji SSL i obowiązkowej kontroli kwot dla wszystkich transakcji.

Inne podatności w J2Store

Zobacz wszystkie
Oryginalny opis (angielski, źródło NVD)

Joomla Extension - j2commerce.com - Unauthenticated PayPal callback forgery leading to order confirmation fraud in J2Store 1.0.0-3.3.21, 4.0.0-4.0.21, 4.1.0-4.1.6 - The PayPal IPN listener's signature check (`_validateIPN()`) accepted `UNVERIFIED` and any non-`INVALID` response as valid, made its verification request with `CURLOPT_SSL_VERIFYPEER` disabled, and stored its verdict in a field nothing downstream ever checked — so processing continued regardless of the outcome. Separately, the paid-amount comparison only ran when `mc_gross` was a positive number; omitting the field from the POST body (`floatval(null) == 0`) skipped the check entirely. Combined with a merchant-configured `receiver_email` and a sequential, enumerable order id read from the `custom` field, an anonymous POST was enough to move a pending order straight to `CONFIRMED` with no payment, or force another customer's pending order to `FAILED`. `paypalv2.php` performed no amount check under any circumstances.

Dane podatności pochodzą z NVD (NIST) · CISA KEV · EPSS