41 votes

Écrire des idiomes Secure C et Secure C

"L'homme moyen ne veut pas être libre. Il veut simplement être en sécurité." - H. L. Menken

Je suis d'essayer d'écrire très sécurisé C. ci-Dessous j'ai une liste de certaines des techniques que j'utilise et la demande sont-ils aussi sûrs que je pense qu'ils sont. S'il vous plaît ne pas hésiter à se déchirer mon code/idées préconçues en lambeaux. Toute réponse qui trouve même le plus trivial de la vulnérabilité ou de m'apprend une nouvelle idée sera très apprécié.

Lecture à partir d'un flux:

Selon le GNU C Programmation Tutoriel getline:

La fonction getline agrandir automatiquement le bloc de la mémoire nécessaire, via le realloc fonction, de sorte qu'il n'y a jamais une pénurie de l'espace-une des raisons pour lesquelles getline est donc, en toute sécurité. [..] Un avis que getline peut gérer en toute sécurité de votre ligne de saisie, pas de importe combien de temps il est.

Je suppose que getline doit, en vertu de toutes les entrées, éviter un débordement de la mémoire tampon de se produire lors de la lecture à partir d'un flux.

  • Est mon hypothèse est correcte? Y sont entrées et/ou les systèmes de répartition en vertu de laquelle ce qui pourrait conduire à un exploit? Par exemple, si le premier caractère dans le flux de données est quelque étrange caractère de contrôle, peut-être 0x08 la touche retour arrière (ctl-H).
  • A tout travail été fait pour prouver mathématiquement getline aussi sûr?

Malloc Renvoie Null en cas d'Échec:

Si la fonction malloc rencontre une erreur malloc renvoie un pointeur NULL. Cela présente un risque pour la sécurité, car on peut toujours appliquer l'arithmétique des pointeurs à NULL (0x0) pointeur, donc wikipédia recommande

/* Allocate space for an array with ten elements of type int. */
int *ptr = (int*)malloc(10 * sizeof (int));
if (ptr == NULL) {
    /* Memory could not be allocated, the program should handle 
       the error here as appropriate. */
} 

Sécurisé sscanf:

Lors de l'utilisation de sscanf , j'ai pris l'habitude de l'allocation de la taille à chaînes extraites de la taille de la chaîne d'entrée, espérant éviter la possibilité d'un dépassement. Par exemple:

const char *inputStr = "a01234b4567c";
const char *formatStr = "a%[0-9]b%[0-9]c":
char *str1[strlen(inputStr)];
char *str2[strlen(inputStr)];

sscanf(inputStr, formatStr, str1, str2);

Parce que str1 et str2 sont de la taille de la inputStr et pas plus de caractères que strlen(inputStr) peut être lu à partir de inputStr, il semble impossible, compte tenu de toutes les valeurs possibles pour le inputStr à cause d'un dépassement de tampon?

  • Suis-je la corriger? Existe-il étrange cas du coin, je n'ai pas pensé?
  • Sont t-il de meilleures façons d'écrire cela? Les bibliothèques qui ont déjà résolu?

Questions Générales:

Alors que j'ai posté un grand nombre de questions que je ne vous attendez pas à quiconque de répondre à tous. Les questions sont plus de ligne directrice pour le genre de réponses que je cherche. Je veux vraiment apprendre le sécuriser C état d'esprit.

  • Quelles sont les autres sécurisé C idiomes sont là-bas?
  • Ce coin des cas, dois-je toujours vérifier?
  • Comment puis-je écrire des tests unitaires pour faire appliquer ces règles?
  • Comment puis-je appliquer les contraintes dans un testabilité ou prouvable de façon correcte?
  • Tout recommandé statique/dynamique d'analyse des techniques ou des outils pour la C?
  • Ce qui sûr, C que les pratiques de vous suivre et comment justifiez-vous à vous-même et les autres?

Ressources:

De nombreuses ressources ont été empruntés à la les réponses.

7voto

nont Points 3684

Je pense que votre sscanf exemple est mauvais. Il peut encore débordement lorsque utilisé de cette façon.

Essayez ceci, qui spécifie le nombre maximal d'octets à lire:

void main(int argc, char **argv)
{
  char buf[256];
  sscanf(argv[0], "%255s", &buf);
}

Jetez un oeil à ce IBM dev article sur la protection contre les dépassements de tampon.

En termes d'analyses, je voudrais écrire un programme qui génère aléatoirement des chaînes de caractères de longueur aléatoire et de les nourrir à votre programme, et assurez-vous qu'ils sont traités de façon appropriée.

4voto

Rob Wells Points 21714

G'day,

Un bon endroit pour commencer la recherche à ce qui est David Wheeler excellent codage sécurisé du site.

Son gratuit en ligne livre "Programmation Sécurisée pour Linux et Unix HOWTO" est une excellente ressource qui est régulièrement mis à jour.

Vous pouvez aussi regarder son excellent analyseur statique FlawFinder pour obtenir quelques conseils. Mais rappelez-vous, aucun outil automatisé est un remplacement pour une bonne paire de vécu yeux, ou comme David de couleurs chamarrées, il met..

Tout outil d'analyse statique, comme Flawfinder, n'est qu'un outil. Aucun outil ne peut se substituer à la pensée humaine! En bref, "un imbécile avec un outil est toujours un imbécile". C'est une erreur de penser que les outils d'analyse (comme flawfinder) sont un substitut pour la formation à la sécurité et à la connaissance

J'ai personnellement utilisé de David ressources depuis plusieurs années maintenant et trouver excellent.

HTH

cheers,

4voto

gavinb Points 9237
  1. Lecture à partir d'un flux

Le fait qu' getline() "sera automatiquement agrandir le bloc de mémoire que nécessaire" signifie qu'il pourrait être utilisé comme un déni de service (ddos), comme il serait trivial de générer une entrée qui a été si longtemps, il serait d'échappement de la mémoire disponible pour le processus (ou pire, le système!). Une fois une condition de mémoire se produit, d'autres vulnérabilités peuvent aussi entrer en jeu. Le comportement de code dans peu/pas de mémoire est rarement agréable, et très difficile à prédire. À mon humble avis il est plus prudent de fixer des limites supérieures sur tout, en particulier dans la sécurité des applications sensibles.

En outre (comme prévu par mentionner de caractères spéciaux) getline() seulement vous donne un tampon; il ne donne aucune garantie sur le contenu de la mémoire tampon (comme la sécurité est entièrement dépend de l'application). Donc, la désinfection, l'entrée est toujours une partie essentielle du traitement et de validation des données de l'utilisateur.

  1. sscanf

J'aurais tendance à préférer utiliser une expression régulière de la bibliothèque, et ont très étroitement définis, les expressions régulières pour les données de l'utilisateur, plutôt que d'utiliser sscanf. De cette façon, vous pouvez effectuer une bonne affaire de validation au moment de l'entrée.

  1. Commentaires généraux

    • Outils de Fuzzing sont disponibles qui génèrent des entrées aléatoires (à la fois valides et non valides) qui peut être utilisé pour tester votre entrée de manutention
    • Gestion de mémoire tampon est critique: les débordements de tampons, underflows, de mémoire
    • Des conditions de course peuvent être exploitées dans le cas contraire secure code
    • Les fichiers binaires peuvent être manipulées à injecter des valeurs non valides ou surdimensionnés des valeurs dans les en-têtes, de sorte que le format de fichier de code doit être solide et ne pas assumer des données binaires est valide
    • Les fichiers temporaires peuvent souvent être une source de problèmes de sécurité, et doit être géré avec soin
    • L'injection de Code peut être utilisé pour remplacer le système ou de la bibliothèque d'exécution des appels malveillants versions
    • Les Plugins de fournir un grand vecteur d'attaque
    • En tant que principe général, je vous suggérerais d'avoir clairement défini les interfaces où les données de l'utilisateur (ou toutes les données provenant de l'extérieur de l'application) est supposé non valide et hostile jusqu'à ce qu'elle soit traitée, désinfectés et validé, et la seule façon pour les données de l'utilisateur à accéder à l'application

1voto

1voto

Pascal Cuoq Points 39606

Yannick Moy a développé un système de préconditionnement de Hoare / Floyd pour C pendant sa thèse et l'a appliqué à la bibliothèque de chaînes gérées par le CERT . Il a trouvé un certain nombre de bugs (voir page 197 de son mémoire). La bonne nouvelle est que la bibliothèque est désormais plus sûre pour son travail.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X