04 juin 2025

De l'open source à une menace ouverte : suivi de l'évolution de Chaos RAT

Auteurs : Santiago Pontiroli, Gabor Molnar, Kirill Antonenko

Résumé

  • Acronis TRU a identifié de nouvelles variantes de Chaos RAT, une famille connue de logiciels malveillants, lors de récentes attaques réelles sur Linux et Windows.
  • Chaos RAT est un outil open source de gestion à distance (RAT = remote administration tool) découvert pour la première fois en 2022. Il a évolué en 2024 et de nouvelles souches ont été découvertes par TRU en 2025.
  • Les chercheurs Acronis TRU ont découvert une vulnérabilité critique dans l'interface de Chaos RAT en ligne qui permet aux pirates d'exécuter du code à distance sur un serveur. Cette souche récente de Chaos RAT suggère que les victimes ont été invitées insidieusement à télécharger un utilitaire de dépannage réseau pour les environnements Linux.
  • Développé en Golang, Chaos RAT offre une compatibilité multiplate-forme avec les systèmes Windows et Linux : voici un autre exemple clair montrant comment des outils légitimes peuvent contenir des vulnérabilités et être réutilisés pour des activités cybercriminelles.
  • Bien que son utilisation reste globalement limitée, des échantillons récents confirment que Chaos RAT est toujours actif. Son faible profil de détection ouvre la voie à l'espionnage, à l'exfiltration de données et à l'établissement de bases pour les rançongiciels et autres opérations post-compromission.
  • Dans cette analyse technique, l'équipe Acronis TRU se concentre sur une variante Linux et partage des stratégies de détection exploitables (règles YARA, indicateurs de compromission, conseils de recherche de menaces avec EDR, etc.).

Introduction

Chaos RAT est un cheval de Troie d'accès à distance (RAT) open source écrit en Golang, qui offre un support multi-plateforme pour les systèmes Windows et Linux. Inspiré par des frameworks populaires tels que Cobalt Strike et Sliver, Chaos RAT fournit une interface d'administration où les utilisateurs peuvent construire des charges actives, établir des sessions et contrôler des ordinateurs compromis. Bien que les malwares basés sur Golang aient tendance à être plus lents et de plus grande taille que ceux écrits en C++ ou dans d’autres langages courants, ils bénéficient des capacités de compilation croisée de Golang, ce qui réduit le temps de développement et offre une plus grande flexibilité.

Acronis
Figure 1

Initialement conçu comme un outil légitime de gestion à distance, le caractère open source de Chaos RAT a attiré des auteurs malveillants qui l’exploitent à des fins malveillantes. Bien que son développement ait commencé en 2017, la première utilisation observée de Chaos RAT dans des attaques réelles s'est produite en novembre 2022. Depuis, les variantes Linux, principalement utilisées dans des campagnes de minage de cryptomonnaie, ont continué à voir le jour. Cette analyse se penche sur l’architecture de Chaos RAT, son utilisation dans les attaques actives et les méthodes de détection et d'atténuation.

Anatomie de Chaos RAT : code, capacités et communication

Distribution

Chaos RAT atteint en règle générale ses victimes par le biais d'e-mails de phishing contenant des liens ou des pièces jointes malveillants. Les premières souches déployaient un script malveillant (non lié au RAT) conçu pour modifier le fichier /etc/crontab, un planificateur de tâches couramment utilisé par les cybercriminels pour sa persévérance. Ce mécanisme permet au pirate de mettre à jour ou de modifier la charge active sans toucher à nouveau le système cible, car elle est récupérée à distance à chaque exécution de la tâche cron. Les premières campagnes utilisant cette technique ont permis de déployer séparément des mineurs de cryptomonnaie et le Chaos RAT, ce qui indique que ce dernier était principalement employé pour faire de la reconnaissance et collecter des informations sur les terminaux compromis.

Acronis
Figure 2

Dans ce dernier échantillon repéré sur Virus Total et soumis depuis l’Inde, un fichier archivé compressé tar.gz nommé NetworkAnalyzer.tar.gz contenait la charge active finale de Chaos RAT. Nous ne disposons d'aucune information supplémentaire sur la manière dont la victime a reçu ce package, mais les informations disponibles indiquent que l'attaque était précédée d'un leurre visant à la convaincre de télécharger un utilitaire de dépannage réseau pour les environnements Linux.

Acronis
Figure 3

Présentation

Le code source le plus récent et le plus activement maintenu de Chaos RAT est disponible sur GitHub et a été mis à jour pour la dernière fois en octobre 2024. Cette version se concentre exclusivement sur la création de clients 64 bits prenant en charge les systèmes Windows et Linux. Son développement continu laisse présager des améliorations et des évolutions visant à étendre la compatibilité, à affiner les capacités de génération de charge active et à renforcer les protocoles de communication.

Interface d'administration

L'interface d'administration de Chaos RAT sert d'interface centralisée pour créer, gérer et contrôler les charges actives. Elle comprend un tableau de bord simple et accessible par navigateur, doté de diverses fonctionnalités permettant aux pirates ou aux chercheurs d’interagir avec les systèmes compromis. Bien que le nombre d'interfaces d'administration détectées soit faible, l’apparition de nouvelles souches dans VirusTotal et le faible taux de détection indiquent que Chaos RAT est toujours utilisé dans les attaques actuelles.

Acronis
Figure 4

L'interface d'administration peut être lancée localement en exécutant la commande suivante :

PORT=8080 SQLITE_DATABASE=chaos go run cmd/chaos/main.go

Une fois le service démarré, l'interface d'administration est accessible via n'importe quel navigateur Web à l'adresse http://localhost:8080 avec les identifiants de connexion par défaut admin:admin.

L'interface d'administration inclut des onglets pour la gestion des clients, la génération de charges actives et la surveillance des campagnes. Le tableau de bord affiche les identifiants, les adresses IP, les détails du système d'exploitation et les statistiques de connexion des clients. Le Payload Generator (Générateur de charge active) permet aux utilisateurs de créer des charges actives 64 bits pour Windows et Linux, avec des options telles que « Exécuter en arrière-plan » pour Windows.

Acronis
Figure 5
Acronis
Figure 6

L'onglet Client Management (Gestion des clients) affiche les clients connectés avec diverses informations (identifiant, système d'exploitation, adresse IP et horodatage de la dernière connexion). Il prend en charge l'exécution de commandes individuelles ou groupées. L'onglet File explorer (Explorateur de fichiers) permet la navigation, le téléchargement, le transfert, la suppression et l'exécution de fichiers, avec un parcours récursif.

Acronis
Figure 7

L'onglet Remote Shell (Rsh) permet l'exécution de commandes en temps réel sur les systèmes Windows ou Linux. L'onglet Settings (Paramètres) permet des modifications de configuration, y compris les informations d'identification, les ports et les chemins de base de données.

Acronis
Figure 8

Exécution

Alors que la variante Windows a l'option « Exécuter en arrière-plan » à l'étape de développement, qui dissimulera la sortie de la console, ce n'est pas le cas pour Linux. Lors de l'exécution, elle inscrit l'adresse du serveur et l'état de la connexion.

Acronis
Figure 9

Il est toujours possible pour les systèmes Linux de supprimer ce résultat en effectuant une redirection vers le terminal « /dev/null ».

 

La principale différence entre les anciennes versions de Chaos RAT et les variantes plus récentes est que les anciennes (voir image ci-dessous) stockent l’adresse IP, le port et d’autres données en texte brut sans aucun codage, à l’exception de la valeur du jeton, qui est codée en Base64 dans les deux cas. Dans la dernière variante (image de droite ci-dessous), toutes les données sont stockées sous la forme d'une chaîne qui est codée en Base64 avec un appel de fonction supplémentaire qui est chargé de la lire.

Acronis
Figure 10

Nous avons récemment analysé deux binaires nouvellement observés compilés à l’aide de la dernière version du projet ChaosRAT. L'un d'eux (Échantillon 2) a en outre été compressé avec l'utilitaire UPX.

Données de configuration décodées

Chaque échantillon contient un objet de configuration codé en Base64 avec des noms de champs aléatoires. Une fois décodés, les champs sont associés à des valeurs clés telles que le port du serveur C2, l'adresse IP et un jeton JWT utilisé pour l'autorisation.

Échantillon 1

SHA256:1e074d9dca6ef0edd24afb2d13cafc5486cd4170c989ef60efd0bbb0

{
 	"86pYnySllR": "5223",
	"S7mOecuru0": "176.65.141.63",
	"vu2Yr4lh2E": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdXRob3JpemVkIjp0cnVlLCJleHAiOjE3Njk1ODEyMzQsInVzZXIiOiJkZWZhdWx0In0.gQ7sfb0DF74yrFsdCO1dy1Vb3YBhEv2utn7PdcB4kC4"
}

Échantillon 2

SHA256:a51416ea472658b5530a92163e64cfa51f983dfabe3da38e0646e92fb14de191

{
 	"Svy1ITNLYV": "7419",
 	"WiBZgQLch7": "91.208.197.40",
	"bIffmObdNe": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdXRob3JpemVkIjp0cnVlLCJleHAiOjE3NzI0NTg2NTYsInVzZXIiOiJkZWZhdWx0In0.5crbatKoe-6CogXJwgzOl_RSBnydG5l_Lf-ahO2HAu0"
}

Comme indiqué, bien que les noms de champs soient randomisés pour échapper à la détection de modèles simples, leur structure et leur objectif restent cohérents.

Décryptage du jeton JWT

Les jetons Web JSON (JWT) intégrés suivent le format standard et ne diffèrent que par leur horodatage d'expiration (champ exp):

Échantillon 1

{
   "alg":"HS256",
   "typ":"JWT"
}
{
   "authorized":true,
   "exp":1769581234,
   "user":"default"
}

 Échantillon 2

{
   "alg":"HS256",
   "typ":"JWT"
}
{
   "authorized":true,
   "exp":1772458656,
   "user":"default"
}

Ce jeton est utilisé pour authentifier et autoriser les communications client-serveur avec l'infrastructure C2 (Command&Control).

Comportement après la configuration

Une fois la configuration analysée, le malware entre dans un cycle de collecte d'informations. Cette fonction recueille des données d’hôte détaillées, qui peuvent inclure des métadonnées du système, des informations réseau et des identificateurs potentiels qui aident les opérateurs à profiler le dispositif infecté.

  • Nom de l'hôte
  • Nom actuel
  • Adresse MAC
  • Adresse IP
  • Heure actuelle
  • Nom du système d'exploitation (OS)
  • Architecture du système d'exploitation

Lorsque le système récupère le nom de l'OS, il attribue une variable globale utilisée pour déterminer les chemins d'exécution des fonctions spécifiques à chaque système d'exploitation. Il définit la valeur sur « 1 » pour les systèmes Windows et sur « 0 » pour Linux. Après avoir défini cette variable, le RAT initialise des services supplémentaires pris en charge par les clients compilés, en adaptant les fonctionnalités en fonction du système d'exploitation détecté.

Acronis
Figure 11

Le RAT entre alors dans une boucle infinie, surveillant en permanence la disponibilité du serveur. Si le serveur est injoignable, il réessaiera toutes les 30 secondes. Une fois la connexion établie, le RAT envoie les données système collectées au serveur et vérifie l'arrivée de nouvelles commandes à des intervalles de 30 secondes.

Acronis
Figure 12

Pour communiquer avec le serveur, le client ajoute l'une des chaînes suivantes à l'adresse IP et au port avant d'envoyer la requête :

  • /client — Initialisation d'une nouvelle connexion
  • /health — Vérifie si le serveur est disponible
  • /device — Envoi des informations relatives au terminal

Si le client ne parvient pas à se connecter au serveur, il inscrit le message suivant :

Acronis
Figure 13

Pour obtenir des commandes du serveur, il lit le dernier message issu de la connexion établie. Chaque message du serveur est au format JSON, le client Chaos RAT devra donc d'abord le désérialiser.

Acronis
Figure 14

Il prendra ensuite la valeur de la commande et chargera un ensemble de chaînes prédéfinies (commandes disponibles). Ces chaînes seront comparées aux valeurs obtenues pour déterminer l’opération à effectuer.

Acronis
Figure 15

Ensemble de commandes et fonctionnalités

  • getos — Collecte des informations système telles que le nom, la version et l'architecture du système d'exploitation, le nom d'utilisateur, les adresses MAC et IP, la date et l'heure actuelles.
  • screenshot — Capture une image de l'écran à l'aide de la bibliothèque kbinani/screenshot, l'encode au format PNG puis l'envoie au serveur après l'avoir codée en Base64.
  • restart — Redémarre le système. Utilise shutdown -r -t 00 sous Windows et reboot sous Linux.
  • shutdown — Arrête le système. Utilise shutdown -s -t 00 sous Windows et poweroff sous Linux.
  • lock — Verrouille le système Windows à l'aide de la fonction LockWorkStation de user32.dll. Non pris en charge sous Linux.
  • sign-out — Déconnecte l'utilisateur. Utilise la commande shutdown -L sous Windows. Non pris en charge sous Linux.
  • explore — Répertorie les fichiers et les répertoires à partir d'un chemin spécifié. Fournit les noms de fichiers et les horodatages de modification. Prend en charge le parcours récursif du répertoire.
  • download — Charge un fichier spécifié du client sur le serveur. Initialisée par une requête POST sans codage Base64.
  • upload — Télécharge un fichier spécifié à partir du serveur sur le client via une requête GET et écrit les données dans un fichier local.
  • delete — Supprime un fichier spécifié du système de fichiers du client.
  • open-url — Ouvre une URL dans le navigateur par défaut. Utilise la commande start sous Windows et l'utilitaire xdb sous Linux.

Répartition détaillée des fonctionnalités de commande

GetOS

Cette commande permet d'obtenir des informations système telles que le nom, la version et l'architecture du système d'exploitation, le nom de l'utilisateur, les adresses MAC et IP, ainsi que la date et l'heure actuelles.

Acronis
Figure 16

Screenshot

Cette fonctionnalité est issue d'un autre projet open source. Elle permet à la capture d'écran d'être transmise à la fonction d'encodage en vue d'être convertie au format PNG. Avant de l'envoyer au serveur, la capture est également encodée en Base64. Cette image sera alors enregistrée dans le dossier Téléchargement sur le serveur.

Acronis
Figure 17

Reboot et shutdown

L'exécution de ces commandes dépend du système d'exploitation. Sous Windows, la commande « shutdown -r -t 00 » est utilisée pour le redémarrage et « shutdown -s -t 00 » pour l'arrêt du système. Pour Linux, les commandes « reboot » et « poweroff » sont utilisées.

Acronis
Figure 18

Lock et sign out

Ces commandes sont prises en charge uniquement par la version Windows. Pour l'opération de verrouillage, la fonction « LockWorkStation » de « user32.dll » est utilisée :

Rundll32.exe user32.dll, LockWorkStation

La commande « sign-out » est exécutée à l'aide de la commande « shutdown -L ».

Acronis
Figure 19

Explorateur de fichiers

Cette fonctionnalité est utilisée pour répertorier les fichiers sur le système. Elle démarre à partir du répertoire personnel et exécute la fonction « ReadDir ». Elle vérifie par la suite le type de chaque fichier trouvé. Si le fichier est un répertoire, elle prend seulement son nom et l’ajoute à la liste :

{
   "path":"/home/dev/go",
   "files":null,
   "directories":[
      "bin",
      "pkg"
   ]
}

Si l'annuaire contient des fichiers, outre leur nom, la date de dernière modification sera également renvoyée :

{
   "path":"/home/dev",
   "files":[
      {
         "filename":".bash_history",
         "mod_time":"2025-03-06T10:28:28.788848322Z"
      },
      {
         "filename":".bash_logout",
         "mod_time":"2024-03-31T08:41:03Z"
      },
      {
         "filename":".bashrc",
         "mod_time":"2024-03-31T08:41:03Z"
      }
   ]
}

Download et upload

Lorsqu'une commande « download » est envoyée au client, celui-ci doit la transférer au serveur. « command » contient un chemin d'accès complet au fichier en tant que paramètre.

Acronis
Figure 20

Le client commencera par lire le contenu du fichier et créera une requête POST dans laquelle il écrira également les données de fichiers. Il définira également les cookies qui contiennent un jeton de configuration et un type de contenu. Cette demande sera envoyée sans codage Base64.

Acronis
Figure 21

Lorsque le fichier de transfert arrive au client, celui-ci téléchargera le fichier transmis en tant qu'argument au système local. Pour ce faire, il enverra une requête « GET » au serveur pour ensuite écrire les données obtenues dans le fichier.

Acronis
Figure 22

Dans les deux cas, après le téléchargement ou le transfert d'un fichier, il enverra un paquet supplémentaire contenant le chemin d'accès complet du fichier pour signaler que l'opération s'est bien terminée. En cas d'échec, il enverra un paquet avec « 0 » comme résultat.

Ouvrir l'URL

Sur les systèmes Windows, il utilise la commande « start » pour forcer l’URL à s’ouvrir dans le navigateur par défaut du système. Pour les systèmes Linux, il utilise l’utilitaire « xdb » à cette fin.

Acronis
Figure 23

Exécution de la commande

Chaos RAT place les commandes terminales dans le champ « command » de la requête. Du côté client, la commande est exécutée dans le terminal si aucune des commandes précédentes ne correspond. Le résultat de l'exécution de la commande est renvoyé au serveur.

Acronis
Figure 24

Après exécution de la commande, il encode le résultat en Base64 et l'envoie au serveur dans le format JSON. Chaque client utilise l'adresse MAC de l'hôte comme identifiant.

Acronis
Figure 25
Acronis
Figure 26

Chaos RAT permet aux pirates de prendre le contrôle... du contrôleur

Chaos RAT s'est retrouvé victime de ses propres manœuvres. Une vulnérabilité critique dans l'interface en ligne a permis aux pirates d'exécuter du code à distance sur le serveur, « renversant ainsi la vapeur » sur l'outil conçu pour contrôler les autres.

Vulnérabilité : CVE-2024-30850

La fonction BuildClient dans l'infrastructure principale de Chaos RAT était au cœur du problème. Cette fonction a pris les informations utilisateur (adresse du serveur, port et nom de fichier) pour développer une commande shell permettant de créer les binaires de l'agent. Malgré la validation de certaines entrées, l’utilisation de la commande exec. (« sh », « -c », buildCmd) signifiait que les entrées malveillantes pouvaient mettre en place des commandes arbitraires. Cela a permis aux utilisateurs authentifiés d'exécuter du code sur le serveur hébergeant le RAT.

Acronis
Figure 27

Exploit : CVE-2024-31839

Un pirate pouvait créer un rappel d'agent usurpé, exploitant une vulnérabilité XSS dans l'interface d'administration. En intégrant des scripts malveillants dans les données de l'agent, le pirate pouvait exécuter du code JavaScript durant une session du navigateur de l'administrateur. Cette combinaison de commandes injectées côté serveur et de scripts XSS côté client a créé un puissant vecteur d’attaque.

La surprise : le Rickrolling

Par exemple, le chercheur professionnel en sécurité Rick-Roller Chebuya a démontré l'exploit en faisant jouer à l'interface d'administration de Chaos RAT la chanson « Never Gonna Give You Up » de Rick Astley. Pour une analyse détaillée, consultez l'article complet de Chebuya : Remote code execution on CHAOS RAT via spoofed agents (Exécution de code à distance sur CHAOS RAT via des agents usurpés).

Acronis
Figure 28

Impact 

Ce malware est capable de gérer des fichiers, d'accéder à des shells inversés et de gérer le trafic réseau par proxy. Ces capacités pourraient faciliter l'espionnage, l'exfiltration de données ou servir de point d'appui pour le lancement de rançongiciels et d'autres opérations post-compromission. 

Sa nature open source permet aux acteurs malveillants de le modifier et de le réutiliser facilement, créant ainsi de nouvelles variantes capables d'échapper à la détection basée sur les signatures. Cela complique également l'attribution, car plusieurs acteurs peuvent utiliser des outils similaires sans lien clair, brouillant ainsi la distinction entre cybercriminalité et activités commanditées par un État. 

Exemples 

Plusieurs groupes de menaces persistantes avancées (APT) ont été observés utilisant des chevaux de Troie d'accès à distance (RAT) open source dans leurs opérations. APT41 et APT36 ont tous deux utilisé NjRAT, tandis qu'APT10 a utilisé QuasarRAT. Blind Eagle (APT-C-36) est connu pour utiliser AsyncRAT. De plus, APT34 et APT35 ont tous deux exploité Pupy RAT dans leurs campagnes. 

Pourquoi utiliser Chaos RAT ou tout autre malware open source ? 

1. Intégration : L’utilisation de malwares accessibles au public permet aux groupes APT de se fondre dans le paysage de la cybercriminalité. Si des acteurs peu influents utilisent largement un RAT, il est plus difficile de déterminer si une campagne spécifique est menée par un acteur sophistiqué ou un simple script kiddie. 

2. Rapidité et coût : Même les APT disposant de ressources importantes doivent agir rapidement ou déployer leurs opérations sur plusieurs cibles. Les malwares open source offrent une boîte à outils « suffisamment performante » qui peut être rapidement personnalisée et déployée. 

3. Évasion d’attribution : Lorsque plusieurs acteurs utilisent le même malware open source, cela brouille les pistes d’attribution. Il est plus difficile d’associer une activité à un groupe spécifique sur la seule base du malware, ce qui permet aux acteurs de menaces avancées de se protéger lors d’opérations sensibles. 

Conclusion

Ce qui commence comme un outil pour développeurs peut rapidement devenir l'outil de prédilection d'un auteur malveillant. Ce RAT basé sur Go propose une interface Web simple et des commandes système puissantes pour Windows et Linux. Il permet d'obtenir des shells inversés, de manipuler des fichiers et d'exécuter des commandes à distance sur des systèmes compromis.

Chaos a été repéré dans un environnement réel et représente un problème croissant en matière de cybersécurité : l'arsenalisation de logiciels open source. Avec ses capacités de déploiement rapide, son ciblage furtif sur Linux et sa configuration flexible, il nous rappelle que l'open source est une arme à double tranchant et qu'elle peut faire des dégâts entre de mauvaises mains.

Détection par Acronis 

Acronis Cyber Protect Cloud détecte parfaitement divers composants de ChaosRAT en tant que « Trojan.Linux.ChaosRAT.A », comme le montrent les captures d'écran ci-dessous.  

Acronis
Figure 29
Acronis
Figure 30
Acronis
Figure 31

Acronis a récemment annoncé la prise en charge de Linux par Acronis EDR. Cette amélioration étend la portée de l'EDR à des environnements mixtes, offrant une protection complète des ressources Windows, macOS et désormais Linux. Les détections de fichiers ou de processus suspects ou malveillants sur les systèmes Linux par Acronis EDR sont automatiquement associées au framework MITRE ATT&CK, ce qui permet de mieux comprendre les menaces.

Cette mise à jour prend en charge plusieurs mesures correctives pour les terminaux Linux. Il s’agit notamment d’arrêter les processus malveillants, de mettre en quarantaine des fichiers, d’ajouter des éléments à la liste d'autorisation ou de blocage et de restaurer les systèmes affectés à partir d'une sauvegarde.

Cette nouvelle fonctionnalité prend en charge les systèmes d’exploitation Ubuntu 22.04 et CentOS 7.x, et est également disponible avec Acronis XDR.

Indicateurs de compromission

Fichiers

Acronis

YARA

Acronis

Références et publications associées (par ordre chronologique)

  1. Tweet sur Chaos RAT (par Cyberteam008) 15 avril 2025. https://x.com/Cyberteam008/status/1889516549129802007
  2. GitHub Advisory Database. tiagorlampert CHAOS vulnerable to Cross Site Scripting (CVE-2024-31839) 12 avril 2024. https://github.com/advisories/GHSA-c5rv-hjjc-jv7m
  3. « Remote code execution on CHAOS RAT via spoofed agents » (Chebuya) 5 avril 2024.  https://blog.chebuya.com/posts/remote-code-execution-on-chaos-rat-via-spoofed-agents/
  4. Tweet concernant la vulnérabilité CVE-2024-30850 (Chebuya) 5 avril 2024.  https://x.com/_chebuya/status/1776371049095192847
  5. MAL_LNX_Chaos_Rat_Dec22 (Valhalla Rule by Nextron-Systems) 14 décembre 2022.  https://valhalla.nextron-systems.com/info/rule/MAL_LNX_Chaos_Rat_Dec22
  6. Chaos is a Go-based Swiss army knife of malware (Chaos est un malware de type couteau suisse) (Lumen Blog) 28 septembre 2022. https://blog.lumen.com/chaos-is-a-go-based-swiss-army-knife-of-malware/
  7. CHAOS : outil d'administration à distance (référentiel GitHub)  https://github.com/tiagorlampert/CHAOS