Aller au contenu

Memory Leak

Fuite de mémoire (Memory Leak)

Description

Une fuite de mémoire est une forme involontaire de consommation de mémoire par laquelle l'application ne parvient pas à libérer un bloc de mémoire alloué lorsqu'il n'est plus nécessaire. Les conséquences d'un tel problème dépendent de l'application elle-même.

Considérez les trois cas généraux suivants :

  • Application de l'espace utilisateur (User-land) à courte durée de vie : Peu d'effet notable, voire aucun. Le système d'exploitation moderne récupère la mémoire perdue après la fin du programme.
  • Application de l'espace utilisateur à longue durée de vie : Potentiellement dangereux. Ces applications continuent de gaspiller de la mémoire au fil du temps, finissant par consommer toutes les ressources de la RAM. Conduit à un comportement anormal du système.
  • Processus de l'espace noyau (Kernel-land) : Très dangereux. Les fuites de mémoire au niveau du noyau entraînent de graves problèmes de stabilité du système. La mémoire du noyau est très limitée par rapport à la mémoire de l'espace utilisateur et doit être traitée avec prudence.

L'exemple suivant est une fuite de mémoire basique en C :

#include <stdlib.h>
#include <stdio.h>

#define  LOOPS    10
#define  MAXSIZE  256

int main(int argc, char **argv)
{
     int count = 0;
     char *pointer = NULL;

     for(count=0; count<LOOPS; count++) {
          pointer = (char *)malloc(sizeof(char) * MAXSIZE);
     }

     free(pointer);

     return count;
}

Dans cet exemple, nous avons 10 allocations de la taille MAXSIZE. Chaque allocation, sauf la dernière, est perdue. Si aucun pointeur ne pointe vers le bloc alloué, il est irrécupérable pendant l'exécution du programme. Une solution simple à cet exemple trivial consiste à placer l'appel free() à l'intérieur de la boucle ‘for’.

Recommandation

Éviter les fuites de mémoire dans les applications est difficile. Des mesures peuvent être prises pour aider à détecter et résoudre les fuites de mémoire :

  • Utiliser des outils de profilage : Utilisez des outils de profilage de mémoire tels qu'Android Profiler (pour Android) ou Instruments (pour iOS) pour identifier les fuites de mémoire et les schémas d'utilisation de la mémoire.
  • Utiliser des bibliothèques de détection des fuites : Intégrez des bibliothèques de détection des fuites telles que LeakCanary (pour Android) ou Instruments (pour iOS) dans votre processus de développement pour détecter et localiser automatiquement les fuites de mémoire lors des phases de développement et de test.
  • Utiliser des Sanitizers : Envisagez de compiler votre application avec des outils d'assainissement tels que HWAddressSanitizer, GWP-ASan et Arm Memory Tagging Extension

Liens

Normes

  • OWASP_MASVS_L1:
    • MSTG_CODE_8
  • OWASP_MASVS_L2:
    • MSTG_CODE_8
  • CWE_TOP_25:
    • CWE_400
  • PCI_STANDARDS:
    • REQ_6_2
  • OWASP_MASVS_v2_1:
    • MASVS_RESILIENCE_4
  • SOC2_CONTROLS:
    • CC_2_1
    • CC_4_1
    • CC_7_1
    • CC_7_2
    • CC_7_4
    • CC_7_5
    • CC_9_1
  • HIPAA_CONTROLS:
    • SECURITY212
    • SECURITY213
    • SECURITY255