Objavljeno: 10.12.2021
Zadnja posodobitev: 2.2.2022
Povzetek
Kritična ranljivost knjižnice Log4j omogoča napadalcu izvedbo poljubne programske kode na ranljivem sistemu (RCE – Remote Code Execution). Ranljivost se proži ob zapisu podatka v dnevnik in se lahko izrablja tudi na sistemih, ki niso javno dostopni na internetu, vendar do njih vodi ustrezna podatkovna pot. Ranljivost najdemo tako v odprtokodnih aplikacijah, lastnih rešitvah in številnih komercialnih produktih. Identifikacija vseh ranljivih komponent je zahtevna, univerzalne rešitve za različne postavitve sistemov ni.
Opis
V programski knjižnici Java logging library Log4j je bila odkrita kritična ranljivost z oznako CVE-2021-44228, ki napadalcem omogoča izvajanje poljubne kode na sistemu (RCE – Remote Code Execution) ali krajo občutljivih informacij. Do zlorabe ranljivosti pride ob zapisu posebnega niza znakov, ki vsebuje JNDI zahtevek, v dnevniško datoteko. Ranljivost se že aktivno izkorišča v napadih na omrežju. Kasneje so bile v predmetni knjižnici odkrite še naslednje ranljivosti:
- CVE-2021-45046, ki omogoča izvedbo kode na daljavo (RCE);
- CVE-2021-45105, ki omogoča izvedbo napada z zavrnitvijo storitve (DoS, Denial-of-service);
- CVE-2021-44832, ki omogoča izvedbo poljubne kode (RCE), če lahko napadalec spreminja Log4j konfiguracijo.
Ranljivosti so bile odkrite tudi v verziji knjižnice Log2j verzije 1.x, ki pa se ji je podpora iztekla avgusta 2015 in za katere proizvajalec ne bo izdal popravkov, in sicer:
- CVE-2021-4104, ki omogoča izvedbo poljubne kode (RCE), če lahko napadalec spreminja Log4j konfiguracijo;
- CVE-2022-23302, ki omogoča izvedbo poljubne kode (RCE), če Log4j uporablja JMSSink (gre za neprivzeto konfiguracijo);
- CVE-2022-23305, ki omogoča izvedbo poljubne kode (RCE), če Log4j uporablja JDBCAppender (gre za neprivzeto konfiguracijo);
- CVE-2022-23307, ki je kritična ranljivost chainsaw komponente, ocenjena z najvišjo oceno resnosti, in omogoča izvedbo poljubne kode na daljavo (RCE).
Log4j je popularna programska knjižnica, ki jo uporablja veliko število Java aplikacij. Ranljive so tako strežniške aplikacije kot odjemalci. Posebej opozarjamo, da so lahko ranljive tudi aplikacije, ki niso javno dostopne, vendar pa procesirajo podatke iz javno dostopnih virov (npr. obdelovanje dnevniških zapisov). Ranljivost je mogoče izkoristiti tudi v aplikacijah, ki imajo odprt web socket zgolj lokalno na sistemu, npr. preko napada v mimohodu.
Ranljive verzije knjižnice
Ranljive so verzije Apache Log4j od vključno 2.0-beta9 do vključno 2.17.0, ter verzije 1.x.
Ranljivi produkti
Številne programske rešitve, aplikacije in naprave uporabljajo knjižnico, kar še poveča izpostavljenost ranljivosti. Za preverjanje stanja posameznega proizvajalca priporočamo seznam, ki ga vodi nizozemski NCSC-NL in se posodablja s podatki ostalih članov Mreže CSIRT: https://github.com/NCSC-NL/log4shell, razdelek “software”.
Iskanje ranljivih knjižnic
Pri iskanju ranljivih Log4j knjižnic na sistemu si lahko pomagate z orodjem log4jscanner, ki ga je na GitHub.org objavil Google. Orodje omogoča tudi popravek nameščenih JAR knjižnic z odstranitvijo JndiLookup.class
razreda.
Priporočeni ukrepi za lastno razvite in odprtokodne aplikacije
Skrbnikom sistemov svetujemo čimprejšnjo identifikacijo vse programske opreme, ki uporablja ranljivo knjižnico, ter namestitev popravkov oz. izvedbo mitigacijskih mehanizmov.
Priporočamo nadgradnjo knjižnice na zadnjo verzijo. Trenutno je zadnja verzija 2.17.1, ki je bila izdana 27.12.2021. Uporabo knjižnice verzije 1.x močno odsvetujemo, saj se ji je podpora iztekla že avgusta 2015, vsebuje pa kritične ranljivosti, ki jih proizvajalec ne bo več odpravljal.
Če namestitev popravka ni mogoča, proizvajalec priporoča odstranitev JndiLookup.class
iz iskalne poti (classpath). To lahko storite z orodjem log4jscanner, ali ročno z ukazom oblike:
zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
Bolj natančno so mitigacijski mehanizmi za preprečevanje izrabe objavljeni na spletni strani proizvajalca. Opozarjamo, da je po podatkih proizvajalca predhodno priporočena izvedba mitigacije preko stikala log4j2.formatMsgNoLookups
oz. spremenljivke LOG4J_FORMAT_MSG_NO_LOOKUPS
pomanjkljiva oz. nezadostna.
Priporočeni ukrepi za druge produkte
V primeru uporabe aplikacij, ki uporabljajo ranljivo knjižnico, in te ni možno enostavno zamenjati, spremljajte obvestila proizvajalca aplikacije. Obsežen seznam ranljive programske opreme in trenutni status zaščite se nahaja na spletni strani https://github.com/NCSC-NL/log4shell/tree/main/software
V Windows sistemih se lahko ranljiva programska oprema identificira s spodnjim Powershell ukazom:
gci 'C:\' -rec -force -include *.jar -ea 0 | foreach {select-string "JndiLookup.class" $_} | select -exp Path
Skrbnikom sistemov svetujemo detekcijo oz. blokado izhodnega prometa, ki ni potreben za delovanje sistema (npr. DNS, LDAP, RMI ipd.). Uspešna izraba ranljivosti se lahko kaže v dnevniški datoteki aplikacije, če ta vsebuje niz “com.sun.jndi.” (gre za nepreverjeno informacijo).
Detekcija poskusov zlorabe ranljivosti
Splošni regularni izraz za prepoznavo poskusa zlorabe ranljivosti je:
\${(\${(.*?:|.*?:.*?:-)('|"|`)*(?1)}*|[jndi:lapsrm]('|"|`)*}*){9,11}
Poskusi zlorab ranljivosti so razvidni v dnevniških datotekah spletnih strežnikov v zahtevkih, ki pri najbolj enostavnih poskusih v enem od parametrov vsebujejo niz v obliki ${jndi:ldap://…}. Pri iskanju se lahko uporabi Yara pravilo ali ukaz v spodnji obliki (za bolj natančne zadetke uporabite zgornji regularni izraz, spodnjega podajamo za namen boljše berljivosti in ponazoritve):
egrep -i -r '\$\{jndi:(ldap[s]?|rmi)://[^\n]+' /var/log
find /var/log -name \*.gz -print0 | xargs -0 zgrep -E -i '\$\{jndi:(ldap[s]?|rmi)://[^\n]+'
Nizi so lahko zamaskirani, večji nabor zato najde prvi regularni izraz. Uporabite lahko orodje log4shell-detectorV primeru uporabe nekaterih javno dostopnih skript za zamaskiranje kode je edini prepoznavni vzorec poskusa zlorabe niz znakov celo samo ${
.
Indikatorji zlorabe (IoC)
Spisek različnih seznamov indokatorjev zlorabe (IoC, Indicator of Compromise) najdete na:
Zunanje povezave
- Navodila proizvajalca (Apache Software Foundation)
- LunaSec: Log4Shell: RCE 0-day exploit found in log4j 2, a popular Java logging package (opis ranljivosti)
- Cloudflare: Inside the Log4j2 vulnerability (CVE-2021-44228) (opis ranljivosti)
- SANS ISC: RCE in log4j, Log4Shell, or how things can get bad quickly (opis ranljivosti)
- Repozitorij s seznamom ranljivih produktov, orodij za iskanje ranljivih komponent, indikatorjev zlorabe (NCSC-NL, s sodelovanjem članov Mreže CSIRT)
- Google log4jscanner (skripta za preverjanje ranljivosti in popravke JAR knjižnic)
- Northwave Log4j CVE-2021-44228 checker (skripta za preverjanje ranljivosti)
- log4shell.nse (nmap skripta za preverjanje ranljivosti)
- Druga orodja za enostavno preverjanje ranljivosti: https://log4j-tester.trendmicro.com/, https://log4shell.huntress.com/
- Seznam zgoščenih vrednosti ranljivih knjižnic:
- https://github.com/mubix/CVE-2021-44228-Log4Shell-Hashes
- Seznam callback domen, zabeleženih v napadih:
- https://gist.github.com/superducktoes/9b742f7b44c71b4a0d19790228ce85d8
- Seznam IP naslovov, zabeleženih v napadih:
- https://gist.github.com/gnremy/c546c7911d5f876f263309d7161a7217