Software Supply Chain Failures: Opis podatności i jej wpływ
W edycji 2021 ta kategoria nazywała się A06:2021 – Vulnerable and Outdated Components i dotyczyła głównie znanych podatności w bibliotekach. W OWASP Top 10:2025 obejmuje cały łańcuch dostaw oprogramowania — rozdział został o to rozszerzony.
📦 A03:2025 – Software Supply Chain Failures
OWASP definiuje błędy łańcucha dostaw jako awarie lub kompromitacje w procesie budowania, dystrybucji albo aktualizacji oprogramowania — najczęściej przez podatności lub złośliwe zmiany w kodzie stron trzecich, narzędziach i zależnościach.
Zakres jest więc szerszy niż „mamy starą bibliotekę":
| Odcinek łańcucha | Przykład awarii |
|---|---|
| Zależności | znana podatność w bibliotece, także przechodniej; biblioteka porzucona przez opiekunów |
| Pochodzenie pakietu | pakiet pobrany z niewłaściwego repozytorium (dependency confusion), podszywanie się pod nazwę |
| Build i CI/CD | pipeline słabiej chroniony niż systemy, które wdraża; złośliwy kod uruchamiany przy budowaniu |
| Dystrybucja i aktualizacje | skompromitowany dostawca wypuszcza złośliwą aktualizację podpisaną prawdziwym kluczem |
| Stanowiska deweloperów | przejęte tokeny publikacji, złośliwe rozszerzenia IDE |
Skąd ta kategoria na #3?
- Została wybrana w ankiecie społeczności: według OWASP dokładnie 50% respondentów umieściło ją na pierwszym miejscu.
- Według wstępu edycji ma najmniej wystąpień w danych, a strona kategorii podaje tylko 11 CVE z powiązanymi CWE. Autorzy tłumaczą to trudnością testowania, nie rzadkością problemu.
- Tam, gdzie ją testowano, ma najwyższą średnią częstość wśród kategorii — tekst strony kategorii podaje 5,19%, tabela na tej samej stronie 5,72%.
- Według wstępu ma też najwyższe średnie oceny exploitowalności i wpływu z CVE.
Źródło: A03:2025 na owasp.org. Uwaga: strona kategorii nie jest w pełni spójna ze wstępem edycji — tabela podaje 6 zmapowanych CWE, wstęp mówi o 5.
Przykłady ataków
Scenariusze opisane przez OWASP:
- SolarWinds (2019) — skompromitowany zaufany dostawca; według OWASP ok. 18 000 organizacji przejętych przez aktualizację.
- Bybit (2025) — kradzież 1,5 mld USD przez złośliwy kod w oprogramowaniu portfela, który uruchamiał się tylko przy użyciu konkretnego portfela.
- Shai-Hulud (2025) — według OWASP pierwszy samorozprzestrzeniający się robak w npm: skrypt
post-installwykradał dane, a znalezione tokeny npm wykorzystywał do publikowania złośliwych wersji kolejnych pakietów. Objął ponad 500 wersji pakietów. - Log4Shell (CVE-2021-44228) i Struts 2 (CVE-2017-5638) — klasyczne RCE w komponentach, które działają z uprawnieniami aplikacji.
Spoza listy OWASP warto znać xz-utils (CVE-2024-3094): złośliwy kod był w tarballach wydań od wersji 5.6.0, a proces budowania liblzma wyciągał go z pliku udającego dane testowe. Lockfile i weryfikacja podpisu nic by tu nie dały — złośliwe było oficjalne wydanie.
🧨 Potencjalne skutki
- Zdalne wykonanie kodu (RCE) — komponent działa z uprawnieniami aplikacji.
- Kradzież sekretów z maszyn deweloperów i runnerów CI (tokeny, klucze chmurowe).
- Trwała obecność napastnika — złośliwy kod w artefakcie trafia na każde środowisko, na które go wdrożysz.
- Rozprzestrzenianie się na klientów — Twoja aplikacja staje się ogniwem cudzego łańcucha dostaw.
🛑 Dlaczego do tego dochodzi?
Według OWASP jesteś podatny, jeśli m.in.:
- nie śledzisz wersji wszystkich komponentów, łącznie z zależnościami przechodnimi,
- nie skanujesz regularnie podatności i nie subskrybujesz biuletynów bezpieczeństwa,
- łatki instalujesz raz w miesiącu lub kwartale w ramach change management, co zostawia dni lub miesiące niepotrzebnej ekspozycji,
- jedna osoba może napisać kod i wypchnąć go aż na produkcję bez przeglądu drugiej osoby,
- pipeline CI/CD jest słabiej zabezpieczony niż systemy, które buduje i wdraża.
⚖️ Lista CVE to za mało
Wynik skanera zależności to dopiero początek analizy:
- Podatność w zależności to jeszcze nie podatność w aplikacji. Alert znaczy coś dopiero wtedy, gdy podatna funkcja jest osiągalna z Twojego kodu. Ślepe podbijanie wersji daje pracę bez zysku i ryzyko regresji (Malcolm McDonald, Grokking Web Application Security, 2024, s. 99, 276). Odłożona łatka pozostaje jednak długiem do spłacenia.
- Pusty raport skanera opisuje zasięg skanu, a nie stan systemu — SCA nie zobaczy złośliwego, ale „czystego" w bazach CVE pakietu.
- Integralność ma granice — podpis i lockfile chronią przed podmianą po drodze, nie przed złośliwym wydaniem u źródła (xz-utils).
✅ Dobre praktyki
- Utrzymuj SBOM (Software Bill of Materials) całej aplikacji — ASVS 5.0 wymaga tego na poziomie L2 (wymaganie 15.1.2).
- Określ terminy łatania zależności według ryzyka i ich przestrzegaj (ASVS 15.1.1 i 15.2.1, poziom L1).
- Pobieraj pakiety tylko z oczekiwanych repozytoriów — bez ryzyka dependency confusion (ASVS 15.2.4, L3).
- Usuwaj nieużywane zależności, funkcje i pliki — mniejsza powierzchnia ataku.
- Wdrażaj aktualizacje etapami (canary, staged rollout), żeby ograniczyć skutki skompromitowanego dostawcy.
- Chroń repozytorium, stacje deweloperów i CI/CD: MFA, najmniejsze uprawnienia, sekrety ograniczone do środowiska, podpisane buildy.
W kolejnym kroku: Metody testowania podatności