• # Mon expérience

    Posté par (site web personnel) . En réponse au journal Programmation robuste. Évalué à 7.

    Rendre un logiciel existant robuste se fait en plusieurs étapes.

    #1 : Une compilation sans avertissement

    Un avertissement est souvent un bug potentiel. Un comparaison nombre entier naturel et nombre entier relatif peut être une source de bug (integer overflow). => gcc -Wall -Wextra. Je trouve ça complètement débile que "-Wall" n'affiche pas ALL (tous) les avertissements... (avec gcc < 4 : -Wall -W). Pour les fanatiques : -Werror bloque la compilation à chaque avertissement.

    #2 : Valgrind

    Il faut que le programme ait zéro erreur dans Valgrind.

    #3 : Analyse statique du code

    Utiliser SPlint, Rats, Flawfinder, etc. pour trouver les portes d'entrées possible pour des failles.
    http://www.haypocalc.com/wiki/Analyse_statique_de_code

    ### Fin de la partie basique ###

    Maintenant il faut revoir le programme pour limiter les dégats. Ca peut être :

    - Vérifier strictement toutes les entrées utilisateurs : clavier, réseau, variable d'environnement, fichier de configuration, fichier en entrée, événement X11, etc.

    Voir les dégats que ça peut faire :
    http://sam.zoy.org/zzuf/
    http://www.haypocalc.com/wiki/Injection_de_code
    http://www.haypocalc.com/wiki/Injection_de_SQL
    http://www.haypocalc.com/wiki/Format_string_attack

    - Vérifiez aussi le code de retour des fonctions, et particulier les fonctions systèmes (fopen, chdir, fork, etc.).

    - Séparation des privilèges : séparer et limiter au maximum le code exécuté avec des privilèges elevés

    - etc.