CVE-2026-71365
WysokieCVSS 7.7Prawdopodobieństwo exploitacji (EPSS)
Niskie ryzykoPercentyl 37 - wyżej niż 37% wszystkich znanych CVE
Streszczenie
Znaleziono podatność na server-side request forgery (SSRF) w mechanizmie wywołań zwrotnych webhooków w AWX. Podczas przetwarzania webhooków GitHub pull request, AWX wyodrębnia URL wywołania zwrotnego statusu (pull_request.statuses_url) z ładunku webhooka bez walidacji hosta docelowego względem oczekiwanego dostawcy Git. Ten URL jest zapisywany w zmiennych dodatkowych zadania i później używany do wysyłania uwierzytelnionych aktualizacji statusu. Użytkownik z rolą administratora w szablonie zadania z włączonym webhookiem może odczytać klucz podpisywania webhooka szablonu, sfałszować podpisany ładunek webhooka GitHub z dowolnym statuses_url i spowodować, że AWX wyśle aktualizacje statusu na URL kontrolowany przez atakującego lub wewnętrzny. Żądanie aktualizacji statusu zawiera skonfigurowany Personal Access Token (PAT) Git w nagłówku Authorization, co prowadzi do wycieku poświadczeń do punktu końcowego wskazanego przez atakującego.
Ocena ryzyka
Atakujący może uzyskać dostęp do wewnętrznych zasobów sieciowych oraz wykraść tokeny dostępu do Git, co może prowadzić do naruszenia poufności danych, eskalacji uprawnień i dalszych ataków na infrastrukturę.
Rekomendacja
Zaktualizuj AWX do wersji, która zawiera poprawkę walidacji URL w webhookach. Dodatkowo ogranicz dostęp do szablonów z webhookami i monitoruj ruch wychodzący.
Inne podatności w AWX
Zobacz wszystkie- CVE-2026-75884Krytyczne
Wada w AWX: pole pod_spec_override w grupie kontenerów używa niekompletnej listy blokującej, która ogranicza tylko automountServiceAccountToken, umożliwiając wstrzyknięcie initContainers, nadpisań serviceAccountName i projected service account token volumes. Administrator platformy AAP może to wykorzystać do eskalacji uprawnień do dostępu na poziomie przestrzeni nazw OpenShift i eksfiltracji sekretów przestrzeni nazw.
- CVE-2026-76648Wysokie
W CopyAPIView (awx/awx/api/generics.py:873) ustawiono permission_classes = (IsAuthenticated,), więc get_object() DRF nie wykonuje kontroli RBAC na poziomie obiektu. Handler get() jawnie sprawdza request.user.can_access(obj._class_, 'read', obj), ale post() tego nie robi — sprawdza jedynie can_access(model, 'add', create_kwargs_check) oraz can_access(model, 'copy_related', obj). Dla JobTemplate uprawnienia can_add i can_copy_related nie implikują prawa odczytu źródłowego szablonu zadania.
- CVE-2026-71464Niskie
LaunchConfigurationBaseSerializer.scm_branch nie ma walidacji validate_scm_branch() sprawdzającej wiodący myślnik, w przeciwieństwie do serializatorów Project/JobTemplate/JobLaunch. Schedule i WFJT Node akceptują --upload-pack=/bin/id jako scm_branch. Obecnie blokowane w czasie działania przez sprawdzenie ValueError w jobs.py:1502 (obrona w głąb), ale luka w walidacji API oznacza poleganie wyłącznie na zabezpieczeniu warstwy zadań. Usunięcie tego zabezpieczenia podczas refaktoryzacji przekształciłoby to w RCE.
- CVE-2026-71463Niskie
Biała lista AST Jinja szablonów powiadomień sprawdza tylko statyczne węzły Getattr. Dynamiczne indeksy (job['job'+'_env']) i warunkowe bramkowanie {% if job.id > 100 %} omijają zarówno sprawdzenie AST, jak i test-render (stub ma mały job.id). W czasie działania bramkowana gałąź wykonuje się, a wyjątki zapisują pełne ślady stosu do treści powiadomienia, które jest wysyłane POSTem do kontrolowanego przez atakującego URL webhooka. Ujawnia ścieżki instalacji, wersję Pythona, numery linii źródłowych.
- CVE-2026-71462Średnie
Metoda StringListPathField.to_internal_value() wywołuje os.path.exists() na nieograniczonych ścieżkach podanych przez użytkownika. Różnica w odpowiedziach 200 vs 400 ujawnia istnienie dowolnych ścieżek bezwzględnych w podzie controller-web, w tym plików wrażliwych jak SECRET_KEY czy tokeny konta serwisowego.
- CVE-2026-71461Średnie
Metoda HostList.list() łapie wyjątek Exception i zwraca str(e) bezpośrednio. Poprzez host_filter, każdy uwierzytelniony użytkownik może wywołać Django FieldError (ujawniający pełny graf relacji modelu Host) lub PostgreSQL DataError (ujawniający surowe błędy bazy danych).
- CVE-2026-71460Średnie
Endpoint /api/v2/config/ jest chroniony tylko przez IsAuthenticated, co oznacza, że każdy uwierzytelniony użytkownik otrzymuje license_info, w tym numery kont, ID subskrypcji, pool_id, SKU, poziom wsparcia i liczbę instancji. Brama superuser/auditor obejmuje tylko inne pola, nie license_info.
- CVE-2026-71459Średnie
Widok JobJobEventsChildrenSummary nie ma modelu ani parent_model, co powoduje, że ModelAccessPermission.check_get_permissions() zwraca True dla każdego uwierzytelnionego użytkownika. Widok używa surowego get_object_or_404(Job, pk) bez sprawdzenia uprawnień na poziomie obiektu DRF, co pozwala użytkownikowi bez uprawnień odczytywać strukturę drzewa zdarzeń i enumerować ID zadań.
- CVE-2026-71458Średnie
URLModificationMiddleware rozwiązuje nazwane URL-e względem nieprzefiltrowanego Model.objects przed RBAC. Shim 403→404 tylko przepisuje odpowiedzi 403, pozostawiając ścieżkę pk=0 z innym komunikatem 404. Różnica między "Not found." a "No <Model> matches..." ujawnia, czy nazwany zasób istnieje na platformie.
- CVE-2026-71366Wysokie
Znaleziono podatność typu Server-Side Request Forgery (SSRF) w wielu backendach powiadomień AWX. Backendy webhook, Mattermost, Rocket.Chat i Grafana używają adresów URL z szablonów powiadomień jako bezpośrednich celów żądań HTTP bez walidacji adresu docelowego pod kątem prywatnych, pętli zwrotnej lub zastrzeżonych zakresów IP. Administrator powiadomień organizacji może tworzyć szablony powiadomień wskazujące na wewnętrzne adresy lub adresy pętli zwrotnej, powodując, że węzeł kontrolny AWX wysyła żądania HTTP do usług, które nie są dostępne z zewnątrz. Dodatkowo backend webhook podąża za przekierowaniami HTTP i ponownie wysyła skonfigurowane poświadczenia Basic Authentication do celów przekierowania niezależnie od zmiany hosta, co pozwala atakującemu na eksfiltrację poświadczeń powiadomień poprzez przekierowanie na kontrolowany przez atakującego host. Backend Grafana wysyła swój klucz API w nagłówku Authorization do skonfigurowanego docelowego adresu URL.
Oryginalny opis (angielski, źródło NVD)
A server-side request forgery (SSRF) vulnerability was found in AWX's webhook status callback mechanism. When processing GitHub pull request webhooks, AWX extracts the status callback URL (pull_request.statuses_url) from the incoming webhook payload without validating the target host against the expected Git provider. This URL is persisted in job extra variables and later used to send authenticated status updates. A user with admin role on a webhook-enabled job template can read the template's webhook signing key, forge a signed GitHub webhook payload with an arbitrary statuses_url, and cause AWX to POST status updates to an attacker-controlled or internal URL. The status update request includes the configured Git Personal Access Token (PAT) in the Authorization header, resulting in credential leakage to the attacker-specified endpoint.
Dane podatności pochodzą z NVD (NIST) · CISA KEV · EPSS

