CVE-2026-75832
ŚrednieCVSS 4.3Prawdopodobieństwo exploitacji (EPSS)
Niskie ryzykoPercentyl 13 - wyżej niż 13% wszystkich znanych CVE
Streszczenie
Wtyczka Grav API (getgrav/grav-plugin-api, dołączona do Grav 2.0) przed wersją 1.0.14 (naprawiona w 1.0.15) zawiera podatność braku autoryzacji w BlueprintPathResolver::resolveUserScope(). Metoda blokuje zakres users/<name> na surowym flagu super-admina ACL (access.api.super) zamiast weryfikować faktyczny zakres prezentowanego klucza API. Atakujący posiadający klucz API z zakresem tylko api.media.write, wybity na koncie super-admina, może ominąć kontrolę autoryzacji i, przez POST /blueprint-upload lub GET /blueprint-files, zapisać plik w zakresie innego użytkownika (w wspólnym katalogu user/accounts/, ograniczonym do rozszerzeń obrazów przez assertSafeExtension()) i przeglądać listę plików w tym zakresie, mimo że klucz nie ma uprawnień api.users.write.
Ocena ryzyka
Ryzyko polega na nieautoryzowanym dostępie do plików innych użytkowników, co może prowadzić do ujawnienia wrażliwych danych lub modyfikacji plików. Atakujący z ograniczonym kluczem API może uzyskać dostęp do danych, które powinny być niedostępne.
Rekomendacja
Zaleca się aktualizację wtyczki Grav API do wersji 1.0.15 lub nowszej, która zawiera poprawkę. Należy również przejrzeć konfigurację kluczy API i upewnić się, że zakresy są prawidłowo egzekwowane.
Oryginalny opis (angielski, źródło NVD)
The Grav API plugin (getgrav/grav-plugin-api, bundled with Grav 2.0) before version 1.0.14 (fixed in 1.0.15) contains a missing authorization vulnerability in BlueprintPathResolver::resolveUserScope(). The method gates the users/<name> scope on the account's raw super-admin ACL flag (access.api.super) instead of validating the presented API key's actual scope. An attacker holding an API key scoped only to api.media.write minted on a super-admin account can bypass the authorization check and, via POST /blueprint-upload or GET /blueprint-files, write a file into another user's scope (in the shared user/accounts/ directory, constrained to image extensions by assertSafeExtension()) and browse that scope's file listing, despite the key not being granted api.users.write.

