IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Allocation dynamique


Sujet :

C

  1. #21
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Quoi, le double-free avec la stack trace et tout, ça ne déclenche pas de crash + core-dump?

    Hé bien, j'en ai encore beaucoup à apprendre sur *n*x...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  2. #22
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Quoi, le double-free avec la stack trace et tout, ça ne déclenche pas de crash + core-dump?

    Hé bien, j'en ai encore beaucoup à apprendre sur *n*x...
    Si si, aussi bien crash qu'exécution de code (vu sous Windows et Linux). Le "double-free" porte le numéro CWE-415:

    http://cwe.mitre.org/data/definitions/415.html

    L'exécution de code est difficile (voir impossible dans certains cas) mais sous certaines conditions spécifiques la fiabilité d'exécution de code est de 100% pour ce type de vulnérabilité. Cependant, dans certains cas, la vulnérabilité peut être complétement silencieuse (pas de crash et encore moins d'exécution).

    En fait le résultat est très dépendant de l'état du tas (heap) pendant et après le double-free et aussi des protections systèmes mise en place (heap chunk cheksumming ou encore heap canary par exemple).

  3. #23
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Non, je parlais de ce qui se passait quand un double-free était détecté par la glibc, pas des vulnérabilités qu'ils causent...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #24
    Membre émérite Avatar de sloshy
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2005
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 728
    Par défaut
    On est bien d'accord que ce n'est absolument pas sécure mais pour l'avoir déjà vu plusieurs fois dans des codes (aussi bien sous windows que sous linux), le double free ne fais pas planter l'application.

    Là ou j'ai du mal, c'est de savoir si je dois imiter le système lors d'un double free ou si ma solution (qui ne fais rien lors d'un double free) est à conserver.
    J'ai un peu peur des performences à vrai dire (déjà qu'en ce moment pour lancer firefox ou gimp il me faut 10min :$)

  5. #25
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    La norme dit que le comportement dans le cas d'un double free() est non défini et non pas défini par l'implémentation. C'est donc clairement une erreur dont le résultat est imprévisible.
    Le programmeur ne devant pas faire de double free(), tu n'as pas d'obligation à préciser ce que ton code fait dans ce cas.
    Tu peux choisir ou plus précisément ne pas te préoccuper de ce qui se passe dans cette situation.

  6. #26
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par sloshy Voir le message
    On est bien d'accord que ce n'est absolument pas sécure mais pour l'avoir déjà vu plusieurs fois dans des codes (aussi bien sous windows que sous linux), le double free ne fais pas planter l'application.
    C'est un comportement indéfini :

    or if the space has been deallocated by a call to free or realloc,
    the behavior is undefined
    et donc une erreur. A partir de ce moment là tout peut arriver : un plantage pur et simple, un code qui semble marcher jusqu'au jour où ... (et en général, ça arrive au plus mauvais moment), etc.

    Citation Envoyé par sloshy Voir le message
    Là ou j'ai du mal, c'est de savoir si je dois imiter le système lors d'un double free ou si ma solution (qui ne fais rien lors d'un double free) est à conserver.
    Vu de la norme, free() n'a pas l'obligation d'afficher un message dans ce cas là, et d'ailleurs n'en affiche pas dans la plupart des implémentations (au passage, d'ailleurs, la glibc l'affiche systématiquement ou seulement en debug ?).

  7. #27
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    @sloshy: je viens de tester, un double-free, quand il est détecté par la libc, cause bien un abort du programme (Mandriva Linux, gcc 4.3.2)
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void)
    {
    	void *toto = malloc(10);
    	void *tata = malloc(10); /*J'en alloue un second pour éviter les considérations de pages*/
     
    	puts("Avant");
    	free(toto);
    	puts("Entre");
    	free(toto); //double free
    	puts("Après");
    	free(tata);
    	return EXIT_SUCCESS;
    }
    Et la sortie:
    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    [medinoc@localhost C]$ gcc -g testDoubleFree.c
    [medinoc@localhost C]$ ./a.out
    Avant
    Entre
    Abandon
    [medinoc@localhost C]$
    (au passage, si quelqu'un pouvait me dire comment avoir la stack trace plutôt que juste "Abandon", ce serait sympa).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #28
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    (au passage, si quelqu'un pouvait me dire comment avoir la stack trace plutôt que juste "Abandon", ce serait sympa).
    tu peux la récupérer en faisant un debug post mortem avec gdb, pour cela il faut autoriser la génération des fichiers core.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ulimit -c unlimited
    $./a.out
    ...
    Abandon (core dump)  <-- Ici un fichier core est generé
    $gdb a.out  core.<un numero>
    bt
    avec <un numero> le numero du fichier core.

  9. #29
    Membre émérite Avatar de sloshy
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2005
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 728
    Par défaut
    lors de mes tests, je n'ai pas eu ce genre de soucis. (dernière version de gcc je tourne sous openBSD).

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. probleme d'allocation dynamique
    Par vince3320 dans le forum C
    Réponses: 10
    Dernier message: 22/04/2004, 16h27
  2. petit pbm allocation dynamique de stringGrid
    Par AnneOlga dans le forum C++Builder
    Réponses: 10
    Dernier message: 17/01/2004, 11h59
  3. Allocation dynamique de structures
    Par fr_knoxville dans le forum C
    Réponses: 8
    Dernier message: 06/05/2003, 21h59
  4. Allocation dynamique de mémoire en asm
    Par narmataru dans le forum Assembleur
    Réponses: 7
    Dernier message: 17/12/2002, 22h31
  5. Réponses: 4
    Dernier message: 03/12/2002, 16h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo