Dépassements D'Amortisseur
Des dépassements d'amortisseur ont été longtemps identifiés comme problème dans des langages de bas niveau. Le problème de noyau est que des paramètres d'écoulement de données et de programme d'utilisateur sont mélangés pour l'exécution, et les langages de bas niveau permettent l'accès direct à la mémoire d'application. C et C++ sont les deux langues les plus populaires affligées avec des dépassements d'amortisseur. À proprement parler, un dépassement d'amortisseur se produit quand un programme permet à l'entrée d'écrire au delà de l'extrémité de l'amortisseur assigné, mais il y a plusieurs problèmes associés qui ont souvent le même effet. Un des plus intéressante est des bogues de corde de format. Une autre incarnation du problème se produit quand on permet à un un attaquant d'écrire à un endroit de mémoire arbitraire en dehors de d'une rangée dans l'application, et tandis que, à proprement parler, cet isn’t un dépassement classique d'amortisseur, nous’la couverture de ll qui ici aussi. L'effet d'un dépassement d'amortisseur est quelque chose d'un accident à l'attaquant gagnant la commande complète de l'application, et si l'application fonctionne en tant qu'utilisateur à niveau élevé (racine, administrateur, ou système local), alors la commande du logiciel d'exploitation entier et de tous les autres utilisateurs qui sont actuellement entrés, ou entrera, est aux mains de l'attaquant. Si l'application en question est un service de réseau, le résultat de la paille pourrait être un ver. Le premier ver bien connu d'Internet a exploité un amortisseur débordé dans le serveur de doigt, et a été connu comme ver de doigt de Robert T. Morris (ou Morris juste). Bien qu'il semble comme si nous’d avons appris comment éviter des dépassements d'amortisseur puisqu'on presque réduit l'Internet en 1988, nous continuent à voir des rapports fréquents des dépassements d'amortisseur dans beaucoup de types de logiciel. Bien que l'on ait pourrait penser que seulement la proie mouillée et négligente de chute de programmeurs à l'amortisseur déborde, le problème est complexe, plusieurs des solutions ne sont pas simples, et n'importe qui qui ont écrit assez de code de C/C++ a presque certainement fait cette erreur. Les programmeurs même très bons et très soigneux font des erreurs, et les programmeurs les meilleurs savent elle facile est de glisser vers le haut et de mettre des pratiques d'essai pleines de déceler en place des erreurs. Langues AffectéesC est le langage le plus commun employé pour créer des dépassements d'amortisseur, de près suivis de C++. Il’s facile de créer des dépassements d'amortisseur quand l'inscription en assembleur donné le n'a aucune sauvegarde du tout. Bien que C++ soit en soi aussi dangereux que C, parce que c'est un superjeu de C, employer la bibliothèque standard de calibre (STL) avec soin peut considérablement réduire le potentiel de traiter mal des cordes. La plus grande sévérité du compilateur de C++ aidera un programmeur à éviter quelques erreurs. Notre conseil est que même si vous écrivez le code pur de C, employer le compilateur de C++ aura comme conséquence un code plus propre. Les langues de plus haut niveau plus récemment inventées soustraient l'accès mémoire direct loin du programmeur, généralement à un coût substantiel d'exécution. Les langues telles que Java, C #, et de base visuel ont les types indigènes de corde, rangées bondir-vérifiées, et interdisent généralement l'accès mémoire direct. Bien que certains indiquent que ceci rend des dépassements d'amortisseur impossibles, il’s plus précis pour dire que les dépassements d'amortisseur sont beaucoup moins probables. En réalité, la plupart de ces langues sont mises en application dans C/C++, et les pailles d'exécution peuvent avoir comme conséquence des dépassements d'amortisseur. Une autre source potentielle des dépassements d'amortisseur en code de plus haut niveau existe parce que le code doit finalement se connecter par interface à un logiciel d'exploitation, et ce logiciel d'exploitation est presque certainement écrit dans C/C++. C # vous permet d'exécuter sans filet en déclarant les sections peu sûres ; cependant, alors qu'il fournit à une interopérabilité plus facile le logiciel d'exploitation et les bibliothèques fondamentaux écrits dans C/C++, vous pouvez faire les mêmes erreurs que vous pouvez dans C/C++. Si vous programmez principalement dans des langues de plus haut niveau, l'action à entreprendre principale pour vous doit continuer à valider des données passées aux bibliothèques externes, ou vous pouvez agir en tant que conduit à leurs pailles. Bien que nous’au sujet de ne pas aller fournir une liste approfondie de langues affectées, la plupart des langues plus anciennes soyons vulnérables pour protéger des dépassements Le Péché A expliquéL'incarnation classique d'un dépassement d'amortisseur est connue en tant que “casser la pile.” Dans un programme compilé, la pile est employée aux paramètres de prise, tels que des arguments, où l'application doit lui retourner une fois est faite avec la fonction et en raison de le petit nombre de registres disponibles sur les processeurs x86, tout à fait souvent les registres obtiennent stockés temporairement sur la pile. Malheureusement, des variables qui sont localement assignées sont également stockées sur la pile. Ces variables de pile désigné parfois inexactement sous le nom étant statiquement assigné, par opposition à être mémoire dynamiquement assignée de tas. Si vous entendez quelqu'un parler d'un dépassement d'amortisseur statique, ce que signifient vraiment elles est un dépassement d'amortisseur de pile. La racine du problème est que si l'application écrit au delà des limites d'une rangée assignée sur la pile, l'attaquant obtient d'indiquer des paramètres. Et c'est critique au succès ; l'attaquant veut modifier des paramètres selon des valeurs de son offrir. L'on a pourrait demander pourquoi nous continuons à employer un système évidemment dangereux. Nous avons eu une occasion d'échapper au problème, au moins en partie, avec une migration au morceau’64-bit d'Intel s Itanium, où des adresses de retour sont stockées dans un registre. Le problème est que nous’d devons tolérer vers l'arrière une perte significative de compatibilité, et en date de cette écriture, il s'avère que le morceau x64 finira probablement vers le haut du morceau plus populaire. Vous pouvez également demander pourquoi nous mettons juste’t que tous émigrent au code qui effectue la rangée stricte vérifiant et rejettent l'accès mémoire direct. Le problème est celui pour beaucoup de types d'applications, les caractéristiques d'exécution des langues de plus haut niveau ne sont pas proportionné. Une position de compromis doit employer des langues de plus haut niveau pour les interfaces supérieures qui agissent l'un sur l'autre avec des choses dangereuses (comme des utilisateurs !), et langues plus basses pour le code de noyau. Une autre solution est d'employer entièrement les possibilités de C++, et emploie des bibliothèques de corde et des classes de collection. Par exemple, le web server 6.0 du serveur de l'information d'Internet (IIS) commuté entièrement à une classe de corde de C++ pour manipuler l'entrée, et un bravent le réalisateur l'ont réclamé que’d amputent son petit doigt si des dépassements d'amortisseur étaient trouvés en son code. En date de cette écriture, le réalisateur a toujours son doigt et aucun bulletin de sécurité n'a été publié contre le web server au cours des presque deux ans depuis que son dégagement. Les compilateurs modernes traitent bien templatized des classes, et il est possible d'écrire le code très à rendement élevé de C++. Assez de théorie—a laissé’s considérer un exemple : # incluez < stdio.h > videz DontDoThis(char * entrée) strcpy(buf, entrée) ; printf("%s\n", buf) ; argc de main(int, char internes * argv[ ]) Laissez maintenant’s compiler l'application et jeter un coup d'oeil à ce qui se produit. Pour cette démonstration, l'auteur a employé une construction de dégagement avec des symboles de correction permis et la vérification de pile neutralisée. Un bon compilateur voudra également en ligne à une fonction aussi petite que DontDoThis, particulièrement s'il s'appelle seulement une fois, ainsi il a également neutralisé des optimisations. Ici’s ce qui ressemble la pile à sur son système immédiatement avant d'appeler strcpy : Fe 12 de 0x0012FEC0 c8 00 Èþ. < - adresse de
l'argument de buf Rappelez-vous que toutes les valeurs sur la pile sont vers l'arrière. Cet exemple est d'un système d'Intel, qui est “petit-endian.” Ceci signifie que le moindre byte significatif d'une valeur vient d'abord, ainsi si vous voyez une adresse de retour dans la mémoire comme “3f104000,” il’de s l'adresse 0x0040103f vraiment. Laissez maintenant’s regarder ce qui se produit quand le buf est recouvert. Les premiers paramètres sur la pile sont le contenu du registre bas prolongé de l'indicateur (EBP). EBP contient l'indicateur d'armature, et si au loin-par-un le débordement se produit, EBP sera tronqué. Si l'attaquant peut commander la mémoire à 0x0012fe00 (au loin-par-un des zéros hors du dernier byte), le programme saute à cet endroit et exécute le code attaquant-fourni. Si l'isn t’de dépassement contraint à un byte, le prochain article pour aller est l'adresse de retour. Si l'attaquant peut commander cette valeur, et peut placer assez de montage dans un amortisseur qu'ils connaissent l'endroit de, vous’au sujet de regarder un dépassement exploitable classique d'amortisseur. Notez que le doesn t de code d'assemblée (souvent connu sous le nom de code de coquille parce que l'exploit la plus commune doit appeler une coquille de commande’) doivent être placés dans l'amortisseur ce’s étant recouvert. Il’s le cas classique, mais en général, le code arbitraire que l'attaquant a placé dans votre programme pourrait être localisé ailleurs. Mettez’la prise de t n'importe quel confort de penser que le dépassement est confiné à un petit secteur. Une fois que l'adresse de retour a été recouverte, l'attaquant obtient de jouer avec les arguments de la fonction exploitable. Si le programme écrit à un quelconque de ces arguments avant le renvoi, il représente une occasion pour la mutilation additionnelle. Ce point devient important quand vu l'efficacité des contre-mesures de trifouillage de pile tels que Crispin Cowan’s Stackguard, IBM’s ProPolice, et drapeau’de compilateur de Microsoft s /GS. Comme vous pouvez voir, nous’ve juste donné l'attaquant au moins trois manières de prendre la commande de notre application, et c'est seulement dans une fonction très simple. Si une classe de C++ avec des fonctions virtuelles est déclarée sur la pile, alors la table virtuelle d'indicateur de fonction sera disponible, et ceci peut facilement mener aux exploits. Si un des arguments à la fonction s'avère justement être un indicateur de fonction, qui est tout à fait commun dans n'importe quel système de fenêtrage (par exemple, système ou Microsoft Windows de fenêtre de X), alors le recouvrement de l'indicateur de fonction avant l'utilisation est une manière évidente de détourner la commande de l'application. Beaucoup, beaucoup plus de manières intelligentes de saisir la commande d'une application existent que nos cerveaux faibles peuvent penser à. Il y a un déséquilibre entre nos capacités comme réalisateurs et les capacités et les ressources de l'attaquant. Vous’au sujet d'non accordé une quantité d'heure infinie d'écrire votre application, mais les attaquants ne peut pas avoir toute autre chose à faire avec du leur temps disponible copieux que la figure hors de la façon faire votre code font ce qu'elles veulent. Votre code peut protéger des capitaux cet’assez objet de valeur de s pour justifier des mois d'effort de renverser votre application. Les attaquants passent beaucoup de temps se renseignant sur les derniers développements en causant la mutilation, et ont des ressources comme www.metasploit.com où ils peuvent se diriger et cliquer leur manière d'écosser le code qui fait presque n'importe quoi ils veulent tandis que fonctionnant dans un jeu de caractères contraint. Si vous essayez de déterminer si quelque chose est exploitable, il est fortement probable que vous l'obteniez faux. Dans la plupart des cas, il est seulement possible de montrer que quelque chose est ou exploitable ou que vous n'êtes pas futé assez (ou probablement démuni avez passé assez de temps) pour déterminer comment écrire une exploit. Il est extrêmement rare de pouvoir prouver avec n'importe quelle confiance du tout qu'un dépassement n'est pas exploitable. Le point de cette diatribe est que la chose futée à faire est de fixer juste les bogues ! Il y a eu des périodes multiples qui “codent des améliorations de la qualité” se sont avérées être des difficultés de sécurité dans la rétrospection. Cet auteur a juste passé plus de trois heures discutant avec une équipe de développement environ si elles doivent fixer un bogue. Le fil de E-mail a eu un total de huit personnes là-dessus, et nous ayons facilement passé 20 heures (moitié par personne-semaine) discutant, que fixer le problème ou pas parce que l'équipe de développement a voulu la preuve que le code ait été exploitable. Une fois que les experts en matière de sécurité s'avéraient le bogue était vraiment un problème, la difficulté a été estimée à une heure de temps de réalisateur et de quelques heures de temps d'essai. Ce’s une perte de temps incroyable. L'un moment où vous voulez être analytique est immédiatement avant d'embarquer une application. Si une application est aux étapes finales, vous’d aimez pouvoir faire une bonne conjecture si le problème est exploitable pour justifier le risque de régressions et de déstabiliser le produit. Il’s une idée fausse commune qui déborde dans des amortisseurs de tas sont moins exploitable qu'empilent les dépassements, mais ceci s'avère ne pas être le cas. La plupart des réalisations de tas souffrent de la même paille de base que la pile—les données d'utilisateur et les paramètres sont mélangé. Selon l'exécution du distributeur de mémoire, il est souvent possible d'obliger le directeur de tas à placer quatre bytes du choix’de l'attaquant s dans l'endroit indiqué par l'attaquant. Les détails de la façon attaquer un tas sont quelque peu mystérieux. Une présentation récente et clairement écrite sur la matière, “des exploits fiables de tas de Windows” par le shok “Conover” de Matthew et un Oded Horovitz, peuvent être trouvés à http://cansecwest.com/ csw04/csw04-Oded+Connover.ppt. Même si le directeur de tas ne peut pas être renversé pour faire un attaquant’s offrant, les données dans les attributions contiguës peuvent contenir des indicateurs de fonction, ou des indicateurs qui seront employés pour écrire l'information. En même temps, exploitant des débordements de tas a été considéré exotique et les débordements—durs de tas sont maintenant certains des types plus fréquents d'erreurs exploitées. C/C++ pécheur Il y a beaucoup, beaucoup de manières de déborder un amortisseur dans C/C++. Ici’s ce qui a causé le ver de doigt de Morris : char buf[20 ] ; gets(buf) ; Il n'y a absolument aucune manière d'employer obtient de lire pour entrer du stdin sans risquer un débordement des fgets—d'utilisation d'amortisseur à la place. Peut-être la deuxième manière populaire de déborder des amortisseurs est d'employer strcpy (voyez l'exemple précédent). C'est une autre manière de poser des problèmes : char buf[20 ] ; strcpy(buf, préfixe) ; buf[MAX_PATH de char ] ; sprintf(buf, "%s - %d\n", chemin, errno) ; Il’s presque impossible, excepté dans quelques cas faisants le coin, pour employer le sprintf sans risque. Un bulletin critique de sécurité pour Microsoft Windows a été libéré parce que le sprintf a été employé dans une fonction de notation de correction. Référez-vous au bulletin MS04-011 pour plus d'information (voyez le lien dans “l'autre section” de ressources). Ici’s un autre favori : char buf[32 ] ; Une autre manière de poser des problèmes est en confondant le compte de caractère avec le nombre d'octets. Si vous’au sujet de traiter des caractères d'ASCII, ceux-ci êtes le même, mais si vous’au sujet de traiter Unicode, là êtes de deux bytes à un caractère. Ici’s un exemple : _ snwprintf(wbuf, sizeof(wbuf), "%s\n", entrée) ; bool compte pInFile et non signé de CopyStructs(InputFile
* long) m_pStructs = nouveau Structs[count ] ; for(i = 0 ; i < compte ; i++) PTR = malloc(sizeof(type) * compte) ; Ici’s une autre manière que un dépassement d'amortisseur peut obtenir créé : # définissez MAX_BUF 256 len = strlen(input) ; cours de //of nous pouvons employer strcpy sans risque size_t de const MAX_BUF = 256 ; len = strlen(input) ; cours de //of nous pouvons employer strcpy sans risque Péchés Relatifs Un péché étroitement lié est des débordements de nombre entier. Si vous choisissez d'atténuer des dépassements d'amortisseur en employant la corde comptée manipulant des appels, ou essayez de déterminer combien de pièce d'assigner sur le tas, l'arithmétique devient critique à la sûreté de l'application. Des bogues de corde de format peuvent être employés pour accomplir le même effet qu'un dépassement d'amortisseur, mais aren’des dépassements de t vraiment. Un bogue de corde de format est normalement accompli sans ne déborder aucun amortisseur du tout. Une variante sur un dépassement d'amortisseur est une illimitée écrivent à une rangée. Si l'attaquant peut fournir l'index de votre rangée, et vous mettez’t valident correctement s'il’s dans les limites correctes de la rangée, visé écrivent à un endroit de mémoire de l'attaquant que’choix de s sera exécuté. Non seulement peut tout de la même déviation de l'écoulement de programme se produire, mais également l'attaquant peut ne pas devoir perturber la mémoire adjacente, qui entrave tous les contre-mesures que vous pourriez avoir en place contre des dépassements d'amortisseur. Repèrer le modèle de péchéVoici les composants à rechercher :
Repèrer le péché pendant la revue de codeRepèrer ce péché pendant la revue de code s'étend d'être très facile extrêmement à difficile. Les choses faciles à rechercher sont utilisation de corde peu sûre manipulant des fonctions. Une issue à se rendre compte de est que vous pouvez trouver beaucoup d'exemples d'utilisation sûre, mais ce’s été notre expérience qu'il y a des problèmes se cachant parmi les appels corrects. Le code convertissant aux appels sûrs d'utilisation seulement a un taux très bas de régression (n'importe où du 1/10th au 1/100th du normal bogue-fixez le taux de régression), et il enlèvera des exploits de votre code. Une bonne manière de faire ceci est a laissé le compilateur trouver des appels de fonction dangereux pour vous. Si vous strcpy non défini, strcat, sprintf, et fonctions semblables, le compilateur trouverez tous pour vous. Un problème à se rendre compte de est que quelques apps re-ont mis en application toute l'ou une partie bibliothèque d'exécution de C intérieurement. Un plus difficile charge recherche des dépassements de tas. Fondamentalement, vous voulez à d'abord recherchez des attributions, et puis examinez l'arithmétique employée pour calculer la taille d'amortisseur. La meilleure approche globale est de tracer l'utilisateur entré des points d'entrée de votre application par tous les appels de fonction. Se rendant compte de ce que l'attaquant commande des marques une grande différence Méthodes d'essai pour trouver le péchéLe duvet examinant, qui soumet votre application aux entrées de semi-finale-random, est l'une des méthodes d'essai meilleures à employer. Essayez d'augmenter la longueur des cordes d'entrée tout en observant le comportement du APP. Quelque chose regarder dehors pour est que parfois les disparités entre la vérification d'entrée auront comme conséquence les fenêtres relativement petites du code vulnérable. Par exemple, quelqu'un pourrait mettre un contrôle dans un endroit que l'entrée doit être moins de 260 caractères, et puis assigne un amortisseur de 256 bytes. Si vous examinez une entrée très longue, elle sera simplement rejetée, mais si vous frappez le débordement exactement, vous pouvez trouver une exploit. Les longueurs qui sont des multiples de deux et les multiples de deux plus ou sans un trouveront souvent des problèmes. D'autres tours à essayer recherchent n'importe quel endroit dans l'entrée où la longueur de quelque chose est utilisateur indiqué. Changez la longueur de sorte qu'elle n'assortisse pas la longueur de la corde, et recherchez particulièrement les conditions de possibilités de débordement—de nombre entier où la longueur + 1 = 0 sont souvent dangereuse. Quelque chose que vous devriez faire quand l'essai de duvet doit créer une construction spécialisée d'essai. Corrigez les constructions ont souvent affirme cet écoulement de programme de changement et vous gardera de frapper des conditions exploitables. D'autre part, corrigez les constructions sur les compilateurs modernes contiennent typiquement une détection plus avançée de corruption de pile. Selon votre tas et logiciel d'exploitation, vous pouvez également permettre une vérification plus rigoureuse de corruption de tas. Un changement que vous pouvez vouloir pour faire en votre code est que si un affirmer vérifie l'entrée d'utilisateur, changez le suivant de assert(len < MAX_PATH) ; à if(len > = MAX_PATH) Vous devriez toujours examiner votre code sous une certaine forme d'outil de détection des erreurs de mémoire, tel qu'appVerifier sur Windows Péchés D'ExempleLes entrées suivantes, qui viennent directement des vulnérabilités communes et les expositions énumèrent, ou CVE (http://cve.mitre.org), sont des exemples des dépassements d'amortisseur. Un peu intéressant de trivia est celui en date de cette écriture, 1.734 entrées de CVE que le dépassement “d'amortisseur d'allumette” existent. Une recherche des bulletins de renseignements de CERT, qui documentent seulement les vulnérabilités plus répandues et plus sérieuses, rapporte 107 coups sur “le dépassement d'amortisseur.” CVE-1999-0042De la description de CVE : “Protégez le débordement à l'université de l'exécution’de Washington s de l'IMAP et SAUTEZ les serveurs.“ Cette entrée de CVE est complètement documentée dans le bulletin de renseignements CA-1997-09 de CERT, et a impliqué un dépassement d'amortisseur dans l'ordre d'authentification de l'université des serveurs’du protocole d'accès message Internet de Post Office Protocol (BRUIT) et de Washington s (IMAP). Une vulnérabilité relative était que le serveur de E-mail n'a pas mis en application moindre privilège, et l'exploit a accordé l'accès de racine aux attaquants. Le débordement a mené à l'exploitation répandue des systèmes vulnérables. Les contrôles de vulnérabilité de réseau ont conçu pour trouver des versions vulnérables de ce serveur ont trouvé les pailles semblables dans des laboratoires SLMail 2.5 de Seattle comme rapporté à www.winnetmag.com/Article/ArticleID/9223/9223.html. CVE-2000-0389–CVE-2000-0392De CVE-2000-0389 : “Le débordement d'amortisseur dans la fonction de krb_rd_req dans Kerberos 4 et 5 permet aux attaquants à distance de gagner des privilèges de racine.” De CVE-2000-0390 : “Le débordement d'amortisseur dans la fonction de krb425_conv_principal dans Kerberos 5 permet aux attaquants à distance de gagner des privilèges de racine.“ De CVE-2000-0391 : “Le débordement d'amortisseur dans le krshd dans Kerberos 5 permet aux attaquants à distance de gagner des privilèges de racine.“ De CVE-2000-0392 : “Le débordement d'amortisseur dans le ksu dans Kerberos 5 permet aux utilisateurs locaux de gagner des privilèges de racine.“ Cette série de problèmes dans l'exécution de MIT du Kerberos est documentée comme bulletin de renseignements CA-2000-06 de CERT, a trouvé à www.cert.org/bulletin de renseignements/CA-2000-06.html. Bien que le code source ait été à la disposition du public pendant plusieurs années, et le problème a provenu de l'utilisation de la corde dangereuse manipulant des fonctions (strcat), on lui a seulement rapporté en 2000. CVE-2002-0842, CVE-2003-0095, CAN-2003-0096
Ces vulnérabilités sont documentées dans le bulletin de renseignements CA-2003-05 de CERT, situé à www.cert.org/bulletin de renseignements/CA-2003-05.html. Les problèmes sont un ensemble de plusieurs trouvés par David Litchfield et son équipe à logiciel Ltd de sécurité de prochaine génération. Comme aparté, ceci démontre cela qui annonce une’application de s car “incassable” peut ne pas être la meilleure chose à faire tandis que M. Litchfield étudie vos applications. CAN-2003-0352
Ce débordement est intéressant parce qu'il a mené à l'exploitation répandue par deux vers très destructifs ces que tous les deux ont causé la rupture significative sur l'Internet. Le débordement était dans le tas, et a été démontré par le fait qu'il était possible de construire un ver qui était très stable. Un facteur de contribution était un échec de principe de moindre privilège : l'interface ne devrait pas avoir été à la disposition des utilisateurs anonymes. Une autre note intéressante est que les contre-mesures de débordement dans Windows 2003 ont dégradé l'attaque à partir de l'escalade du privilège au démenti du service. Plus d'information sur ce problème peut être trouvée à www.cert.org/bulletin de renseignements/ CA-2003-23.html, et à www.microsoft.com/technet/security/bulletin/MS03-039.asp Étapes De RachatLa route pour protéger le rachat de dépassement est longue et remplie de nids de poule. Nous discutons une grande variété de techniques qui vous aident à éviter des dépassements d'amortisseur, et un certain nombre d'autres techniques qui réduisent les dépassements d'amortisseur de dommages peuvent causer. Laissez’s regarder comment vous pouvez améliorer votre code. Remplacez La Corde Dangereuse Manipulant Des FonctionsVous devriez, au minimum, remplacer les fonctions peu sûres comme strcpy, le strcat, et le sprintf avec les versions comptées de chacune de ces fonctions. Vous avez un certain nombre de choix avec de ce que pour les remplacer. Maintenez dans l'esprit que des fonctions comptées plus anciennes ont des problèmes d'interface, et vous demandent de faire l'arithmétique dans beaucoup de cas pour déterminer des paramètres. Les ordinateurs aren’t aussi bon aux maths que vous pourriez espérer. De plus nouvelles bibliothèques aiment le strsafe, le tube sûr (bibliothèque d'exécution de C) qui sera embarquée dans le studio visuel de Microsoft (et est sur une voie rapide à devenir une partie de la norme de la norme ANSI C/C++), et strlcat/strlcpy pour * niez. Vous devez également prendre le soin avec la façon dont chacune de ces fonctions manipule l'arrêt et la troncation des cordes. Quelques fonctions garantissent l'arrêt nul, mais la plupart des fonctions comptées plus anciennes pas . L'expérience du groupe’s de Microsoft Office avec remplacer la corde peu sûre manipulant des fonctions pour le dégagement du bureau 2003 était que le taux de régression (nouveaux bogues causés par difficulté) était extrêmement bas, ainsi met’t a laissé la crainte de l'arrêt de régressions vous. Attributions D'AuditUne autre source des dépassements d'amortisseur vient des erreurs arithmétiques. Vérifiez les boucles et rangez les accèsUne troisième manière dont l'amortisseur déborde sont causées ne vérifie pas correctement l'arrêt dans les boucles, et en vérifiant pas correctement des limites de rangée avant écrivez l'accès. C'est l'un des secteurs les plus difficiles, et vous constaterez que, dans certains cas, le problème et l'terre-éclatement-kaboom sont dans des modules complètement différents. Remplacez les amortisseurs de corde de C avec des cordes de C++C'est plus efficace que juste remplaçant les appels habituels de C, mais peut causer des quantités énormes de changement de code existant, en particulier si l'isn t’de code déjà compilé comme C++. Vous devriez également vous rendre compte de et comprendre les caractéristiques d'exécution des classes de récipient de STL. Il est très possible d'écrire le code à rendement élevé de STL, mais comme beaucoup d'autres aspects de la programmation, un manque de lire le manuel fin (RTFM) aura souvent comme conséquence des résultats moins qu'optimaux. Le remplacement le plus commun doit employer les classes de calibre de STL std::string ou de std:wstring. Remplacez les rangées statiques avec des récipients de STLTous les problèmes remarquables ci-dessus appliquent aux récipients de STL comme le vecteur, mais un problème additionnel est que non toutes les réalisations de la construction de vector::iterator vérifient hors de l'accès de limites. Cette mesure peut aider, et l'auteur trouve cela employer le STL permet pour qu'il écrive le code correct plus rapidement, mais se rende compte que cet isn’t une balle argentée. Utilisez Les Outils D'AnalyseIl y a quelques bons outils venant sur le marché qui analysent le code de C/C++ pour des défauts de sécurité ; les exemples incluent Coverity, PREfast, et Klocwork. Le NET visuel 2005 de studio inclura un PREfast et un outil différent appelés la langue d'annotation de code source (SEL) pour aider à dépister des défauts de sécurité tels que des dépassements d'amortisseur. La meilleure manière de décrire le SEL est par le code. Dans l'exemple (idiot) qui suit, vous savez le rapport entre les données et les arguments de compte : les données sont des bytes de compte long. Mais le doesn t’de compilateur savent ; il voit juste un char * et un size_t. vide * DoStuff(char * données, compte de size_t) { Ce code semble CORRECT (ignorant le fait nous les amortisseurs statiques de renvoi peu disposés, mais nous câlinons). Cependant, si le compte est plus grand que 32, alors vous avez un dépassement d'amortisseur. Une version annotée par SEL de ceci attraperait le bogue : vide * char de DoStuff(__in_ecount(count) * données,
compte de size_t) { Mesures Défensives SupplémentairesConsidérez les mesures additionnelles de défensive la même manière que vous pensez à des ceintures de sécurité dans votre voiture. Les ceintures de sécurité réduiront souvent la sévérité d'un accident, mais vous ne voulez toujours pas entrer dans un accident. Il’s important pour noter que pour chaque classe principale d'amortisseur débordez la réduction, les conditions précédemment exploitables qui ne sont plus exploitables du tout existent ; et pour n'importe quelle technique donnée de réduction, une attaque suffisamment complexe peut surmonter la technique complètement. Laissez’s regarder quelques unes d'elles. Empilez La ProtectionLa protection de pile a été frayée un chemin par Crispin Cowan dans son produit de Stackguard, et a été indépendamment mise en application par Microsoft comme le commutateur de compilateur de /GS. À son plus fondamental, empilez les endroits de protection une valeur connue sous le nom de canari sur la pile entre les variables locales et l'adresse de retour. De plus nouvelles réalisations peuvent également commander à nouveau des variables pour l'efficacité accrue. L'avantage de cette approche est qu'il est bon marché, a des frais généraux minimaux d'exécution, et a l'avantage additionnel de faciliter des bogues de corruption de pile de correction. Un autre exemple est ProPolice, une prolongation de la collection de compilateur de gnu (GCC) créée par IBM. N'importe quel produit courant devrait utiliser la protection de pile. Vous devriez vous rendre compte que la protection de pile puisse être surmontée par une variété de techniques. Si une table virtuelle d'indicateur de fonction est recouverte et la fonction s'appelle avant le retour de la fonction—les destructeurs que virtuels sont de bons candidats—alors l'exploit se produira avant que la protection de pile puisse hériter le jeu. Pile et tas non-executableCe les contre-mesures offre la protection considérable contre un attaquant, mais il peut avoir un impact significatif de compatibilité d'application. Quelques applications légitimement compilent et exécutent le code en marche, comme beaucoup d'applications écrites en Java et C #. il’s aussi important pour noter que si l'attaquant peut faire tomber votre application proie à un retour dans l'attaque de libc, où un appel légitime de fonction est fait pour accomplir les extrémités célérates, alors la protection d'exécution à la page de mémoire peut être enlevée. Malheureusement, la majeure partie du matériel actuellement disponible ne peut pas soutenir cette option, et l'appui change avec CPU-type, logiciel d'exploitation, et version de logiciel d'exploitation aussi bien. En conséquence, vous ne pouvez pas compter sur cette protection étant présente dans le domaine, mais vous devez examiner avec lui avez permis de s'assurer que votre application est compatible avec une pile et un tas non-executable, en exploitant votre application sur le matériel qui soutient la protection de matériel, et le logiciel d'exploitation de cible réglé pour employer la protection. Par exemple, si vous visez Windows.xp, assurez-vous alors que vous exécutez tous vos essais sur un ordinateur de Windows.xp SP2 en utilisant un processeur d'AMD Athlon 64 FX. Sur Windows, cette technologie s'appelle la protection de Data Execution (département) ; on l'a par le passé connu en tant qu'aucun s'exécutent (NX). Le serveur 2003 SP1 de Windows soutient également ces possibilités. Les Pax pour Linux et OpenBSD soutiennent également la mémoire non-executable D'Autres Ressources
un article a soumis par Hendra Fang
|
|||
|