3cx
Recherche sur les menaces

Des utilisateurs du logiciel 3CX victimes d’une attaque par chargement latéral de DLL : ce que vous devez savoir

Une version tojanisée du logiciel populaire VOIP/PBX fait actuellement la une de l’actualité : voici les actions menées par les chasseurs et les défenseurs.

Sophos X-Ops suit de près un incident en cours concernant une attaque à priori de type supply chain, potentiellement lancée par un groupe lié à un État-nation. Cet article va vous donner une vue d’ensemble de la situation, une analyse des menaces, des informations pour les chasseurs et les protections en matière de détection.

Nous mettrons à jour cet article au fur et à mesure de l’évolution des événements et de notre compréhension globale de la situation, notamment en vous donnant des conseils sur les menaces et la détection.

[Dernière version publiée à 23h00 UTC le 1er avril 23, ajout de Troj/Steal-DLG aux protections de détection/à la détection statique, et deux autres requêtes que les clients peuvent utiliser pour déterminer leur exposition à cette attaque, ainsi qu’une nouvelle analyse concernant une récente piste d’investigation visant un mécanisme d’horodatage dans le code malveillant sans oublier des informations sur l’analyse d’autres applications développées par Electron à l’aide de ffmpeg.dll.

À 23:30 UTC 30-Mars-23, ajout de détails sur les versions affectées, la mauvaise utilisation de ffmpeg.dll, la suppression du référentiel malveillant, la comparaison du chargeur de shellcode PE avec celui utilisé par le groupe malveillant Lazarus, et davantage de requêtes que les clients peuvent utiliser pour déterminer leur exposition à cette attaque, ainsi que diverses autres détections supplémentaires].

Vue d’ensemble

Le logiciel concerné est 3CX : un système téléphonique logiciel PBX légitime, disponible sous Windows, MacOS, Linux, Android et iOS. Certaines versions Windows et MacOS de l’application ont été abusées par un acteur malveillant afin d’ajouter un programme d’installation qui communique avec divers serveurs command-and-control (C2).

Le logiciel est une version signée numériquement du client de bureau (Desktop) softphone pour Windows et MacOS, qui contient une charge virale malveillante. Selon 3CX, leur mise à jour 7 pour Windows, les numéros de version 18.12.407 et 18.12.416, et les numéros de version de l’application Electron Mac 18.11.1213, 18.12.402, 18.12.407 et 18.12.416, sont concernés. L’événement post-exploitation le plus courant que nous ayons pu observer jusqu’à présent est la présence d’un voleur d’informations (infostealer) qui cible le (ou les) navigateur(s) sur un système compromis. Au moment d’écrire ces lignes, 3CX avait abandonné les versions concernées de l’application Windows.

Pour l’instant, les seules plateformes confirmées par nos données clients comme étant affectées sont Windows et MacOS, ce qui est en accord avec les informations émanant de 3CX concernant les plateformes concernées. Selon les informations sur leur forum support, les versions Android et iOS du logiciel ne seraient pas affectées.

Le NIST suit ce problème sous la dénomination CVE-2023-29059.

Analyse des menaces

Le 22 mars, les utilisateurs de 3CX ont commencé à échanger sur de potentielles détections de faux positifs concernant 3CXDesktopApp par leurs agents de sécurité endpoint.

3cx

Figure 1 : Le processus de mise à jour au moment où la version malveillante est apparue

Sophos MDR a identifié pour la première fois une activité malveillante dirigée contre ses propres clients et provenant de 3CXDesktopApp le 29 mars 2023. De plus, Sophos MDR a observé que la campagne utilisait un stockage de fichier public pour héberger des malwares encodés. Ce référentiel est utilisé depuis le 8 décembre 2022 ; mais le 29 mars, après une large diffusion de l’information concernant cette compromission, le référentiel a été supprimé.

L’attaque s’articule autour d’un scénario de chargement latéral de DLL, avec un nombre remarquable de composants impliqués. Cette stratégie permet à priori aux clients d’utiliser le package de bureau (Desktop) 3CX sans rien remarquer d’inhabituel concernant ce dernier. Nous avons identifié trois composants majeurs :

  • 3CXDesktopApp.exe : le chargeur légitime.
  • d3dcompiler_47.dll : une DLL avec l’ajout d’une charge virale chiffrée.
  • ffmpeg.dll : un chargeur trojanisé (à savoir infecté par un cheval de Troie).

La figure 2 donne un aperçu macroscopique du flux d’attaque tel qu’il apparait dans Windows ; il existe quelques variations mineures dans les étapes ultérieures avec la version MacOS.

3cx

Figure 2 : Une vue macroscopique du flux d’attaque

Le fichier ffmpeg.dll contient une URL intégrée qui a récupéré une charge virale .ico encodée et malveillante à partir du stockage de fichiers GitHub à l’adresse suivante : https[:]//raw.githubusercontent.com/IconStorages/images/main/. Rappelons, tout de même, que suite à une large diffusion de l’information concernant cette compromission, ce référentiel a été supprimé.

Nous avons vu plusieurs variantes du fichier ffmpeg.dll, dont une signée par le propre certificat de 3CX ; ces dernières semblent être des versions corrigées de manière malveillante du fichier ffmpeg.dll légitime. Dans un communiqué publié jeudi, l’équipe responsable du code source de ffmpeg a fait en sorte de défendre son travail afin d’éviter tout amalgame avec cette compromission 3CX.

3cx

Figure 3 : Quand ffmpeg est intervenu sur Twitter pour défendre son code

Dans un scénario normal de chargement latéral de DLL, le chargeur malveillant (ffmpeg.dll) est censé remplacer la dépendance légitime ; sa seule fonction est alors de mettre en file d’attente la charge virale. Cependant, dans notre cas, ce chargeur est également entièrement fonctionnel, comme il le serait normalement dans le produit 3CX, mais à la place, on trouve une charge virale supplémentaire intégrée dans la fonction DllMain. Cette approche augmente la taille des paquets, mais permet certainement de ne pas trop éveiller les soupçons : en effet, l’application 3CX abusée fonctionne comme prévu, même lorsque les adresses du cheval de Troie (Trojan) ont atteint la balise C2.

Dans le cadre de notre analyse, nous avons également comparé le fichier ffmpeg.dll dans 3CX avec le même fichier présent dans d’autres applications Electron. Notre analyse a montré que seul le fichier ffmpeg.dll de 3CX contenait le code malveillant. Nous en concluons donc que cette compromission n’affecte pas les autres applications Electron, mais seulement ffmpeg.dll de 3CX.

3cx

Figure 4 : L’expérience vécue par les développeurs et clients 3CX concernés

Permettre à un logiciel abusé de rester fonctionnel n’est pas différent des autres cas de chargement latéral de DLL que nous avons pu observer, mais cette campagne est légèrement différente même si on la compare à la récente vague de cas de chargement latéral de DLL que nous avons observée. En particulier, nous avons noté que le chargeur de shellcode PE utilisé est unique si on le compare à nos observations passées. Auparavant, nous ne l’avions vu que dans des incidents attribués au groupe Lazare ; le code utilisé dans cet incident offre une correspondance octet par octet avec de précédents échantillons.

Analyse et vérification de l’horodatage

Dans le cadre de notre investigation en cours, nous avons trouvé un mécanisme d’horodatage dans le code, comme indiqué ci-dessous.

3cx

Figure 5 : Le mécanisme d’horodatage présent dans le code

En regardant ce dernier, nous pouvons voir une boucle while qui appelle la fonction check_timestamp et reçoit une valeur entière de 64 bits en lien avec l’appel API GetSystemTimeAsFileTime. Les résultats de check_timestamp sont évalués par rapport à “v6”, une variable qui contient la valeur provenant de cbData. cbData est collecté à partir du fichier “manifest” comme indiqué ci-dessous.

3cx

Figure 6 : Collecte des cbData

“Manifest” est un fichier que le malware inscrit sur le système dans le dossier “3cxdesktopapp” au cours de la phase initiale de l’infection. Lorsque le fichier manifest est créé, une valeur dword est inscrite en fonction de l’horodatage actuel, avec des opérations arithmétiques supplémentaires effectuées sur cette dernière.

Le code ci-dessus vérifie si le fichier manifest existe et est accessible en écriture ; si c’est bien le cas, il ajoute 7 jours + l’horodatage actuel du système + un pourcentage généré de manière aléatoire (rand[]) et appliqué à une valeur représentant 21 jours. En d’autres termes, la valeur peut atteindre une avance totale de 28 jours. Sinon, il lit simplement la valeur existante à partir du fichier manifest.

Tant que les résultats de check_timestamp sont inférieurs à v6 (la valeur d’horodatage du fichier manifest), la boucle continue d’être en veille. Ce n’est qu’une fois que les résultats de check_timestamp sont supérieurs à l’horodatage du fichier manifest que le code se déclenche et génère la requête HTTP pour se connecter à GitHub, qui lance alors le téléchargement de la charge virale.

Informations sur les opérations de chasse

Déterminer l’impact avec Sophos XDR

1. Déterminer si les hôtes ont communiqué avec l’infrastructure des acteurs malveillants : Data Lake (Lac de Données)

La requête ci-dessous recherchera les hôtes qui ont communiqué avec les différentes URL connues et utilisées dans cette campagne.

SELECT
  meta_hostname,
  sophos_pids,
  domain,
  clean_urls,
  source_ips,
  destination_ips,
  timestamps,
  ingestion_timestamp
FROM
  xdr_data
WHERE
  query_name = 'sophos_urls_windows'
  AND
    (LOWER(domain) LIKE '%akamaicontainer[.]com%'
    OR LOWER(domain) LIKE '%akamaitechcloudservices[.]com%'
    OR LOWER(domain) LIKE '%azuredeploystore[.]com%'
    OR LOWER(domain) LIKE '%azureonlinecloud[.]com%'
    OR LOWER(domain) LIKE '%azureonlinestorage[.]com%'
    OR LOWER(domain) LIKE '%dunamistrd[.]com%'
    OR LOWER(domain) LIKE '%glcloudservice[.]com%'
    OR LOWER(domain) LIKE '%journalide[.]org%'
    OR LOWER(domain) LIKE '%msedgepackageinfo[.]com%'
    OR LOWER(domain) LIKE '%msstorageazure[.]com%'
    OR LOWER(domain) LIKE '%msstorageboxes[.]com%'
    OR LOWER(domain) LIKE '%officeaddons[.]com%'
    OR LOWER(domain) LIKE '%officestoragebox[.]com%'
    OR LOWER(domain) LIKE '%pbxcloudeservices[.]com%'
    OR LOWER(domain) LIKE '%pbxphonenetwork[.]com%'
    OR LOWER(domain) LIKE '%pbxsources[.]com%'
    OR LOWER(domain) LIKE '%qwepoi123098[.]com%'
    OR LOWER(domain) LIKE '%sbmsa[.]wiki%'
    OR LOWER(domain) LIKE '%sourceslabs[.]com%'
    OR LOWER(domain) LIKE '%visualstudiofactory[.]com%'
    OR LOWER(domain) LIKE '%zacharryblogs[.]com%'
    OR (LOWER(domain) LIKE '%raw.githubusercontent[.]com%' AND LOWER(clean_urls) LIKE '%/iconstorages/images/main/%'))

2. Déterminer si les hôtes ont interagi avec des fichiers malveillants

SELECT f.filename, f.directory, ROUND((f.size * 10e-7),2) AS size_MB, h.sha256, f.type, 
f.attributes, f.mode, 
datetime(f.btime,'unixepoch') AS file_created_time, 
datetime(f.atime,'unixepoch') AS file_last_access_time, 
datetime(f.mtime,'unixepoch') AS file_last_modified_time, 
datetime(f.ctime,'unixepoch') AS file_last_status_change_time, 
f.uid, u.username AS file_owner 
FROM file f 
LEFT JOIN users u ON f.uid = u.uid 
LEFT JOIN groups g ON f.gid = g.gid 
LEFT JOIN hash h ON f.path = h.path 
WHERE f.path like 'c:\users\%\appdata\local\programs\3cxdesktopapp\app\%' 
AND (f.filename = 'ffmpeg.dll' 
OR f.filename LIKE 'd3dcompiler%.dll' 
OR f.filename = 'trololo.dll') 
AND (h.sha256 = 'c485674ee63ec8d4e8fde9800788175a8b02d3f9416d0e763360fff7f8eb4e02' 
OR h.sha256 = '11be1803e2e307b647a8a7e02d128335c448ff741bf06bf52b332e0bbf423b03' 
OR h.sha256 = '7986bbaee8940da11ce089383521ab420c443ab7b15ed42aed91fd31ce833896' 
OR h.sha256 = 'aa4e398b3bd8645016d8090ffc77d15f926a8e69258642191deb4e68688ff973')

3. Déterminer si les hôtes exécutent des versions affectées

SELECT
    MIN(ingestion_timestamp) AS first_seen,
    MAX(ingestion_timestamp) AS last_seen,
    meta_hostname,
    ARRAY_JOIN(ARRAY_AGG(DISTINCT(meta_hostname)), ', ') AS hosts,
    ARRAY_JOIN(ARRAY_AGG(sophos_pid),', ') AS spids,
    LOWER(name) AS name,
    sha256,
    company_name,
    file_description,
    file_size,
    file_version,
    original_filename
FROM
    xdr_data
WHERE
   query_name = 'running_processes_windows_sophos'
    AND (
        LOWER(name) = '3cxdesktopapp.exe'
        OR LOWER(original_filename) = '3cxdesktopapp.exe'
        OR LOWER(product_name) ='3cx desktop app')
GROUP by
    meta_hostname,
    LOWER(name),
    sha256,
    company_name,
    file_description,
    file_size,
    file_version,
    original_filename
ORDER BY
    meta_hostname desc

4. Déterminer si les hôtes ont communiqué avec l’infrastructure des acteurs malveillants, pour MacOS

SELECT 
    meta_hostname,
    date_format(from_unixtime(time), '%Y-%m-%d %H:%i:%s') AS date_time,
    ingestion_timestamp
    pid,
    name,
    cmdline,
    path,
    parent,
    gid,
    uid,
    euid,
    egid,
    sha1,
    sha256
FROM 
    xdr_data
WHERE 
    query_name = 'running_processes_osx_events'
    AND LOWER(cmdline) LIKE '%sh -c%'
    AND LOWER(cmdline) LIKE '%/3cx desktop app/updateagent%'

5. Permettre aux clients de pare-feu d’identifier l’activité des domaines malveillants

SELECT timestamp, 
    log_component, 
    log_subtype, 
    user_name, 
    user_group, 
    app_name, 
    src_ip, 
    src_port, 
    protocol, 
    dst_ip, 
    dst_port, 
    http_category, 
    url, 
    domain, 
    http_user_agent, 
    http_status 

FROM 
    xgfw_data 

WHERE 
    LOWER(log_component) = 'http' 
        AND (LOWER(domain) = 'akamaicontainer.com'           
        OR LOWER(domain) = 'akamaitechcloudservices.com'           
        OR LOWER(domain) = 'azuredeploystore.com'           
        OR LOWER(domain) = 'azureonlinecloud.com'           
        OR LOWER(domain) = 'azureonlinestorage.com'           
        OR LOWER(domain) = 'dunamistrd.com'           
        OR LOWER(domain) = 'glcloudservice.com'           
        OR LOWER(domain) = 'journalide.org'           
        OR LOWER(domain) = 'msedgepackageinfo.com'           
        OR LOWER(domain) = 'msstorageazure.com'           
        OR LOWER(domain) = 'msstorageboxes.com'           
        OR LOWER(domain) = 'officeaddons.com'           
        OR LOWER(domain) = 'officestoragebox.com'           
        OR LOWER(domain) = 'pbxcloudeservices.com'           
        OR LOWER(domain) = 'pbxphonenetwork.com'           
        OR LOWER(domain) = 'pbxsources.com'           
        OR LOWER(domain) = 'qwepoi123098.com'           
        OR LOWER(domain) = 'sbmsa.wiki'           
        OR LOWER(domain) = 'sourceslabs.com'           
        OR LOWER(domain) = 'visualstudiofactory.com'           
        OR LOWER(domain) = 'zacharryblogs.com'           
        OR (LOWER(domain) LIKE '%raw.githubusercontent.com%' 
        AND LOWER(url) LIKE '%/iconstorages/images/main/%'))

6. Permettre aux clients de pare-feu d’identifier des user-agents de la version compromise de 3CX

SELECT timestamp, 
    log_component, 
    log_subtype, 
    user_name, 
    user_group, 
    app_name, 
    src_ip, 
    src_port, 
    protocol, 
    dst_ip, 
    dst_port, 
    http_category, 
    url, 
    domain, 
    http_user_agent, 
    http_status 

FROM xgfw_data 

WHERE 
    LOWER(log_component) = 'http' 
    AND   
        (       LOWER(http_user_agent) LIKE '%3cxdesktopapp/18.12.402%'       
            OR LOWER(http_user_agent) LIKE '%3cxdesktopapp/18.12.416%'       
            OR LOWER(http_user_agent) LIKE '%3cxdesktopapp/18.12.407%'       
            OR LOWER(http_user_agent) LIKE '%3cxdesktopapp/18.11.1213%'       
            OR LOWER(http_user_agent) LIKE '%3cxdesktopapp/18.11.1197%'    )

Nous recommandons également aux utilisateurs du logiciel 3CX de continuer à surveiller les canaux de communication de l’entreprise ; ils ont un blog et aussi un forum de support et d’information. Au 30 mars, l’entreprise recommandait aux clients de désinstaller et de réinstaller l’application, et suggérait qu’ils pouvaient également utiliser le client PWA de l’entreprise, basé sur le navigateur, en attendant que la situation soit redevenue normale.

Le 31 mars, 3CX a noté que Google avait invalidé le précédent certificat de signature de l’entreprise, signifiant ainsi que les fichiers MSI infectés à l’origine ainsi que les fichiers émis par 3CX plus tôt cette semaine à l’aide de ce certificat seront bloqués et un nouveau sera donc émis. 3CX, à l’heure où nous rédigeons cet article, est en train de créer de nouveaux installateurs MSI utilisant le certificat nouvellement émis. Cela s’applique uniquement à Windows, car l’entreprise déclare qu’elle ne reconstruira pas encore la version Mac de l’application de bureau (Desktop) car elle se concentre pour l’instant sur la version Windows (et sur cette faille de sécurité en général).

Une liste mise à jour des IOC pour cette attaque est publiée sur notre GitHub.

Protection au niveau de la détection

Les SophosLabs ont bloqué les domaines malveillants et publié les détections suivantes :

Détections statiques :

  • Troj/Loader-AF (ffmpeg.dll trojanisé)
  • Troj/Mdrop-JTQ (programmes d’installation)
  • Troj/Steal-DLG
  • OSX/Mdrop-JTR (programmes d’installation)
  • OSX/Loader-AG (ffmpeg.dll trojanisé)

Détection de réputation :

  • Mal/Generic-R / Mal/Generic-S (d3dcompiler avec ajout d’un shellcode)

Détection de mémoire :

  • Mem/Loader-AH

Nous avons également bloqué la liste des domaines C2 connus et associés à la menace et nous continuerons de mettre à jour cette liste dans le fichier IOC sur notre GitHub, comme indiqué ci-dessus. Enfin, les deux versions malveillantes de ffmpeg.dll fournies dans l’application 3CX concernée sont signalées par leurs hachages comme ayant une mauvaise réputation.

Les SophosLabs étudient activement d’autres opportunités en matière de détection d’activité provenant de ce logiciel. De plus, pour les clients de Sophos MDR, l’équipe d’ingénierie de détection MDR a mis en place un ensemble de détections comportementales qui permettra de repérer l’activité de suivi.

Billet inspiré de Update 2: 3CX users under DLL-sideloading attack: What you need to know, sur le Blog Sophos.