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 3Conférence 2: «Contrôle des attaques de pirates»
Partie 1 /
Partie 2 /
Partie 3Conférence 3: «Débordements de tampon: exploits et protection»
Partie 1 /
Partie 2 /
Partie 3Conférence 4: «Séparation des privilèges»
Partie 1 /
Partie 2 /
Partie 3Conférence 5: «D'où viennent les systèmes de sécurité?»
Partie 1 /
Partie 2Conférence 6: «Opportunités»
Partie 1 /
Partie 2 /
Partie 3Conférence 7: «Native Client Sandbox»
Partie 1 /
Partie 2 /
Partie 3Conférence 8: «Modèle de sécurité réseau»
Partie 1 /
Partie 2 /
Partie 3Conférence 9: «Sécurité des applications Web»,
partie 1 /
partie 2 /
partie 3Conférence 10: «Exécution symbolique»
Partie 1 /
Partie 2 /
Partie 3Conférence 11: «Ur / Web Programming Language»
Partie 1 /
Partie 2 /
Partie 3 Nikolai Zeldovich: commençons les gars! Nous allons donc parler aujourd'hui d'une approche complètement différente et fondamentale de la création d'applications Web sécurisées. Il s'agit d'un système appelé Ur / Web. Maintenant, notre invité Adam Chipala, qui est l'auteur de ce système, professeur au MIT, vous parlera du système qu'il a créé.
Adam Chipala: Je veux arriver à la démonstration dès que possible. Mais avant cela, je vais montrer quelques diapositives pour expliquer le contenu de ce système. Vous avez probablement déjà eu quelques idées à ce sujet dans les notes de cours d'aujourd'hui.
Alors, qu'est-ce que Ur / Web? Il est toujours utile de commencer par une explication de la signification du titre du sujet. Ur / Web est principalement un langage de programmation pour la création d'applications Web. C'est ce que le Web a en son nom. Il s'agit d'une sorte de système de pile à part entière qui fait tout ce dont vous avez besoin pour créer des applications Web. Ur signifie le nouveau langage de programmation universel utilisé pour implémenter ces fonctions Web.
Tout l'intérêt d'Ur / Web est qu'au lieu d'utiliser un langage de programmation généraliste, une bibliothèque et des cadres traditionnels pour créer des applications Web, tout cela est déjà intégré dans un langage de programmation Ur / Web personnalisé. Il s'agit d'un langage qui, lors de l'exécution, implique une compilation plutôt qu'une interprétation. Et le compilateur, dans un sens, comprend ce que doit faire une application Web. Il indiquera les erreurs que vous faites, contrairement au compilateur Java classique, qui ne comprend pas où vous avez des erreurs.
Il y a trois principes principaux que j'ai essayé d'utiliser lors du développement de ce langage: l'efficacité de la programmation, la sécurité et les performances, en particulier côté serveur, pour la mise à l'échelle. Dans ce contexte, le second est le plus pertinent.
Dans la plupart des cas, les utilisateurs de votre application ne remarqueront pas de petits problèmes de performances côté client, mais même un petit problème côté serveur peut vous faire acheter beaucoup plus de serveurs que nécessaire.

À l'heure actuelle, il existe déjà plusieurs utilisateurs d'Ur / Web, mais ils ne sont pas aussi nombreux que ceux qui utilisent d'autres langages de programmation. Mais au moins, c'est la seule application Web commerciale qui est un lecteur RSS et qui prend en charge des fonctionnalités exotiques telles que l'affichage de commentaires. Il existe également une URL inventée par un anglophone non natif qui regrette désormais un tel nom. Cela s'appelle le lecteur BazQux, une combinaison des compétences tactiques de la communauté des hackers. Cette application compte déjà plusieurs milliers d'utilisateurs payants. Et il semble que ce soit beaucoup plus agréable à gérer que ce qui est fait avec CSS. C'est la preuve que cela peut être fait en utilisant Ur / Web.
N'hésitez pas à m'interrompre à tout moment avec des questions, même si je n'ai probablement pas encore compris ce qui pourrait être à l'origine des questions. Ainsi, le principal succès des ventes Ur / Web est qu'elles ont un modèle de programmation de très haut niveau très différent de Django, que vous connaissez des conférences précédentes. Et il a une bonne histoire de sécurité.
Certaines fonctions que vous aimeriez avoir pour la sécurité sont déjà intégrées dans le système, vous n'avez donc pas à travailler dur pour assurer la sécurité de votre programme. Je vous en dirai plus à ce sujet dans un avenir proche.
De plus, ce langage offre des performances élevées côté serveur même par rapport aux outils de création d'applications Web les plus populaires, je pense que vous en avez déjà entendu parler. La mise en garde est que nous aurons probablement besoin d'apprendre plus d'idées à partir de langages de programmation fonctionnels tels que Haskell avant d'utiliser Ur / Web.
J'ai regardé les questions et réponses de cette leçon, et environ un cinquième des élèves se sont plaints des parties fonctionnelles de la programmation qui étaient difficiles à terminer. Je m'excuse, mais il y a tellement de bonnes idées dans le monde de la programmation fonctionnelle qu'il serait difficile de ne pas partir de ce moment, en y ajoutant progressivement des choses plus complexes. Mais je vais essayer de ne pas exiger une connaissance stricte du matériel dont je vais parler aujourd'hui.
Ainsi, ce modèle de programmation est vraiment étroitement lié au typage statique. Et ce n'est pas seulement du typage statique, comme dans le langage Java, qui a un système de type maladroit relativement inexpressif, mais du typage statique, similaire à celui utilisé dans Haskell ou Apache Camel. Cette saisie est une façon pour le compilateur de comprendre ce que vous faites et de détecter les erreurs dans son programme.

Il s'avère que la langue principale d'Ur sur laquelle Ur / Web est construit possède un système très expressif de typage statique. Une grande partie de ce que fait Ur / Web est en fait fournie par les bibliothèques sans prise en charge spéciale du compilateur. Par exemple, nous avons appris au compilateur comment vérifier le type de requêtes SQL sans créer de règles pour entrer SQL dans le compilateur. Ils peuvent être encodés sous forme de bibliothèques et utiliser un type de validation standard pour vous assurer que vos requêtes SQL suivent les règles SQL.
Le plus pertinent dans ce contexte est d'assurer un haut niveau de sécurité - la plupart des vulnérabilités de sécurité les plus courantes sont impossibles lors de la programmation sur Ur / Web. Vous pouvez toujours dire adieu aux attaques par injection de code malveillantes et aux attaques de script intersite. Vous pouvez autoriser des noms de drapeau effrayants à faire les choses les plus terribles qui peuvent être faites dans une application Web, même si vous causez vraiment une sorte de «magie noire» en utilisant les fonctions de l'interface de quelqu'un d'autre.
Il y a plusieurs autres propriétés spécifiques à la sécurité dont je parlerai plus tard. Les performances sont également très bonnes. Le compilateur est principalement optimisé pour la création de code source pour les domaines et beaucoup plus productif que le code manuscrit en C.
Par conséquent, il comprend ce que fait l'application Web et peut optimiser certaines choses qu'un compilateur de type général traditionnel n'attraperait pas. Par conséquent, le code source que ce compilateur exécute sur le serveur est en concurrence avec le code C. Si nous comparons les coûts garantissant les performances avec les coûts de main-d'œuvre de la programmation dans d'autres langages, nous constatons que Ur / Web simplifie considérablement la vie du programmeur.
La diapositive suivante présente une référence rapide pour les performances de cette infrastructure d'infrastructure Web tierce.
Il s'agit d'une capture d'écran des résultats du dernier test, dans lequel diverses tâches de programmation Web ont été effectuées par différents cadres.

Vous pouvez voir que Ur / Web a pris la 4e place sur 60 frameworks qui ont participé à des tests de performances. Après la capture d'écran, quelques améliorations supplémentaires ont été apportées au compilateur. Par conséquent, je m'attends à ce qu'au prochain tour, selon ses résultats, il avance légèrement. Fondamentalement, il s'agit d'un exemple simple d'utilisation de SQL pour générer des pages HTML. Vous recevez environ 100 000 demandes par seconde du serveur Ur / Web, ce qui est largement suffisant pour la plupart des applications. Il est important que cette diapositive indique que vous pouvez utiliser un modèle de haut niveau qui offre une plus grande sécurité en perdant légèrement les performances par rapport aux frameworks les plus courants.
Alors, permettez-moi de commencer par des images qui reflètent mon impression de ce que les programmeurs pensent aujourd'hui de l'écriture d'applications Web en utilisant les cadres les plus courants. Ensuite, je vais vous montrer un autre point de vue fourni par Ur / Web et selon lequel, beaucoup de choses qui peuvent mal se passer sans erreurs sur ce framework.
L'image principale est un serveur Web dont dépend tout le processus de votre application. Et il y a toute une flotte de navigateurs qui vont interagir avec ce serveur. Le serveur restera dans un certain état, ce qui assure l'interaction avec tous ces navigateurs.
L'image habituelle est que le navigateur commence à interagir avec le serveur Web en lui envoyant une requête HTTP, qui inclut les URL intégrées. Après cela, le serveur Web renvoie la page HTTP et HTML au navigateur. Cependant, il existe des URL intégrées qui peuvent être utilisées pour déterminer quelle demande le serveur Web doit faire à l'avenir.

Ce serveur Web peut également communiquer avec une base de données qui fournit un stockage persistant commun à tous les utilisateurs de l'application. Dans ce cas, un protocole SQL populaire est utilisé pour les conversations entre le réseau de serveurs et la base de données. C'est exactement ce dont je parlerai en discutant des possibilités d'Ur / Web.

Les applications Web modernes ne sont pas qu'une seule page instantanée. Chaque fois que quelque chose doit changer sur la page, vous faites une nouvelle demande au serveur, après quoi la page entière du module est remplacée. Il existe un style AJAX selon lequel le navigateur envoie parfois des requêtes HTTP supplémentaires au serveur Web pendant une vue de page et reçoit des réponses qui sont traitées par le programme utilisateur. Dans ce cas, des représentations de données telles que XML et JSON sont généralement utilisées, ainsi que d'autres formats simples pour l'échange de données entre le client et le serveur.

Ensuite, lorsque le navigateur renvoie cette réponse, il existe du code JavaScript qui implémente une logique arbitraire pour contrôler l'interface utilisateur, qui est montré à l'utilisateur.

Ce code JavaScript peut lire les réponses que le serveur donne à divers appels AJAX. Il peut ensuite modifier la page, qui s'affiche principalement en changeant la variable DOM globale définie pour la page. N'importe quelle partie du programme peut affecter arbitrairement cette variable globale, qui est une page. Souvent, des parties d'une page sont visualisées par un ID de chaîne annoté par les nœuds d'une arborescence décrivant un document.
Et enfin, une autre complication est que, parfois, nous voulons que le serveur Web communique avec le navigateur sans demande. Supposons qu'un nouveau message électronique s'affiche et que le serveur Web souhaite informer le navigateur de ce nouveau message.

Et il existe de nombreuses façons de le faire, par exemple, Comet - un modèle de fonctionnement d'application Web dans lequel une connexion HTTP constante permet au serveur Web d'envoyer des données au navigateur sans aucune demande supplémentaire du navigateur, ou le protocole duplex WebSockets, qui communique entre le navigateur et le serveur en temps réel. En principe, ce sont les mêmes choses, mais dans une direction conceptuellement différente.
Donc, je veux revenir à l'écran tous ces protocoles et langages, après avoir sélectionné certaines parties en jaune. Après avoir lu les notes de cours, quelqu'un a-t-il deviné ce qui est commun entre toutes ces parties mises en évidence en termes de sécurité?
Étudiant: ce sont toutes des lignes dans lesquelles vous pouvez placer n'importe quoi.
Professeur: correctement, dans l'approche généralement acceptée de la programmation d'applications Web, toutes ces choses sont des chaînes. Et le langage de programmation ne comprend pas comment vous les utilisez, il ne peut donc pas vous aider à éviter les erreurs. Ainsi, par exemple, en présentant ces choses comme des chaînes, vous obtenez des attaques par injection de code. Pour autant que je sache, les attaques par injection de code sont principalement le résultat de l'inclusion en tant que primitive dans votre langage de programmation ou votre framework d'une fonction qui lance des programmes sous forme de texte dans un langage plutôt expressif.
Ur / Web n'a pas d'interpréteur intégré pour exécuter des chaînes en tant que programmes. Et cela rend structurellement impossible la plupart des erreurs d'application Web les plus courantes. Ainsi, tous ces objets sélectionnés seront invisibles ou représentés par des types spéciaux, ce qui indique clairement le code avec lequel vous traitez. Cependant, vous ne disposez d'aucune conversion automatique en chaînes dans aucun de ces types spéciaux.
Maintenant, la diapositive montre un modèle alternatif qu'Ur / Web fournit et qui se compile en un modèle traditionnel. Cela fonctionne donc dans tous les navigateurs répandus. Mais le programmeur peut y penser à un niveau supérieur et éviter les erreurs potentielles qui étaient possibles dans l'image précédente.

Nous avons donc toujours un serveur Web qui répond aux demandes. Et nous avons toujours cette flotte de navigateurs qui essaient d'utiliser un serveur Web. Mais la première différence importante est que lorsqu'un navigateur souhaite commencer à utiliser une application Web, il n'envoie pas simplement une chaîne de requêtes HTTP avec une URL.
Il exécute la fonction de première classe sur le serveur sans impliquer le client. Et puis le serveur répond non seulement avec une chaîne de texte de protocole HTTP, mais avec une arborescence de documents strictement typée. Ainsi, au lieu d'une chaîne HTML, nous avons un arbre, dans un langage de programmation, un objet de première classe. Et le programme manipule cet arbre particulier, pas la chaîne.
Chacune de ces arborescences contient des liens, qui en eux-mêmes ne sont que des notes de bas de page pour d'autres fonctions qui peuvent être appelées sur le serveur. Lorsque l'utilisateur clique sur ces liens, le navigateur sélectionne la fonction et l'appelle conceptuellement sur le serveur, comme la fonction d'origine que nous avons appelée pour arriver à ce point.
Nous avons également une interface de base de données accessible par un serveur Web envoyant des requêtes à la base de données. Dans le modèle Ur / Web, il ne s'agit pas uniquement de texte, mais d'arbres de syntaxe SQL fortement typés. Et puis la base de données répondra non pas avec du texte, mais avec une liste d'enregistrements de valeurs propres dans le langage de programmation Ur avec lequel nous travaillons.

Par conséquent, nous n'avons pas à nous soucier de la conversion incorrecte de chaînes en représentations «natives» ou de la conversion de représentations «natives» en tout autre format que la base de données peut traditionnellement nous fournir.
Il s'agit d'un élément clé dans la façon dont la sémantique Ur / Web permet aux programmeurs de travailler plus facilement avec un grand nombre de scripts qui peuvent réellement se produire pendant que l'application est en cours d'exécution.
Il existe une idée de transaction standard dans le monde des bases de données relationnelles, où vous pouvez effectuer une série d'opérations sans les interrompre avec d'autres threads parallèles. Et Ur / Web adapte ce modèle et l'intègre dans la sémantique du langage. Par conséquent, lorsqu'une fonction est exécutée sur le serveur pour le compte du client, tous ses accès à la base de données se produisent sous la forme d'un bloc atomique sans aucune interruption causée par toutes les autres requêtes simultanées adressées au même serveur. Vous ne pouvez pas éviter ce comportement, même si vous le souhaitez, car ces transactions sont intégrées dans le langage de programmation.
Et ils facilitent vraiment l'exécution de requêtes simultanées et aident potentiellement à éviter les problèmes de sécurité qui surviennent en cas d'alternance de certaines combinaisons de requêtes.
Je veux obtenir une réponse à l'une des questions présentées dans le résumé de cette conférence et qui m'ont intrigué. Ainsi, Ur / Web détecte quand une transaction échoue en raison d'un problème d'exécution parallèle tel qu'une impasse et redémarre automatiquement la transaction. Quelqu'un, répondant à des questions, a écrit que cela peut faciliter le lancement d'attaques de sécurité, qui dépendent d'un échec de transaction en raison de problèmes de concurrence. Je voulais juste demander à la classe, quelqu'un peut-il donner un exemple d'une telle attaque, comme vous l'imaginez? Si vous avez un système qui redémarre automatiquement les transactions dans des blocages, comment cela peut-il causer des problèmes de sécurité? Je n'ai pas de réponse à cette question, c'est pourquoi je pose la question. Cette question peut avoir une réponse si peu évidente qu'elle mérite clairement d'être discutée.
Étudiant: cela peut peut-être provoquer une sorte de défaillance du service DoS? S'il va redémarrer la transaction que vous envoyez et que vous savez qu'elle ne réussira pas, vous pouvez simplement continuer à redémarrer ce processus et réessayer ...
Professeur: ok, continuez ...
Étudiant: si vous forcez le système à faire ce que vous savez, il ne réussira jamais, vous pouvez réessayer encore et encore, et finalement, faire échouer le service.
Professeur: c'est vrai, mais pour ce faire, vous avez besoin d'au moins deux threads travaillant en même temps. Bien que cela puisse potentiellement fonctionner, vous pourrez peut-être lancer une attaque par déni de service. Dans ce cas, vous pouvez tirer parti du fait que les gestionnaires de requêtes sont redémarrés encore et encore et provoquent délibérément un conflit, et l'utiliser comme un moyen d'augmenter la puissance des attaques DoS en plus de ce que vous pouvez obtenir à l'aide d'un modèle d'attaque traditionnel de ce type. Eh bien, je peux le croire.
Étudiant: est-ce le seul moyen de provoquer un échec de transaction?
Professeur: oui, c'est le seul moyen de provoquer un crash et un redémarrage automatique.
Étudiant: il y a peut
- être un tiers qui échouerait sous condition. Ensuite, vous pouvez l'utiliser pour surveiller le comportement des autres utilisateurs.
Professeur: Vous aurez également besoin d'un moyen de constater que quelqu'un a échoué, mais vous ne pourrez le faire qu'après un certain temps. Cependant, cela peut également être un problème. , , , . , . , , , . .
: , , , . , ?
: , , , .
: , , , ? , .
: , , . , .
: , , , , , ?
: , , , , , ? , – , . . , , .
: , , ?
: , , . , , , . , – .
, -. AJAX, .

, . , . , - .

, . , .
, Ur/Web , . — , . , , . — , , .
— , , , . , , , .
. Ur/Web- Ur/Web-. JavaScript, . , . .
, , . , . , , , . , , , .

. , , , , , . . , , JavaScript.
JavaScript , , , JavaScript .
, , Ur/Web- — . , , , . JSON. .

, , . , . . - .
, , , , . : «, », . «» .

, . , ?
: , ?
: RPC , . , .
— , . , , .
: ?
: HTTP-. , - , , , HTTP .
, , . . , Ur/Web. , .

, . , , URL- URL-. . , URL.
URL . - , URL. , HTML . HTML. , XML-, , .
- , . HTML- , .

, , . , , UTF-8. , .
, UTF-8, . - , Tangled Web ( ), Ur/Web, , .
Soit dit en passant, à tout moment pendant cette démonstration, veuillez suggérer des expériences qui vous viennent à l'esprit afin que nous puissions essayer sur mon système le type d'erreurs qu'il peut détecter.Je pense que c'est la façon la plus productive de démontrer les capacités d'Ur / Web.27:45 minCours MIT "Sécurité des systèmes informatiques". Conférence 11: Langage de programmation Ur / Web, partie 2La 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?