Reverse engineering

Reverse engineering (ou rétro-ingénierie)

La rétro-ingénierie est une activité dont l'objectif est l'étude et l'analyse d'un système pour en déduire son fonctionnement interne.

En informatique, l'objectif de la rétro-ingénierie logicielle consiste à étudier un logiciel sans avoir à disposition son code source, dans le but notamment de :

  • comprendre comment bloquer ou neutraliser un malware,
  • découvrir et corriger des vulnérabilités logicielles.

Pour ce faire, nous utilisons des outils tels que des désassembleurs, décompilateurs, déboggeurs, éditeurs de fichiers binaires... mais nous avons également besoin de compétences ! Il faut savoir développer, connaître les spécifications techniques des processeurs (x86, RISC, ARM...) et systèmes d'exploitation (Unix, Windows, Android...) cibles, connaître les mécanismes de compilation et les protections logicielles (Packer, AntiDebug, AntiSandbox, DEP, ASLR...), et surtout, être une personne curieuse.

Que ce soit sur votre réseau, sur vos ordinateurs, serveurs, mobiles, nous sommes en mesure de faire de la rétro-ingénierie sur bon nombres d'applications. N'hésitez pas à nous contacter pour nous décrire votre besoin et obtenir de plus amples informations sur ce service.

reverse-engineering

Analyse d'un malware

Si des machines de votre infrastructure sont infectées par un malware, celui-ci peut être :

  • une backdoor, permettant à un attaquant de prendre la main sur vos systèmes,
  • un ransomware (ou crypto-locker), qui va rendre vos fichiers inaccessibles en les chiffrant,
  • un stealer, qui va vous dérober des données ou des informations,
  • un rootkit, qui va dissimuler l'activité d'un attaquant sur vos machines,
  • ou un autre type de malware qui cause des dommages sur la disponibilité, l'intégrité ou la confidentialité de vos données.

Afin d'être en mesure de l'éradiquer, nous allons étudier son fonctionnement au sein d'un environnement confiné, dans le but de comprendre comment il s'est installé, propagé, et a assuré sa persistence.

Grâce aux compétences acquises par la phase d'étude, nous allons déterminer une manière de le désactiver, en bloquant son fonctionnement ou en le désinstallant complètement, et ainsi établir une procédure de nettoyage.

D'autres acteurs de votre entreprise seront alors mis dans la boucle, notamment les administrateurs système et réseau, afin d'appliquer ces procédures de nettoyage, mais aussi d'apporter des changements afin que l'installation d'un tel malware soit rendue impossible ou très compliquée à l'avenir. Il peut s'agir d'ajustements de la configuration des machines de l'infrastructure, d'ajout de mesures de protections techniques, ou de modifications comportementales.

Si on prend l'exemple d'une campagne d'emails de phishing, qui est le vecteur de propagation de malware le plus courants en entreprise, trois solutions peuvent entre autres être mises en place pour tenter d'éviter, ou du moins réduire les chances d'une seconde infection :

  • ajustements de configuration : désactivation d'extension couramment utilisées pour propager ce type de menaces (.vbs, .hta...)
  • ajout de protections techniques : proactives ou réactives (filtrage antivirus, solution de sandbox, HIPS, EDR, SIEM...)
  • modifications comportementales : formations de sensibilisation du personnel à la sécurité, fausses campagnes de phishing

Amélioration de la sécurité logicielle

La sécurité des logiciels est un exemple illustrant l'utilité et la nécessité de la rétro-ingénierie. Que ce soit à cause d'un défaut de conception, d'une mauvaise implémentation, ou par manque de tests, les logiciels sont très souvent livrés avec leur lot de vulnérabilités. Ces dernières peuvent avoir un impact important sur la sécurité des données, du logiciel, ou de votre modèle d'activité. La rétro-ingénierie peut aider à découvrir de telles failles de sécurité, et à les adresser.

Lorsqu'un éditeur de logiciel souhaite mettre à l'épreuve la sécurité de sa solution, il peut s'appuyer sur plusieurs méthodes ou stratégies pour en estimer la fiabilité. Parmi ces techniques d'évaluation, on retrouve inévitablement des audits sur des périmètres ciblés ou plus larges. On peut ainsi faire auditer :

  • tout ou partie du code de l'application : il s'agira plutôt d'améliorer la qualité du code que sa sécurité, au vu du travail considérable que cela représente
  • l'architecture logicielle : librairies utilisées, fiabilité des méthodes d'authentification, mécanismes de chiffrement, robustesse des API...
  • l'infrastructure matérielle et logicielle sur laquelle il repose

Toutes les stratégies citées ci-dessus constituent de bonnes pratiques et apportent chacune un intérêt du point de vue de la sécurité logicielle. Ce sont ces types d'audits qui permettent notamment à l'ANSSI de certifier des produits (CSPN, EAL3+, EAL4+). Ces certifications sont alors valables pour une version spécifique de la solution, et attestent d'un niveau de sécurité précis, correspondant aux moyens et compétences d'un attaquant.

Parmi les techniques évoquées, l'une des plus poussées nécessitant du temps et de la maîtrise technique est la recherche et l'exploitation de vulnérabilités. Il s'agit d'une activité très cadrée (version du produit et environnement d'installation spécifique) qui est un complément indispensable à l'audit de code logiciel. Elle s'applique souvent à un seul composant de l'application, car travailler sur l'intégralité de l'application peut être un travail très important. Des compétences en reverse engineering sont indispensables. Les vulnérabilités recherchées lors de cette phase peuvent être de tous types :

  • logical bug : erreur dans la logique du programme, par exemple pouvoir s'authentifier avec un mot de passe vide
  • stack buffer overflow : permet à un attaquant d'écrire sur une zone mémoire utilisée par un programme et modifier le comportement de celui-ci
  • heap overflow : similaire au stack buffer overflow mais plus difficile à exploiter
  • use-after-free : comportement défaillant du programme qui réutilise une zone mémoire précédemment manipulée par l'attaquant
  • race condition : bug provoquant un comportement potentiellement défaillant du programme selon l'ordre dans lequel les instructions sont exécutées
  • time-of-check to time-of-use : permet à un attaquant de modifier le contenu d'une zone mémoire entre sa validation et son utilisation par un programme

La recherche en vulnérabilité commence la plupart du temps par une étape de fuzzing (avec des outils tels que Peach Fuzzer ou American Fuzzy Loop) afin de déterminer les entrées utilisateurs générant des crashs de l'application, voir s'ils peuvent être exploités et dans quelles conditions. Il est pour cela nécessaire de bien connaître les environnements d'installation et les protections mises en place nativement par ces derniers (DEP, ASLR, stack canaries...).

Une étape nécessaire de reverse engineering permettra ensuite de déterminer le type de bug et ses conditions d'exploitation. Cela permettra aux développeurs de corriger la vulnérabilité, et d'estimer les installations et versions du produit vulnérables en fonction de l'environnement système sur lequel il a été installé. Le processus de divulgation des vulnérabilités est encadré, et peut donner lieu à la publication de CVE (Common Vulnerabilities and Exposures).

Lorsqu'une vulnérabilité inconnue est exploitée par un groupe d'attaquants, sans que l'éditeur ne soit au courant et ne puisse la patcher, on parle alors de 0-Day.

Investigation numérique

L'investigation numérique (ou forensic en anglais) est une activité pratiquée principalement par les forces de l'ordre et les équipes de réponse à incident. Il s'agit de collecter, analyser et préserver l'ensemble des traces numériques jugées nécessaire afin de déterminer, identifier, prouver, réfuter une thèse ou un élément.

Dans le cadre des investigations numérique, la variété des systèmes numérique à analyser concerne :

  • tous matériels (ordinateurs, caméras, smartphones...)
  • tous types de moyens de stockage (mémoire flash, SSD, SATA, RAM...) et systèmes de fichiers (NTFS, Ext4, HFS+...)
  • tous systèmes d'exploitation (iOS, Android, Linux, Windows...)
  • tous logiciels propriétaires ou libres

La preuve peut donc se présenter sous de multiples formes. Il est donc fréquent de devoir faire appel aux techniques de reverse engineering aux fins suivantes :

  • recherche de traces ou artefacts exploitables
  • analyse de mécanismes de chiffrements (BitLocker, dm-crypt, LUX, VeraCrypt, TrueCrypt...)
  • analyse de formats de fichiers propriétaires
  • analyse de traces sur les différents systèmes de stockage
  • analyse de traces dans la mémoire RAM
  • reverse engineering d'un système d'exploitation exotique, équipement industriel, ou IoT
  • identification des causes de l'apparition d'artefacts
  • analyse du logiciel ou du mécanisme ayant produit l'artefact

Vous avez activé l'option "Do Not Track" dans votre navigateur, nous respectons ce choix et ne suivons pas votre visite.