Conseils de codage en C/Sécurité

Un livre de Wikilivres.

L'application des conseils suivants rendent les logiciels plus sécurisés : moins vulnérables aux attaques.

Pas d'affichage direct (c_sec_1)[modifier | modifier le wikicode]

Il faut éviter d'afficher une chaîne provenant de l'utilisateur (argument de programme, de fonction, contenu d'un fichier) en l'employant comme premier argument des fonctions printf.

Justification[modifier | modifier le wikicode]

Améliorer la sécurité en évitant le plantage du programme.

Exemple[modifier | modifier le wikicode]

Le mauvais exemple :

/* prog.c */
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv)
{
    if (argc > 1)
    {
        printf(argv[1]); // afficher le premier argument
    }
    return EXIT_SUCCESS;
}

Que va-t'il se passer si l'on tape la commande suivante :

prog "Exemple : %s"

L'argument pour le %s n'étant pas fourni explicitement, le programme risque d'afficher le contenu de la mémoire à une adresse indéfinie, voire retourner une erreur de segmentation.

Le bon exemple :

/* prog.c */
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv)
{
    if (argc > 1)
    {
        (void)printf("%s", argv[1]); // afficher le premier argument
    }
    return EXIT_SUCCESS;
}

Si l'on tape la commande suivante :

prog "Exemple : %s"

Le programme affiche littéralement :

Exemple : %s

Cacher les mots de passe (c_sec_2)[modifier | modifier le wikicode]

Lorsqu'un programme a besoin d'un mot de passe saisi par l'utilisateur, que ce soit par l'interface graphique, ou par une console texte, la saisie ne doit pas être faite en clair.

Il faut :

  • soit afficher des étoiles ou points (ou tout caractère fixé) lors de la frappe,
  • soit ne rien afficher du tout.

Justification[modifier | modifier le wikicode]

Améliorer la sécurité en évitant que les mots de passe d'un utilisateur ne soient visibles aux autres (poste public, lieu de travail, ...), et éviter une opération intempestive de presse papier contenant le mot de passe (envoi d'une copie d'écran par exemple).

Outil[modifier | modifier le wikicode]

Certaines librairies graphiques possèdent des champs de saisie spéciaux pour les mots de passe, d'autres librairies possèdent des fonctions de saisie de mots de passe sur la console.

Pour la saisie par console, si aucune fonction spéciale existe, il faut désactiver l'affichage de la saisie tant que l'utilisateur n'a pas fini sa saisie.