
Guide en norvégien sur les vulnérabilités Log4j (CVE-2021-44228, CVE-2021-45046, CVE-2021-45105, CVE-2021-4104, CVE-2019-17571) avec des scripts de détection, des étapes d'atténuation et des cartes mentales pour identifier et corriger les systèmes affectés.
Mise à jour 19.12.2021 : De nouvelles vulnérabilités et de nouvelles façons de les exploiter sont constamment découvertes dans Log4j. Nous avons ajouté trois organigrammes (mind maps) dans le gitrepo qui décrivent respectivement version vulnérable de Log4j, comment vérifier si on est vulnérable et atténuation des différentes vulnérabilités.
Identifier les logiciels qui utilisent Log4j version 2.x
Atténuer les vulnérabilités dans Log4j
Si ce qui précède n'est pas possible
Context Lookups dans les Pattern Layouts dans la configuration de Log4j2Identifier les logiciels qui utilisent Log4j version 1.x.
Si Log4j version 1.x est utilisé dans l'entreprise, dialoguez avec le fournisseur et exigez qu'ils
Le grand méchant loup des vulnérabilités dans Log4j. La vulnérabilité est exploitée lorsqu'une variante de la chaîne ${jndi:ldap://\<code d'attaque>/a} est journalisée par Log4j. CVSS 10.0, RCE.
Pas aussi grave que CVE-2021-44228, mais tout aussi méchant. Nécessite une configuration non standard de Log4j. CVSS 9.0, RCE et DoS.
Pas aussi grave que CVE-2021-44228, aussi un peu moins méchant. CVSS 7.5, DoS
Concerne uniquement Log4j version 1.x. Nécessite que Log4j utilise JMSAppender. CVSS 6.6, RCE L'exploitation nécessite que Log4j utilise JMSAppender. Soit par JMSAppender configuré directement - ce qui est rare - soit par l'attaquant l'ajoutant lui-même à la configuration de Log4j. De plus, l'attaquant doit avoir accès pour modifier la configuration de JMSAppender. Si c'est le cas, l'attaquant aura normalement déjà accès au système. La vulnérabilité est donc considérée comme peu pertinente.
Concerne uniquement Log4j version 1.x. Nécessite que Log4j utilise SocketServer. CVSS 9.8, RCE Donne à un attaquant ayant un accès réseau au socket concerné la possibilité d'exécuter du code. Le code d'exploitation est publiquement disponible.
Pour Java 8, Log4j v. 2.17.0 est la dernière version. Elle atténue toutes les vulnérabilités ci-dessus.
La version 2.16.0 atténue les pires vulnérabilités.
Pour Java 7, Log4j a été publié en version 2.12.2. Celle-ci n'atténue pas CVE-2021-45105. L'équipe derrière Log4j dit d'ailleurs que ni Java 6 ni Java 7 ne sont plus supportés. Il est incertain qu'ils publient une autre mise à jour de sécurité pour Log4j sur Java 7.
L'organigramme "Mind map #1" donne un bon aperçu des conditions pour savoir si l'on a les différentes vulnérabilités.

Créé par Loïc Castel. Tiré de github.
Une partie du défi est que ce ne sont pas nécessairement les serveurs directement exposés à Internet qui sont vulnérables. La vulnérabilité peut se trouver dans un serveur plus loin dans la 'chaîne' qui reçoit les mêmes données et les journalise. Cela peut rendre difficile de savoir ce qui est exposé et ce qui ne l'est pas.
L'organigramme "Mind map #2" donne un bon aperçu de comment vérifier ses propres systèmes pour les vulnérabilités.
Créé par Loïc Castel. Tiré de github.


- User-agent
- Champ de recherche
- Nom d'utilisateur
- ...
4. Suivez les alertes canari et découvrez où log4j s'exécute.
Réf : Tweet de Florian Roth
Celle-ci prend tous les disques, y compris les lecteurs réseau mappés :
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
Si l'on souhaite uniquement vérifier les disques locaux :
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
Si l'on souhaite en plus vérifier le journal des événements sur la machine.
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
L'organigramme "Mind map #3" donne un aperçu des possibilités d'atténuation.
Créé par Loïc Castel. Tiré de github.
Ci-dessous, nous avons listé quelques ressources pour effectuer les atténuations.
Mettez à jour Log4j vers la v 2.17.0
Mettez à jour Log4j vers la v 2.12.2 ATTENTION n'atténue pas CVE-2021-45105
⚠️ cette méthode n'est plus considérée comme une solution complète car elle n'atténue pas toutes les vulnérabilités dans toutes les situations.
[Environment]:https://raw.githubusercontent.com/helsecert/cve-2021-44228/HEAD/:SetEnvironmentVariable(%22LOG4J_FORMAT_MSG_NO_LOOKUPS%22,%22true%22,%22Machine%22)
REMARQUE : Nécessite un redémarrage
De https://twitter.com/CyberRaiju/status/1469505680138661890
"‐Dlog4j2.formatMsgNoLookups=True"
Exemple de ligne de commande :
JAVA_OPTS="-Dlog4j2.formatMsgNoLookups=true" teku --network mainnet
Ou avec une valeur -Xmx :
JAVA_OPTS="-Dlog4j2.formatMsgNoLookups=true -Xmx4g" teku
Exemple de configuration systemd :
Environment='JAVA_OPTS="-Dlog4j2.formatMsgNoLookups=true"'
Ou avec une valeur -Xmx :
Environment='JAVA_OPTS="-Dlog4j2.formatMsgNoLookups=true" "-Xmx4g'
Un fichier jar est une archive (fichier zip) et peut être ouvert. Les fichiers peuvent ensuite être supprimés. Cela peut être fait manuellement avec des outils comme 7-zip (voir image) ou en utilisant un script.
Nécessite un redémarrage de l'application
Ref: https://mogwailabs.de/en/blog/2021/12/vulnerability-notes-log4shell/9

[Reflection.Assembly]:https://raw.githubusercontent.com/helsecert/cve-2021-44228/HEAD/:LoadWithPartialName(%27System.IO.Compression%27)
$JarFilLokasjon = 'C:\temp\log4j-core-2.13.0-test.jar'
$Filnavn = 'JndiLookup.class' #Cette ligne est supprimée !
$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
À exécuter en tant que root
lsof | grep log4j-core
Ceci est chargé lors du redémarrage de l'application De https://github.com/ConsenSys/teku/security/advisories/GHSA-mwfw-vm54-g3p7