Cours MIT "Sécurité des systÚmes informatiques". Conférence 9: «Sécurité des applications Web», partie 2

Institut de technologie du Massachusetts. Cours magistral # 6.858. "Sécurité des systÚmes informatiques." Nikolai Zeldovich, James Mickens. 2014 année


Computer Systems Security est un cours sur le dĂ©veloppement et la mise en Ɠuvre de systĂšmes informatiques sĂ©curisĂ©s. Les confĂ©rences couvrent les modĂšles de menace, les attaques qui compromettent la sĂ©curitĂ© et les techniques de sĂ©curitĂ© basĂ©es sur des travaux scientifiques rĂ©cents. Les sujets incluent la sĂ©curitĂ© du systĂšme d'exploitation (OS), les fonctionnalitĂ©s, la gestion du flux d'informations, la sĂ©curitĂ© des langues, les protocoles rĂ©seau, la sĂ©curitĂ© matĂ©rielle et la sĂ©curitĂ© des applications Web.

Cours 1: «Introduction: modÚles de menace» Partie 1 / Partie 2 / Partie 3
Conférence 2: «ContrÎle des attaques de pirates» Partie 1 / Partie 2 / Partie 3
Conférence 3: «Débordements de tampon: exploits et protection» Partie 1 / Partie 2 / Partie 3
Conférence 4: «Séparation des privilÚges» Partie 1 / Partie 2 / Partie 3
ConfĂ©rence 5: «D'oĂč viennent les systĂšmes de sĂ©curitĂ©?» Partie 1 / Partie 2
Conférence 6: «Opportunités» Partie 1 / Partie 2 / Partie 3
Conférence 7: «Native Client Sandbox» Partie 1 / Partie 2 / Partie 3
Conférence 8: «ModÚle de sécurité réseau» Partie 1 / Partie 2 / Partie 3
Conférence 9: «Sécurité des applications Web», partie 1 / partie 2 / partie 3

Par exemple, Django prendra ces crochets angulaires, les traduira au format HTML et refera le reste des caractÚres. Autrement dit, si la valeur de nom personnalisé contient des crochets, des guillemets doubles, etc., tous ces caractÚres seront exclus. Cela fera que le contenu ne sera pas interprété comme du code HTML du cÎté du navigateur client.



Alors maintenant, nous savons que ce n'est pas une défense trÚs fiable contre certaines attaques de script intersite. La raison, comme nous l'avons montré dans l'exemple, est que ces grammaires pour HTML, CSS et JavaScript sont si complexes qu'elles peuvent trÚs facilement confondre l'analyseur du navigateur.

Par exemple, nous avons une chose trÚs courante faite dans le cadre de Django. Donc, vous avez une fonction div, et nous voulons lui attribuer une classe dynamique. Nous donnons à la classe la valeur de var, et ainsi de suite. L'idée est que lorsque Django traite cela, il doit comprendre quel est le style actuel et le coller ici.

Dans ce cas, un attaquant peut crĂ©er une chaĂźne dĂ©finissant cette classe, par exemple, Ă©crit «classe 1». Tout va bien jusqu'Ă  ce point, car cela semble ĂȘtre une expression CSS valide.

Mais l'attaquant place ici l'opérateur onclick, qui est égal au code JavaScript qui effectue l'appel systÚme.



Comme c'est faux, le navigateur devrait s'arrĂȘter ici. Mais le problĂšme est que si vous avez dĂ©jĂ  vu le code HTML d'une vraie page Web, tout est cassĂ© et confus, mĂȘme pour des sites lĂ©gitimes et "conviviaux". Donc, si le navigateur s'arrĂȘte avant chaque expression HTML erronĂ©e, pas un seul site que vous aimez ne fonctionnera tout simplement jamais. Si jamais vous voulez ĂȘtre déçu du monde et que je ne vous ai pas suffisamment aidĂ©, ouvrez simplement la console JavaScript dans votre navigateur lorsque vous consultez le site pour voir combien d'erreurs cela vous donnera.

Vous pouvez, par exemple, aller sur CNN et voir simplement combien d'erreurs vous obtenez. Oui, essentiellement CNN fonctionne, mais de maniĂšre trĂšs inĂ©gale. Par exemple, pour ouvrir Acrobat Reader, vous devez constamment lever des exceptions de pointeur nul, et en mĂȘme temps, vous vous sentirez un peu trompĂ© par la vie. Mais sur Internet, nous avons appris Ă  l'accepter sans trop d'indignation.
Par consĂ©quent, comme les navigateurs devraient ĂȘtre trĂšs tolĂ©rants Ă  de telles choses, ils essaieront de transformer le code malveillant en quelque chose qui leur semble raisonnable. Et c'est la vulnĂ©rabilitĂ© de sĂ©curitĂ©.

Voilà comment fonctionne la désinfection du contenu, et c'est toujours mieux que rien. Elle peut attraper beaucoup de choses nuisibles, mais ne peut pas se défendre de tout.

Il y a encore une chose Ă  laquelle penser: l'utilisation d'un langage de balisage moins expressif. Voyons ce que cela signifie.

Public: que dois-je faire si le nettoyage de contenu ne fonctionne pas?

Professeur: oui, c'est possible, par exemple, dans ce cas Django ne sera pas en mesure de dĂ©terminer statiquement que c'est mauvais. Par exemple, dans ce cas particulier. Mais dans le cas oĂč j'insĂšre une balise d'image malveillante ...

Public: dans ce cas particulier, je m'attendrais Ă  ce que l'affectation de classe soit entre guillemets et dans ce cas ne devrait avoir aucun effet ...

Professeur: eh bien, vous voyez, il y a de petites astuces. En supposant que la grammaire du HTML et du CSS soit soigneusement définie, vous pouvez imaginer un monde dans lequel des analyseurs idéaux pourraient en quelque sorte attraper ces problÚmes ou les transformer en quelque chose de normal. Mais en fait, la grammaire HTML et la grammaire CSS souffrent d'inexactitudes. De plus, les navigateurs n'implémentent pas de spécifications. Par conséquent, si vous utilisez une grammaire moins expressive, il nous sera beaucoup plus facile de désinfecter le contenu.

Ici, le terme Markdown est utilisé - «balisage facile à lire» au lieu du terme Markup - balisage ordinaire. L'idée principale de Markdown est qu'il est conçu comme un langage qui, par exemple, permet aux utilisateurs de publier des commentaires, mais ne contient pas la possibilité d'utiliser une balise vide, la prise en charge des applets, etc. Par conséquent, dans Markdown, il est en fait beaucoup plus facile d'identifier de maniÚre unique la grammaire, puis de l'appliquer.



La désinfection est beaucoup plus facile dans un langage simple qu'en HTML, CSS et JavaScript. Et d'une certaine maniÚre, c'est comme la différence entre la compréhension du code C et du code Python. Il y a vraiment une grande différence dans la compréhension d'un langage plus expressif. Par conséquent, en limitant l'expressivité, vous améliorez souvent la sécurité.

Pour se protéger contre les attaques de scripts intersites, CSP, Content Security Policy, est également utilisé. L'idée du CSP est qu'il permet au serveur web ...
Public: Je suis simplement curieux de découvrir ce langage Markdown. Tous les navigateurs sont-ils capables d'effectuer une analyse linguistique?

Professeur: non, non, non. Vous pouvez simplement convertir divers types de langues en HTML, mais les navigateurs ne les comprennent pas dans leur forme d'origine. En d'autres termes, vous avez un systĂšme de commentaires et il utilise Markdown. Autrement dit, les commentaires, avant d'ĂȘtre affichĂ©s sur la page, vont au compilateur Markdown, qui les traduit au format HTML.

Public: alors pourquoi ne pas toujours utiliser Markdown?

Professeur: Markdown vous permet d'utiliser du HTML intégré, et pour autant que je sache, il existe un moyen de le désactiver dans le compilateur. Mais je peux me tromper à ce sujet. Le fait est qu'il n'est pas toujours possible d'utiliser un langage limité et que tout le monde ne veut pas le faire.

Continuons donc la discussion sur la façon d'augmenter la sĂ©curitĂ© Ă  l'aide de la politique de sĂ©curitĂ© du contenu. Cette politique permet au serveur d'indiquer au navigateur Web quels types de contenu peuvent ĂȘtre chargĂ©s sur la page qu'il renvoie, ainsi que la provenance de ce contenu.

Par exemple, dans la rĂ©ponse HTTP, le serveur peut utiliser quelque chose comme ceci: il inclut l'en-tĂȘte Content - Security - Policy, la source par dĂ©faut est self et il recevra les donnĂ©es de * .mydomain.com.



Avec l'opĂ©rateur lui-mĂȘme, le serveur indique que le contenu de ce site ne doit provenir que du domaine d'une page particuliĂšre ou de tout sous-domaine de mydomain.com. Cela signifie que si nous avions une liaison automatique avec foo.com, le serveur renverrait cette page au navigateur.

Supposons qu'une attaque de script intersite essaie de crĂ©er un lien vers bar.com. Dans ce cas, le navigateur verra que bar.com n'est pas auto et n'est pas un domaine de mydomain.com, et n'ignorera pas cette demande plus loin. Il s'agit d'un mĂ©canisme assez puissant oĂč vous pouvez spĂ©cifier des contrĂŽles plus dĂ©taillĂ©s. Vous dĂ©finissez des paramĂštres indiquant que vos images doivent provenir de telle ou telle source, des scripts de telle ou telle et ainsi de suite. C'est en fait pratique.

De plus, cette stratĂ©gie empĂȘche en fait le JavaScript intĂ©grĂ©, vous ne pouvez donc pas ouvrir la balise, Ă©crire une sorte de script et fermer la balise, car tout ce qui peut aller dans le navigateur ne doit provenir que d'une source conditionnelle. CSP empĂȘche les choses dangereuses comme l'utilisation de l'argument de la fonction eval (), qui permet Ă  une page Web d'exĂ©cuter du code JavaScript gĂ©nĂ©rĂ© dynamiquement. Donc, si l'en-tĂȘte CSP est dĂ©fini, le navigateur n'exĂ©cutera pas eval ().

Public: Est-ce que tout CSP protĂšge contre?

Professeur: non. Il y a toute une liste de ressources qu'il protĂšge rĂ©ellement, et vous pouvez configurer la protection contre de nombreuses choses indĂ©sirables, par exemple, spĂ©cifier oĂč il est autorisĂ© Ă  accepter les CSS sortants et un tas d'autres choses.

Public: Mais outre eval (), il y a d'autres choses qui menacent la sécurité?

Professeur: oui, ils existent. Par conséquent, la question se pose toujours de l'exhaustivité de la protection. Ainsi, par exemple, non seulement eval peut générer dynamiquement du code JavaScript. Il y a aussi un constructeur de fonctions, il y a certaines façons d'appeler un timeout donné, vous allez sur la ligne et vous pouvez analyser le code de cette façon. CSP peut désactiver tous ces vecteurs d'attaque dangereux. Mais ce n'est pas une panacée pour l'isolement complet des exploits malveillants.

Public: Est-il vrai que le CSP peut ĂȘtre configurĂ© pour empĂȘcher tous les scripts internes d'ĂȘtre vĂ©rifiĂ©s sur la page?

Professeur: oui, cela aide Ă  empĂȘcher l'exĂ©cution de code gĂ©nĂ©rĂ© dynamiquement, tandis que le code intĂ©grĂ© doit ĂȘtre ignorĂ©. Le navigateur doit toujours obtenir le code de l'attribut source. En fait, je ne sais pas si tous les navigateurs le font. L'expĂ©rience personnelle montre que les navigateurs prĂ©sentent des comportements diffĂ©rents.

En général, la sécurité Internet s'apparente aux sciences naturelles, donc les gens avancent simplement des théories sur le fonctionnement des navigateurs. Et puis vous voyez comment cela se produit réellement. Et la vraie image peut décevoir, car on nous apprend qu'il existe des algorithmes, des preuves, etc. Mais ces navigateurs se comportent si mal que les résultats de leur travail sont imprévisibles.

Les développeurs de navigateurs essaient d'avoir une longueur d'avance sur les attaquants, et plus loin dans la leçon, vous en verrez des exemples. En fait, CSP est une chose assez cool.

Une autre chose utile est que le serveur peut dĂ©finir un en-tĂȘte HTTP appelĂ© X-Content-Type-Options, dont la valeur est nosniff.



Cet en-tĂȘte empĂȘche MIME de supprimer la rĂ©ponse du type de contenu publiĂ©, car l'en-tĂȘte indique au navigateur de ne pas remplacer le type de contenu de la rĂ©ponse. Avec l'option nosniff, si le serveur dit que le contenu est text / html, le navigateur l'affichera comme text / html.
Autrement dit, cet en-tĂȘte empĂȘche le navigateur de «renifler» la rĂ©ponse du type de contenu dĂ©clarĂ© afin que la situation ne se produise pas lorsque le navigateur dit: «oui, j'ai reniflĂ© le dĂ©calage entre l'extension de fichier et le contenu rĂ©el, donc je vais transformer ce contenu en un autre comprĂ©hensible moi une chose. " Il s'avĂšre que vous avez soudainement donnĂ© aux barbares les clĂ©s du royaume.

Par consĂ©quent, en dĂ©finissant cet en-tĂȘte, vous dites au navigateur de ne rien faire de tel. Cela peut considĂ©rablement attĂ©nuer les effets de certains types d'attaques. Voici un bref aperçu de certaines vulnĂ©rabilitĂ©s pour les attaques de script intersite.

Voyons maintenant un autre vecteur d'attaque populaire - SQL. Vous avez probablement entendu parler d'attaques appelĂ©es «injection SQL» ou attaque par injection SQL. L'essence de ces attaques consiste Ă  utiliser la base de donnĂ©es du site Web. Pour crĂ©er dynamiquement la page affichĂ©e Ă  l'utilisateur, des requĂȘtes de base de donnĂ©es sont Ă©mises qui sont Ă©mises vers ce serveur interne. Imaginez que vous ayez une demande pour sĂ©lectionner toutes les valeurs d'une table spĂ©cifique, oĂč le champ ID utilisateur est Ă©gal Ă  ce qui est dĂ©terminĂ© sur Internet Ă  partir d'une source potentiellement non fiable.



Nous savons tous comment cette histoire se terminera - elle se terminera trĂšs mal, il n'y aura pas de survivants. Parce que ce qui vient d'une source non vĂ©rifiĂ©e peut causer beaucoup de problĂšmes. Vous pouvez Ă©galement donner Ă  la chaĂźne d'ID utilisateur la valeur suivante: id utilisateur = «0; SUPPRIMER LE TABLEAU “.

Alors que va-t-il se passer ici? Fondamentalement, la base de données du serveur dira: "OK, je mettrai l'ID utilisateur à zéro, puis j'exécuterai la commande" supprimer la table "". Et c'est tout, vous avez terminé!

Ils disent qu'il y a quelques années, une certaine image virale est apparue. Certaines personnes en Allemagne ont installé des plaques d'immatriculation sur les voitures, sur lesquelles 0 était inscrit; SUPPRIMER LE TABLEAU. L'idée était que les caméras routiÚres utilisent l'OCR pour reconnaßtre votre numéro, puis le mettent dans la base de données. En général, les gens de Volkswagen ont décidé d'exploiter cette vulnérabilité en plaçant du code malveillant sur leurs numéros.

Je ne sais pas si cela a fonctionnĂ© parce que ça a l'air drĂŽle. Mais je voudrais croire que c'est vrai. Je rĂ©pĂšte donc encore une fois - l'idĂ©e de la dĂ©sinfection est d'empĂȘcher l'exĂ©cution de contenu provenant de sources non fiables sur votre site.



Par conséquent, faites attention au fait qu'il peut y avoir des choses simples qui ne fonctionnent pas comme elles le devraient. Donc, vous pourriez penser: «eh bien, pourquoi ne puis-je pas simplement mettre une autre citation au début de la ligne et une autre à la fin pour exclure l'exécution de code malveillant de l'attaquant entre des guillemets triples»?

id utilisateur = '"+ id utilisateur +'"

Mais cela ne fonctionnera pas, car un attaquant peut toujours simplement mettre des guillemets à l'intérieur de la chaßne d'attaque. Donc, dans la plupart des cas, un tel "demi-piratage" ne vous apportera pas autant de sécurité que vous attendez.

La solution ici est que vous devez chiffrer soigneusement vos données. Et encore une fois, je répÚte que lorsque vous recevez des informations d'une source non fiable, ne les insérez pas dans le systÚme sous la forme dans laquelle elles se trouvent. Assurez-vous qu'il ne peut pas sauter du bac à sable si vous le placez pour effectuer un exploit malveillant.

Par exemple, vous souhaitez insĂ©rer une fonction d'Ă©chappement pour empĂȘcher l'utilisation de l'opĂ©rateur virgule brut. Pour ce faire, de nombreux frameworks Web, tels que Django, ont des bibliothĂšques intĂ©grĂ©es qui vous permettent d'Ă©viter les requĂȘtes SQL pour empĂȘcher de telles choses de se produire. Ces frameworks encouragent les dĂ©veloppeurs Ă  ne jamais interagir directement avec la base de donnĂ©es. Par exemple, Django lui-mĂȘme fournit une interface de haut niveau qui vous dĂ©sinfecte.

Mais les gens se soucient toujours des performances, et parfois les gens pensent que ces cadres Web sont trop lents. Ainsi, comme vous le verrez bientĂŽt, les gens feront toujours des requĂȘtes SQL brutes, ce qui peut entraĂźner des problĂšmes.

Des problĂšmes peuvent survenir si le serveur Web accepte des noms de chemin provenant d'images non fiables. Imaginez que quelque part sur votre serveur, vous faites quelque chose de similaire: ouvrez avec «www / images /» + nom de fichier, oĂč le nom de fichier est reprĂ©sentĂ© par quelque chose comme ... / ... / ... / ... / etc / mot de passe.



Autrement dit, vous donnez la commande pour ouvrir l'image Ă  cette adresse Ă  partir d'un fichier utilisateur non fiable, ce qui peut en rĂ©alitĂ© vous nuire gravement. Ainsi, si vous souhaitez utiliser un serveur Web ou un framework Web, vous devriez pouvoir dĂ©tecter ces caractĂšres dangereux et les Ă©viter afin d'empĂȘcher l'exĂ©cution de ces commandes non gĂ©rĂ©es.

Prenons une pause pour discuter de la désinfection du contenu et parlons un peu des cookies. Les cookies sont un moyen trÚs populaire de gérer les sessions afin de lier un utilisateur à un certain ensemble de ressources qui existent cÎté serveur. De nombreux frameworks comme Django ou Zoobar, que vous rencontrerez plus tard, mettent en fait un identifiant de session aléatoire dans les cookies. L'idée est que cet identifiant de session est un index dans une sorte de table cÎté serveur:

table [ID session] = informations utilisateur.

Autrement dit, l'identifiant de session est Ă©gal Ă  certaines informations utilisateur. En consĂ©quence, cet ID de session et les cookies sont des Ă©lĂ©ments trĂšs sensibles dans leur extension. De nombreuses attaques incluent le vol de cookies afin d'obtenir cet identifiant de session. Comme nous en avons discutĂ© dans notre derniĂšre confĂ©rence, la mĂȘme politique de la mĂȘme source d'origine peut vous aider, dans une certaine mesure, contre certaines de ces attaques de vol de cookies. Parce qu'il existe des rĂšgles basĂ©es sur la mĂȘme politique d'origine qui empĂȘchent la modification arbitraire des cookies.

La subtilitĂ© est que vous ne devez pas partager un domaine ou un sous-domaine avec quelqu'un en qui vous n'avez pas confiance. Parce que, comme nous l'avons dit dans la derniĂšre confĂ©rence, il existe des rĂšgles qui permettent Ă  deux domaines ou sous-domaines de mĂȘme origine d'accĂ©der aux cookies l'un de l'autre. Et par consĂ©quent, si vous faites confiance Ă  un domaine auquel vous ne devriez pas faire confiance, il peut ĂȘtre en mesure de dĂ©finir directement l'identifiant de session dans ces cookies, auxquels vous avez tous deux accĂšs. Cela permettra Ă  l'attaquant de forcer l'utilisateur Ă  utiliser l'identifiant de session de son choix.



Supposons qu'un attaquant définisse un cookie utilisateur Gmail. Un utilisateur se connecte à Gmail et tape quelques lettres. Un attaquant peut alors utiliser ce cookie, notamment utiliser cet identifiant de session, télécharger Gmail, puis accéder à Gmail comme s'il était un utilisateur victime. Ainsi, il existe de nombreuses subtilités que vous pouvez faire avec ces cookies pour gérer vos sessions. Nous en discuterons aujourd'hui et dans des conférences ultérieures.

Peut-ĂȘtre pensez-vous que vous pouvez simplement vous dĂ©barrasser des cookies? AprĂšs tout, ils apportent plus de problĂšmes que d'avantages. Pourquoi ne peuvent-ils pas ĂȘtre abandonnĂ©s?

stateless cookie, « », - , , , .

, , , . , . , , . , , , , .

— MA — Message Authentication Codes, . , . HCK - m. , , K. , , . , , .



, . , stateless cookie, Amazon, , x3. - Amazon, AWS, . – K, – AWS, .



, AWS HTTP, .

, , , :

GET /photos/ cat; .jpg HTTP/1.1, - AWS:

HOST: — - — - — , , :

DATE: Mon, June 4, , , . , ID , , , .



? , 3- .

, String To Sign :

— HTTP, GET;
— MDS;
— , html jpg;
— ;
— , , .



, , HCK MAC. , . , . , . ?

, , , - . Amazon , stateless cookie, MD5 .

, , , cookie, . – , , .

, . , , “HCK, m”.



Dans le monde ordinaire, les cookies seraient utilisés à la place de l'autorisation ici. Mais maintenant, nous nous débarrassons d'eux et insérons ce message en texte clair GET / photos / cat dans la demande; .jpg HTTP / 1.1 et chiffrement, qui permet au serveur de savoir de qui vient cette chose. De cette façon, le serveur sait qui est l'utilisateur car il est intégré à la demande. Ce n'est pas un secret, non? Mais cela permet au serveur de dire: "Oui, je sais quelle clé secrÚte cet utilisateur aurait dû utiliser pour créer cette demande, s'il s'agit d'un véritable utilisateur."

56:15

Cours MIT "Sécurité des systÚmes informatiques". Conférence 9: Sécurité des applications Web, partie 3


La version complĂšte du cours est disponible ici .

Merci de rester avec nous. Aimez-vous nos articles? Vous voulez voir des matĂ©riaux plus intĂ©ressants? Soutenez-nous en passant une commande ou en le recommandant Ă  vos amis, une rĂ©duction de 30% pour les utilisateurs Habr sur un analogue unique de serveurs d'entrĂ©e de gamme que nous avons inventĂ©s pour vous: Toute la vĂ©ritĂ© sur VPS (KVM) E5-2650 v4 (6 cƓurs) 10 Go DDR4 240 Go SSD 1 Gbps Ă  partir de 20 $ ou comment diviser le serveur? (les options sont disponibles avec RAID1 et RAID10, jusqu'Ă  24 cƓurs et jusqu'Ă  40 Go de DDR4).

VPS (KVM) E5-2650 v4 (6 cƓurs) 10 Go DDR4 240 Go SSD 1 Gbit / s jusqu'en dĂ©cembre gratuitement en payant pour une pĂ©riode de six mois, vous pouvez commander ici .

Dell R730xd 2 fois moins cher? Nous avons seulement 2 x Intel Dodeca-Core Xeon E5-2650v4 128 Go DDR4 6x480 Go SSD 1 Gbps 100 TV Ă  partir de 249 $ aux Pays-Bas et aux États-Unis! Pour en savoir plus sur la crĂ©ation d'un bĂątiment d'infrastructure. classe utilisant des serveurs Dell R730xd E5-2650 v4 coĂ»tant 9 000 euros pour un sou?

Source: https://habr.com/ru/post/fr424295/


All Articles