Varovanie pred zneužívaním 0-day zraniteľnosti v Spring Framework (Spring4Shell)

Národné centrum kybernetickej bezpečnosti SK-CERT dňa 31.3.2021 varovalo pred 0-day zraniteľnosťou v Spring Framework, ktorý sa používa na vývoj aplikácií v jazyku Java. Keďže ide o široko používaný framework a boli zaznamenané prípady zneužitia tejto 0-day zraniteľnosti, predošlé varovanie dopĺňame týmto článkom.

Čo je Spring Framework

Spring je prostredie, ktoré umožňuje ľahko vyvíjať aplikácie v jazyku Java. Dva z jeho základných princípov sú inverzia toku riadenia a injekcia závislostí – vlastnosti, ktoré umožňujú zlepšiť modularitu programov a lepšie oddeliť jednotlivé komponenty v rozsiahlom softvéri, ale aj automatizovať a skryť “nudné opakované úlohy”, ktoré predtým bolo treba výslovne programovať.

Slovami samotných tvorcov: “Spring je všade. Flexibilným knižniciam Spring-u dôverujú vývojári po celom svete. Spring denno-denne vytvára radostné zážitky miliónom koncových používateľov – či už je to televízny stream, online nákupy alebo nespočetne veľa iných inovatívnych riešení. Do Spring-u prispievajú aj všetky veľké mená vo svete technológií, vrátane Alibaba, Amazon, Google, Microsoft a ďalších.” (zdroj: https://spring.io/why-spring).

Od základného balíka Spring Framework závisia ďalšie balíky, vrátane, napríklad, balíka Spring Boot alebo aplikačného servera Apache Tomcat. Ak je základný balík v zraniteľnej verzii, všetky ďalšie knižnice a aplikácie na ňom postavené sú tiež zraniteľné.

Podstata zraniteľnosti

Kritická zraniteľnosť, označená pod CVE-2022-22965 (CVSS skóre 9.8) ako Spring4Shell, spolu s menej závažnou zraniteľnosťou, označenou pod CVE-2022-22963, umožňujú vzdialené vykonanie kódu (RCE – remote code execution) a to z dôvodu nedostatočnej implementácie bezpečnostných mechanizmov.

Zraniteľnosť zneužíva funkcionalitu “DataBinder”. Tá slúži vo webových aplikáciách na automatické načítanie hodnôt z webovej požiadavky do premenných v Java aplikácii. Miesto toho, aby programátor musel jednotlivé formulárové polia jedno po druhom načítať z webovej požiadavky, skonvertovať z textu napríklad na čísla a ručne vložiť do premenných, postará sa o to sám framework.

Ak však tejto funkcii používateľ miesto obvyklých hodnôt z webového formulára podhodí špeciálne vytvorený obsah, môže to spôsobiť automatické volanie niektorých z existujúcich funkcií (napr. WebAppClassLoader v Apache Tomcat) v okamihu konverzie. Tieto funkcie môžu byť so správnymi parametrami zneužité na získanie plného prístupu k runtime prostrediu, kde java aplikácia beží.

V najjednoduchšom prípade teda na zneužitie zraniteľnej aplikácie stačí zaslať jej jedinú špeciálne upravenú webovú požiadavku.

Opatrenia

V súvislosti s touto zraniteľnosťou Národné centrum kybernetickej bezpečnosti SK-CERT odporúča:

  • Preveriť, či používate aplikácie, založené na frameworku Spring, jednou z nasledovných metód
    • Preveriť existenciu a zraniteľnosť softvéru podľa zoznamu https://github.com/NCSC-NL/spring4shell/tree/main/software, ktorý spravuje Holandské národné centrum kybernetickej bezpečnosti v spolupráci so svetovou bezpečnostnou komunitou. 
    • Dopytom na dodávateľov vami používaných produktov a služieb
    • Analýzou zdrojového kódu vlastných aplikácií
    • Kontrolou prítomnosti reťazca ​​org.springframework alebo súborov s týmto reťazcom v názve či už priamo na súborovom systéme, alebo v súboroch komprimovaných do jar balíkov
  • Aktualizovať aplikácie tak, aby využívali framework Spring v odporúčaných verziách
  • Ak nie je možné aplikácie aktualizovať, aplikovať aspoň dočasné riešenie
  • Po aplikácii riešenia je nevyhnutné preveriť systém na známky kompromitácie. Je dôležité poznamenať, že úspešná kompromitácia sa nemusí prejaviť v aplikačných logoch zraniteľnej aplikácie.  Po preverení známok kompromitácie odporúčame preventívne zmeniť heslá, šifrovacie kľúče a certifikáty na postihnutých zariadeniach.
  • V prípade zistenia úspešného zneužitia tejto (alebo aj akejkoľvek inej) zraniteľnosti kontaktujte prosím Národné centrum kybernetickej bezpečnosti SK-CERT na adrese [email protected].

Dočasné riešenie (v zdrojovom kóde)

Ak nie je možné aktualizovať aplikáciu tak, aby používala najnovšiu verziu frameworku, je možné využiť vlastnosť DataBinder triedy, ktorá umožňuje filtrovanie vstupných údajov. Do zdrojového kódu doplňte filter napríklad týmto spôsobom:

import org.springframework.core.Ordered;

import org.springframework.core.annotation.Order;

import org.springframework.web.bind.WebDataBinder;

import org.springframework.web.bind.annotation.ControllerAdvice;

import org.springframework.web.bind.annotation.InitBinder;

 

@ControllerAdvice

@Order(10000)

public class BinderControllerAdvice {

@InitBinder

public void setAllowedFields(WebDataBinder dataBinder) {

      String[] denylist = new String[]{"class.*", "Class.*", "*.class.*", "*.Class.*"};

      dataBinder.setDisallowedFields(denylist);

}

}

Toto nenahrádza plnohodnotné riešenie aktualizáciou frameworku a môže viesť k iným nečakaným problémom (ak vo formulároch používate kľúčové slovo class).

Dočasné riešenie (IDS/IPS/WAF)

Pre dočasnú mitigáciu odporúčame na WAF, implementovať filtrovacích pravidiel pre reťazce ako „class.*“, „Class.*“, „*.class.*“ a „*.Class.*“ v hodnotách od používateľa.

Toto nenahrádza plnohodnotné riešenie aktualizáciou frameworku a môže viesť k nečakaným problémom alebo false positive detekciám.

Zdroje


« Späť na zoznam