Krytyczna luka w python-socketio pozwala przejąć serwery przez kolejkę komunikatów (CVE-2025-61765)

securitybeztabu.pl 1 tydzień temu

Wprowadzenie do problemu / definicja luki

W bibliotece python-socketio (implementacja Socket.IO dla Pythona) ujawniono podatność CVE-2025-61765, która w środowiskach wieloserwerowych umożliwia zdalne wykonanie kodu (RCE) poprzez złośliwą deserializację komunikatów przesyłanych przez wewnętrzną kolejkę wiadomości (np. Redis, RabbitMQ). Błąd dotyczy wersji < 5.14.0 i wynika z użycia modułu pickle do wymiany danych między procesami. Producent usunął pickle i przeszedł na JSON w wydaniu naprawczym.

W skrócie

  • ID: CVE-2025-61765
  • Zakres wersji: od bardzo wczesnych wydań do < 5.14.0
  • Wektor ataku: atakujący, który uzyska dostęp do kolejki komunikatów używanej przez klaster python-socketio, może wstrzyknąć spreparowany „pickle”, który zostanie wykonany po stronie serwera.
  • Skutki: pełne wykonanie arbitralnego kodu w kontekście serwera aplikacyjnego; możliwe przejęcie systemu i danych.
  • Ocena ryzyka: średnio-wysokie — zależne od ekspozycji kolejki; nie jest to „pre-auth over the Internet”, ale często krytyczne w realnych, źle zabezpieczonych wdrożeniach. (Przykładowe klasyfikacje i analizy ryzyka publikują bazy NVD/Wiz/Miggo).
  • Naprawa: aktualizacja do >= 5.14.0 (zmiana serializacji na JSON) + utwardzenie kolejki.

Kontekst / historia / powiązania

Problem jest klasycznym przypadkiem insecure deserialization (CWE-502) w ekosystemie Pythona: pickle jest niebezpieczny dla niezaufanych danych i wielokrotnie był źródłem RCE w bibliotekach serwerowych. W tym incydencie błąd ogranicza się do komunikacji międzyserwerowej — ale w praktyce liczne wdrożenia mają kolejki MQ dostępne w tej samej sieci co aplikacje lub choćby (błędnie) wystawione na zewnątrz. Analizy bezpieczeństwa i doradcy branżowi zwracają uwagę, iż łatanie pojedynczej biblioteki nie rozwiązuje systemowego nadużycia pickle.

Analiza techniczna / szczegóły luki

  • Architektura klastrowa: python-socketio w trybach wieloprocesowych/wieloserwerowych wykorzystuje kolejkę MQ do przesyłania komunikatów sterujących (np. rozsyłanie zdarzeń do wszystkich węzłów).
  • Słaby punkt: starsze wersje serializowały komunikaty pickle, a po stronie odbiorcy wykonywały pickle.loads(). Złośliwy obiekt „pickle” może zdefiniować metody (__reduce__ itp.), które spowodują wykonanie dowolnego kodu w trakcie deserializacji.
  • Warunek wstępny ataku: napastnik musi przejąć dostęp do kolejki (np. błędna konfiguracja, brak uwierzytelnienia TLS/ACL, ekspozycja portu, wcześniejsza kompromitacja). Wtedy wysyła spreparowany komunikat, który zostaje automatycznie odczytany i uruchamia się w procesie serwera.
  • Zmiana w patchu: od 5.14.0 komunikacja międzyserwerowa zamiast pickle używa JSON, eliminując egzekucję kodu podczas deserializacji. Dystrybutorzy Linuksa publikują aktualizacje bezpieczeństwa potwierdzające tę zmianę.

Praktyczne konsekwencje / ryzyko

  • Przejęcie serwera aplikacyjnego: RCE w procesie python-socketio = możliwość doinstalowania web-shella, kradzież sekretów (kluczy API, tokenów), eskalacja przywilejów w systemie.
  • Ruch lateralny: przejęty węzeł klastra może być trampoliną do innych usług w VPC/segmentach.
  • Wpływ na dostępność: sabotaż broadcastów zdarzeń, DoS przez toksyczne komunikaty w kolejce.
  • Ślad w logach: artefakty w logach MQ (nietypowe ładunki), anomalie w dziennikach workerów/uwsgi/gunicorna, nagłe spajki CPU podczas deserializacji.

Rekomendacje operacyjne / co zrobić teraz

  1. Natychmiastowa aktualizacja
    • Produkcja i staging: podnieś python-socketio do >= 5.14.0.
    • Przykład: pip install --upgrade "python-socketio>=5.14.0" pip freeze | grep python-socketio
    • Zweryfikuj, iż nowe obrazy/kontenery używają zaktualizowanej wersji. Dystrybucje (np. SUSE) wydały już advisory z poprawką JSON→zamiast pickle.
  2. Utwardź kolejkę MQ (Redis/RabbitMQ/Kafka):
    • Brak ekspozycji publicznej, sieciowe segregacje (VPC/NSG/SG), dostęp tylko z hostów aplikacyjnych.
    • Uwierzytelnianie, ACL, TLS, rotacja haseł/kluczy; monitoring kanałów i rozmiaru kolejek.
  3. Higiena aplikacyjna i IR:
    • Przegląd logów kolejek i workerów od co najmniej 30 dni wstecz pod kątem nietypowych ładunków/deserializacji.
    • Jeżeli masz ślady kompromitacji: rotacja sekretów, ponowna emisja tokenów sesyjnych, przegląd kont/kluczy usługi.
    • Testy bezpieczeństwa: skan zależności (SCA) i audyt innych bibliotek używających pickle.
  4. Polityka na przyszłość:
    • Zakaz pickle w komponentach komunikacyjnych; preferuj JSON/MessagePack/Protobuf.
    • Wymuś review architektury klastra i „assume breach” w komponentach MQ.

Różnice / porównania z innymi przypadkami

W odróżnieniu od typowych zdalnych RCE dostępnych „z internetu”, tu warunkiem jest dostęp do wewnętrznej kolejki MQ. To ogranicza powierzchnię ataku, ale w wielu środowiskach „wewnętrzne” nie znaczy „bezpieczne” (mis-konfiguracje, brak uwierzytelnienia, łańcuch ataków). To także odróżnia CVE-2025-61765 od podatności w endpointach HTTP Socket.IO — problem dotyczy warstwy międzyserwerowej i deserializacji pickle.

Podsumowanie / najważniejsze wnioski

  • Zaktualizuj natychmiast do ≥ 5.14.0 i sprawdź obrazy/kontenery.
  • Zabezpiecz kolejkę MQ (TLS/ACL/segregacja sieci), bo to wektor ataku.
  • Audytuj logi pod kątem anomalii w komunikacji międzyserwerowej i rotuj sekrety przy podejrzeniu incydentu.
  • Traktuj pickle jako niedozwolony do komunikacji z komponentami, które mogą przetwarzać dane z niezaufanego źródła.

Źródła / bibliografia

  • SC Media: „Python-socket.io module flaw lets attackers access business servers”, 27 października 2025. (SC Media)
  • GitHub Security Advisory dla python-socketio (GHSA-g8c6-8fjj-2r4m). (GitHub)
  • NVD – wpis dla CVE-2025-61765. (NVD)
  • SUSE: ogłoszenie aktualizacji bezpieczeństwa (JSON zamiast pickle). (suse.com)
  • Wiz/Miggo/Snyk – analizy wpływu i opis wektora przez złośliwą deserializację w środowiskach multi-server. (wiz.io)
Idź do oryginalnego materiału