web-dev-qa-db-fra.com

Memcpy sécurisé pour pure c

Les débordements tampons ne sont rien de nouveau. Et pourtant, ils semblent toujours souvent, en particulier dans le code natif (c'est non géré) ...

Une partie de la cause fondamentale est l'utilisation des fonctions "dangereuses", y compris des agrafes C++ telles que MemCY, Strcpy, Strncpy, et plus encore. Ces fonctions sont considérées comme dangereuses car elles traitent directement des tampons non contraignés et sans but intensif à des limites prudentes de manière typique débordera directement de tampons cibles.

Microsoft via SDL a interdit l'utilisation de ces fonctions "dangereuses" et fournit des fonctions de remplacement pour C++ - E.G. Strcpy_s pour Strcpy, memcpy_s pour memcpy, etc. (selon l'environnement). Les dernières versions de Visual Studio vous permettront même de le faire automatiquement ...

Mais qu'en est-il de "pur" c (I.e. pas C++)?
[.____] et surtout, qu'en est-il des plates-formes non-MS - y compris les compilateurs Linux et même non-VS sur Windows ...
[.____] Est-ce que quelqu'un a des fonctions de remplacement plus sûres pour ceux-ci? Des solutions de contournement recommandées (en plus de simplement faire une vérification plus limites ...)?
[.____] ou sommes-nous tous condamnés à continuer à répéter notre utilisation de MEMCY?

12
AviD

La réponse complète est la suivante: arrêtez d'utiliser C (ou C++)! C'est un outil dangereux archaïque et carrété. Passez à une langue avec sécurité intégrée (Java, C #, Scheme, OCAML, Python ... Le choix est grand).

Un débordement de tampon est un bug, parmi la classe générique de bugs appelée "Le programmeur n'est pas pleinement conscient de ce qu'il fait". Une langue avec des bornes vérifie (ou même l'utilisation de memcpy_s()) ne supprimera pas ces bugs; Cela ne fera que des conséquences un peu moins stressées (par exemple une exception étant lancée, impliquant généralement une terminaison immédiate du fil). C'est comme une ceinture de sécurité: une ceinture de sécurité n'empêche pas les accidents de la voiture, il essaie simplement de vous garder en vie pendant que votre voiture est gérée dans l'oubli. Vous devez donc utiliser des contrôles liés (en particulier les langues qui intègrent de telles vérifications de manière transparente) pour la même raison que vous devriez toujours attacher votre ceinture de sécurité.

Comme pour C: memcpy_s() _ et son ILK sont en fait définis dans l'ISO/IECR TR 24731 (une norme de 2005) afin qu'ils soient censés percoler, à un moment donné, dans les compilateurs C et C++. Mais il semble que seuls Microsoft les poussent maintenant. Pour les fonctions "String" (strcpy() et strcat()), il existe des fonctions standard (C99) (strncpy() et strncat()) et certains Les systèmes d'exploitation BSD (principalement openBSD) utilisent des variantes qui ont une API quelque peu plus facile à utiliser (strlcpy() et strlcat()). Cependant, aucune de ces fonctions ne corrige le bogue, qui est que le programmeur tente de mettre des données dans un tampon trop petit; Ils font simplement le programmeur au courant du fait que sa mémoire tampon peut avoir une taille inadéquate.

4
Thomas Pornin

Le noyau Linux fait plusieurs milliers d'appels à des fonctions non sécurisées telles que strcpy() et strcat() aussi tampon Les débordements dans cette base de code sont très rares. En fait, les fonctions dangereuses "sont préférées pour la copie de texte statique car elles réduisent les frais généraux. Vous pouvez utiliser des "appels de fonction sûrs" de manière non sécurisée, strncpy(dest,source,strlen(source));. Le choix des fonctions ne signifie rien pour la sécurité du système.

Ce problème est mieux résolu avec les systèmes modernes de protection de la mémoire. Ce sont implicites et le code ne doit pas nécessairement être réécrit. Dans les logiciels modernes avec canaries, ASLR et NX Zones Buffer, les débordements de tampons seuls ne sont pas très utiles. Pointants suspendus où utilisé dans le 2010 pwn2own pour Windows 7 et IE8 et le plus récent Flash 0-Day n'a pas utilisé de débordement tampon =.

3
rook

Mais qu'en est-il de "pur" c (I.e. pas C++)?

Je ne pense pas que des fonctions telles que MemcPy_s sont vraiment qualifiées comme des remplacements "sécurisés" pour MEMCY, mais de toute façon, ils sont également applicables dans Pure 'C ", il n'ya pas beaucoup de" C++ "à leur sujet. Ils ne sont ni spécifiques à la plate-forme (en ce sens que ce n'est pas si difficile d'écrire une version portable d'eux, même si vous ne pouvez pas compter sur eux faisant partie de la bibliothèque de la plate-forme C).

En ce qui concerne la sécurité, MemCy & CO sont définis de manière à permettre une gribouillie arbitraire à la mémoire. C'est ce qu'ils sont pour, et aucune quantité d'ajout de paramètres de taille ne changera cela.

En même temps, je ne pense pas que ce soit raisonnable (encore) de dire "N'utilisez pas" C "/ C++" car il y a encore beaucoup de systèmes dans lesquels une langue "C" est la seule option pratique.

La vraie question à laquelle je suppose est de savoir s'il existe une alternative plus sûre à Gestion des tampons qui a plus d'un filet de sécurité que MemCy et qui peut être utilisé à partir de C et C++. Et bien certainement. Une classe API ou C++ pourrait être définie pour allouer, gérer et accéder aux bornes de contrôle et aux tableaux vérifiés et c'est exactement le genre de chose que l'interprète pour le Java == == VM et al est accessible.

Il existe également des langues telles que Objective-C, qui ne sont pas encore gérées, qui ont une grande partie des aspects de sécurité du code géré, malgré le fait que MemCPY, etc. sont disponibles. En effet, le cadre de cacao a tendance à encourager et au moins au moins l'utilisation d'alternatives plus sûres.

2
frankodwyer

Une autre API 'Safe' Safe 'pour manipuler des chaînes en C est bibliothèque de chaînes de Daniel J Bernstein . Crédit à André Pang pour le pointant cela.

1
user185

Les gens ne cesseront jamais de faire des erreurs. Même dans les "implémentations sûres" et la liste des langues que Thomas pornin a mentionné qu'il y aura une place pour une vulnérabilité. Dans la réponse actuelle, je ne voudrais pas approfondir les spécificités de C/C++ - il n'aura pas beaucoup de sens comme addendum à ce qui a déjà été dit. Ici, vous souhaitez souligner qu'une autre solution n'est pas la prévention des bugs elle-même, mais d'atténuer les conséquences d'exploitation. C'est juste une autre partie de ce qui peut être fait dans un souci de sécurité. Comme le meilleur des exemples, examinez le navigateur de Google, Chrome - ils ont mis en œuvre de sandboxing. Une autre possibilité est une autre possibilité d'options de sécurité du compilateur et d'atténies d'exploitation au niveau du système d'exploitation. Ce sont les conséquences de ce qui a été dit dans Une très première phrase et est une reconnaissance du fait que l'introduction de bogues est inévitable partie de chaque développement logiciel.

0
anonymous