Question:
Enseigner à un être cher les pratiques de codage sécurisé
schroeder
2012-12-12 22:00:57 UTC
view on stackexchange narkive permalink

C'est peut-être beaucoup trop restreint, mais c'est un problème unique pour les professionnels ITSec. Un être cher commence à peine une nouvelle carrière en programmation et j'ai la joie de la regarder apprendre les concepts de programmation les plus élémentaires à partir de zéro. Elle est au sommet de sa classe dans chacun de ses cours collégiaux, produisant un travail de grande qualité, et elle a tellement attiré l'attention qu'elle obtient déjà un travail à contrat.

En tant que professionnels ITSec, nous parlons d'insuffler au cycle de développement des pratiques de codage et une conception sécurisées, mais comment cela s'applique-t-il à un tout nouvel apprenant? Un nouveau programmeur est au début de son propre «cycle de développement à vie». À quel moment est-il approprié, d'un point de vue pédagogique, de passer de l'état d'esprit «faire fonctionner» à «il doit absolument être sécurisé»? À quel moment un élève devrait-il «échouer» un devoir en raison d'un problème de sécurité?

Elle comprend parfaitement la nécessité de produire du code sécurisé et le souhaite, mais aucun de ses cours n'a présenté l'idée et continue de venir à moi pour la révision et l'analyse du code. Quand faut-il changer pour la forcer à reconcevoir tous les devoirs de classe pour utiliser une conception sécurisée?

Je ne veux pas interrompre une carrière prometteuse en introduisant des exigences frustrantes, mais je veux aussi donnez à cette nouvelle carrière le meilleur départ possible. De plus, y a-t-il des ressources pour m'aider à lui apprendre les bases du codage sécurisé du point de vue d'un programmeur débutant? Je trouve que je l'invente au fur et à mesure ...

Je salue vos conseils.

  • À quel point est-il approprié, d'un point de vue pédagogique, de passer de l'état d'esprit «faire fonctionner» à «il doit absolument être sécurisé»?
  • À quel moment un élève devrait-il «échouer» un devoir en raison d'un problème de sécurité?
  • Quand le changement doit-il être fait pour l'obliger à reconcevoir tous les devoirs de classe à utiliser conception sécurisée?
  • Existe-t-il des ressources pour m'aider à lui apprendre les bases du codage sécurisé du point de vue d'un programmeur débutant?

En remarque: j'ai remarqué qu'en élevant la barre mon examen du code de ses devoirs de classe, juste en termes de sécurité de base «valider et désinfecter», elle a fini par produire du code de très haute qualité en général. À partir de cet exemple, je pense que je peux voir la valeur de commencer sa formation de cette façon, car cela force une compréhension encore plus profonde du flux de données et de la logique de programmation.

Le titre de votre question rend le contexte vraiment étrange. Vous dites qu'elle est un être cher, mais le contenu ressemble à vous son professeur. Je veux dire, tout ce qui fait flotter ton bateau, mais ... O_o
Elle est bien-aimée et je suis une éducatrice, mais pas la sienne ni une instructrice en programmation :) Il est difficile de jamais enlever le chapeau de l'éducatrice, et elle continue de venir me voir pour un travail `` parascolaire '' :)
Puisque «il doit absolument être sécurisé» est difficilement (sûrement) réalisable dans la pratique, je me demande que ce soit approprié sur le plan pédagogique. Il serait préférable à mon humble avis de pointer vers les littératures sur les risques sur Internet.
Souligner simplement que les défauts sont là est la chose la plus importante que vous puissiez faire à mon avis (c'est-à-dire inculquer la pensée critique et le faire tôt). Vous n'avez pas besoin de lui dire les détails ou même de lui demander de les trouver, mais faites-lui savoir que quelque part dans ce code ... ces vilains exploits n'attendent qu'à être trouvés
quelle est la différence entre l'enseignement de la programmation à un «être cher» et à «n'importe qui»
@Midhat Vous avez beaucoup plus d'influence sur un être cher dans vos interactions que sur une personne aléatoire.
Six réponses:
user10211
2012-12-12 22:41:02 UTC
view on stackexchange narkive permalink

Je dirais qu'une excellente façon d'apprendre est pour elle de casser les applications qu'elle a déjà écrites.

En supposant qu'elle est en train d'écrire des applications Web, dirigez-la vers le haut de l'OWASP 10. Faites-lui voir si elle peut trouver l'une de ces failles dans son propre code. Il n'y a pas de meilleur moyen d'apprendre les concepts de sécurité que de le voir se produire sur votre propre code.

Une fois qu'une faille a été trouvée, demandez-lui de réécrire l'application pour corriger la faille. Cela lui permettra d'apprécier l'effet de choses comme l'assainissement et la validation des entrées des utilisateurs et des requêtes paramétrées.

Procédez par étapes. Je ne me lancerais pas directement dans la conception d'une nouvelle application avec la sécurité à l'esprit avant de vraiment comprendre quel type de code entraîne des failles de sécurité.

D'accord. Briser les devoirs de mes camarades de classe et faire de même avec les miens dans mon cours de programmation au lycée n'était pas seulement amusant; mais a fait plus pour montrer l'importance de la désinfection des entrées que toute instruction formelle que j'ai eue par la suite.
Ouaip! Je ne savais rien de la sécurité dans une application web jusqu'à ce qu'un attaquant me vienne beaucoup. Injections SQL, exécution de code à distance, traversée du système de fichiers ... toutes ces failles de sécurité se trouvaient dans ma petite application Web. Garçon, étais-je naïf à l'époque à propos des clients qui envoyaient toujours les données attendues ...
Everett
2012-12-12 23:59:59 UTC
view on stackexchange narkive permalink

Je vais prendre la position qui peut me faire flambé ...

Le problème que je vois, c'est que la programmation sécurisée est enseignée comme un add-on. Les meilleures pratiques doivent être enseignées dès le début (y compris la sécurité). Le mensonge qu'on apprend, c'est que la pratique fait préfet. La vérité est que la pratique rend permanente. Donc, si vous le faites mal, vous devez désapprendre ce que vous avez appris. C'est une approche bassackwards.

Je dirais que les pratiques de codage sécurisé devraient être enseignées dès le premier jour. Il n'y a aucune raison d'apprendre à le faire, puis à le faire en toute sécurité. C'est une perte de temps et d'argent ...

Mes 2 bits, 1 et zéro de plus à dire ...

Mais alors, vous devrez inclure tous les aspects des meilleures pratiques dès le premier jour, ce qui signifierait au moins 10 aspects à s'inquiéter lorsque quelqu'un n'a même pas appris la programmation. Comment est-ce même possible pour la plupart des simples mortels?
@ArnabDatta De simples mortels ne devraient pas programmer.
Je suis à l'université en ce moment et le codage sécurisé est à peine mentionné. Il y a un module séparé à ce sujet mais ce n'est pas obligatoire ... Alors quand les autres étudiants qui venaient juste de commencer PHP (ajoutez toute autre langue que vous souhaitez) avaient eu leurs devoirs marqués, je suis allé leur montrer, regardez si je le fais ceci, je viens de détruire vos cours ... Je ne l'ai pas fait par malveillance, et je ne l'ai fait qu'à des amis, mais ils sont tous partis et ont essayé de corriger les failles de sécurité. C'était assez révélateur pour eux
Je suis assez d'accord (et j'ai voté pour les questions), mais je passerais au deuxième jour plutôt qu'au premier jour. Au tout début, c'est trop d'efforts pour le programmeur novice de simplement faire fonctionner quelque chose. Commencez, oh, environ un tiers du chemin du premier semestre.
Je suis d'accord avec cette réponse.En 2017, la sécurité devrait être un concept de codage central, tout comme la persistance des données.Vous n'avez pas besoin de surcharger les nouveaux programmeurs avec toute la sécurité, mais les nouveaux programmeurs doivent savoir comment transférer des données entre les systèmes et sécuriser les données que leur application expose conformément aux meilleures pratiques d'aujourd'hui.Les nouveaux programmeurs peuvent démarrer sur un seul système avec toutes les entrées provenant du clavier et toutes les sorties allant à l'écran ou au disque local afin de ne pas compliquer la courbe d'apprentissage du langage et de la programmation.
KeithS
2012-12-13 01:57:42 UTC
view on stackexchange narkive permalink

Bien que je sois d'accord en principe avec Everett, il y a un autre point de vue. Le but d'une leçon est d'apprendre un concept, qui peut ensuite être développé. Cela réduit la pente de la courbe d'apprentissage. Enseigner trop trop vite est accablant; face à un assaut d'informations, la plupart des cerveaux «fuient».

C'est formidable de dire «Les pratiques de codage sécurisé devraient être enseignées dès le premier jour», et très difficile de démontrer comment ce jour-là «Hello World «programme peut être vulnérable, en particulier lorsque« qu'est-ce qu'un programme informatique »est un nouveau concept pour la classe. Un projet de site Web touchant des magasins de données partagés (que je n'ai pas vraiment vu avant au moins la moitié de l'université) est plus facile à montrer des faiblesses, mais ces faiblesses sont souvent inhérentes à la mise en place d'un environnement Web de base de preuve de concept avec le " paramètres par défaut. Il est très facile de prouver qu'une application comporte des vulnérabilités, lorsque les vulnérabilités sont connues. Il est plus difficile (impossible, vraiment) de prouver qu'il n'y en a pas.

Je pense de la même manière que l'OP; à un moment donné dans le développement d'un programmeur, l'idée de «comment quelqu'un pourrait-il utiliser ce code pour faire des choses que vous ne voulez pas qu'il fasse, et comment pouvez-vous l'empêcher» peut être fusionnée dans ce que vous faites. Ce point de départ est probablement quelque part où commencer à apprendre soit sur la communication externe ou la persistance (lecture / écriture de données sur un disque dur ou une base de données, ou leur envoi à travers un canal réseau), soit sur les principes orientés objet (héritage, surcharge / dépassement, etc), selon la première éventualité. C'est là qu'un codeur peut commencer à écrire des programmes qui ont le pouvoir de faire des dégâts entre de mauvaises mains, et il faut donc veiller à ce que les mauvaises mains ne puissent pas abuser du programme.

Certains concepts sont faciles à comprendre; «Mon programme fonctionne avec des données qui sont un secret de ses utilisateurs; on me fait confiance et je dois m'assurer que seuls ceux qui devraient voir les données sont autorisés à le faire». Certains sont plus difficiles; J'ai vu des gens vraiment choqués de découvrir que les binaires de programme peuvent être décompilés et lus pour découvrir des informations d'identification ou des clés codées en dur (et que certains environnements comme .NET mettent suffisamment de métadonnées dans les binaires pour produire presque exactement le même code source utilisé pour construire them), ou que leur binaire assemblé peut être utilisé sous sa forme compilée par un attaquant qui se connecte à l'aide de classes ou de membres publics non scellés, puis a accès à tous les secrets avec lesquels ces classes travaillent. Ce sont les pièges de base qui doivent être illustrés, puis les solutions doivent être illustrées, et comment et pourquoi ils fonctionnent expliqués.

Vous pouvez toujours commencer par la conscience. Je pense que cela ressemblerait à quelque chose comme ceci: OK, nous avons terminé "Hello World". Quelqu'un peut-il penser à un moyen de faire en sorte que ce programme fasse quelque chose pour lequel il n'a pas été conçu? "La réponse sera probablement non, et ce n'est pas grave à ce niveau. Mais posez au moins la question. Faites valoir que c'est une considération. Attendez la troisième année pour dire: "d'accord, vous avez appris toutes ces techniques de codage, maintenant nous allons vous montrer à quel point vos béquilles sont vulnérables", c'est une mauvaise forme ... n'est-ce pas?
D'accord, jusqu'à un certain point. Il a fallu une bonne année et demie à ma classe de C ++ au lycée pour avancer à un point où les programmes avaient suffisamment de pouvoir sur les systèmes sur lesquels ils fonctionnaient pour être en fait des vulnérabilités de sécurité, et ce n'est qu'à la moitié de l'université que j'ai commencé à écrire du code. qui dans un contexte réel aurait été exposé publiquement (et serait donc plus autonome pour sa sécurité contre les attaques, par opposition à un site intranet ou à un client lourd local dépendant principalement d'un administrateur système compétent).
Vous ne pourrez peut-être pas enseigner la programmation de sécurité le premier jour, mais un programme raisonnable du «deuxième jour» pourrait bien convenir: comment votre programme de devinettes de nombres réagit-il lorsque vous devinez le nombre «q»?Comment votre imprimante répétée "Hello" réagit-elle lorsque vous lui demandez d'imprimer "Hello" -3 fois?Dès que vous introduisez le concept d'entrée, vous pouvez commencer à parler de nettoyage des entrées.
AviD
2012-12-13 15:24:26 UTC
view on stackexchange narkive permalink

Tout comme d'autres aspects d'une véritable éducation (peut-être que cela devrait être plus sur Parenting.SE ...), je pense que cela revient à la pensée critique .

Ma fille suit également des cours de CS au collège et je l'aide à les suivre. Cependant, je ne lui donne pas les informations à la cuillère, elle doit y travailler.
Dans de nombreux cas, je lui explique quelque chose qui ne va pas, et je m'attends à ce qu'elle m'appelle. (Elle le fait généralement). Parfois, ce n'est que subtilement faux, puis c'est plus difficile pour elle de le remarquer. Parfois, elle ne le remarque pas tout de suite et commence à construire quelque chose sur la base d'une hypothèse erronée - puis elle doit travailler à rebours pour trouver le problème. (Elle s'améliore aussi.)

De cette façon, je la force à s'habituer à remettre en question les hypothèses.
Elle n'est certes pas enthousiasmée par mes méthodes.

De la même manière, je lui demande de repérer de toute façon que son code pourrait être utilisé à mauvais escient, que ce soit accidentellement ou malicieusement. Je lui ai expliqué que Elle possède son code et est responsable de ce que fait son code , pas de place pour la passivité ici. Une partie de cela est une bonne gestion des exceptions, ce que ses instructeurs s'attendent à ce qu'ils fassent de toute façon, même sans vraiment y entrer avant des cours beaucoup plus tardifs.

Maintenant, bien sûr, je m'oppose à toute forme d'enseignement de la "programmation culte du fret" - sauf si cela est explicitement noté comme tel , pour permettre l'enseignement des concepts de base, avec le avertissez que ce n'est pas toute l'histoire et nous y reviendrons plus tard. (Tels que la gestion des exceptions ci-dessus).

Mon point de tout ceci est que la "programmation sécurisée" n'est pas différente de la "programmation" .
Cependant, tout comme le livre entier de programmation ne peut pas être enseigné en une seule séance, mais les concepts sont introduits progressivement - les aspects «sécurité» des concepts de programmation pourraient attendre, tandis que le concept de base est enseigné et compris, avec le notez que "nous n'avons pas encore fini ici". On s’attend également à ce qu’au moins les meilleurs élèves découvrent certains des aspects non sécurisés.

TL; DR :

  1. Un nouveau concept de programmation doit être appris progressivement, certains aspects (y compris la sécurité) peuvent être enseignés plus tard que d'autres ;
  2. Ledit concept de programmation n'est pas complet tant que tous les aspects ne sont pas appris et compris, y compris les aspects de sécurité (et doit être noté jusque-là);
  3. Les programmeurs ont un contrôle complet sur leur code, et pour être un programmeur, il faut savoir comment son code peut être mal utilisé;
  4. Les étudiants qui pratiquent la pensée critique devraient trouver cela par eux-mêmes dès le début (pas nécessairement tout de sécurité, mais le contexte manquant et une bonne partie de l'utilisation abusive du code);
  5. Les élèves qui ne pratiquent pas la pensée critique ne devraient pas vraiment apprendre la programmation ...
+1 pour `` programmation culte du fret '' et point # 5. Je souhaite que plus de ses instructeurs la conduisent sur le chemin de la primevère pour exposer les problèmes avec certaines approches. Je ne peux pas faire exactement ce que vous faites avec votre fille, mais votre approche m'a rappelé de continuer à trouver un moyen de l'utiliser d'une manière ou d'une autre.
AJ Henderson
2012-12-12 22:27:04 UTC
view on stackexchange narkive permalink

Je pense qu'en fin de compte, il s'agit d'essayer de déterminer à quel point l'éducation à la sécurité n'obscurcit pas le but de la leçon. Les devoirs de cours sont généralement des problèmes simplifiés conçus pour exposer un problème particulier et montrer comment résoudre ce problème particulier.

Je pense que la façon la plus idéale de l'aborder est de commencer par lui demander de faire quelque chose comme hackthissite.org pour savoir combien d'attaques fonctionnent et quels sont les dangers. Avoir une bonne compréhension de la façon dont le code peut être subverti est un excellent moyen d'aider quelqu'un à comprendre l'importance des pratiques de codage sécurisées. Le faire en parallèle signifie que cela n'obscurcira pas les sujets que ses instructeurs essaient de traiter tout en montrant les problèmes de sécurité.

J'ai pensé à votre approche parallèle, mais je me suis demandé comment combler le fossé afin de mettre en œuvre un codage approprié dès le début d'un nouveau projet. Je pense avoir couvert les bases (valider et désinfecter), mais je veux passer à l'étape suivante: la conception de base.
Je dirais probablement qu'il s'agit d'un projet unique. Peut-être même prendre l'un de ses projets les plus complexes qui a des lacunes et l'utiliser pour comparer la difficulté de revenir en arrière et de moderniser la sécurité par rapport à une bonne sécurité dès le départ. Difficile à dire sans voir les projets réels parmi lesquels vous devez choisir. Je sais pour moi, être familier et à l'aise avec les attaques suffisait pour me faire construire mes designs pour compenser, mais là encore, je codifie aussi depuis l'âge de 5 ans ...
Deele
2012-12-13 14:53:15 UTC
view on stackexchange narkive permalink

De mon point de vue, en tant qu'analyste de systèmes, il y a un moyen - vous devriez enseigner aux élèves de première année un concept de standardisation, de classification et d'appariement de modèles. Les questions suivantes sont faciles et pourraient être posées au tout début ...

  • Pensez à «toutes les entrées de données possibles», que l'utilisateur peut saisir, et créez-en une liste stricte.
  • Apprendre / enseigner les expressions régulières. Cet outil peut être utilisé pour la mise en correspondance et le nettoyage.
  • Principe des "valeurs par défaut", si les données d'entrée sont manquantes ou non valides.
  • Utilisez des fichiers journaux. En cas de doute ou d'incohérence dans l'entrée, le logiciel doit utiliser une sorte de journalisation, pour «noter cela». Les fichiers journaux sont l'un des meilleurs moyens de déboguer et de découvrir les failles de sécurité que quelqu'un pourrait utiliser ou utilise déjà.
  • Utilisez des messages d'erreur et des cas d'erreur. Pensez aux cas où le système pourrait échouer et pensez au numéro d'erreur approprié et au message détaillé. Certaines erreurs peuvent conduire à deux messages d'erreur détaillés différents - un pour l'utilisateur, clair et simple, un pour le propriétaire du système - à des fins de débogage ou de sécurité.

L'utilisateur est toujours un "méchant", l'utilisateur veut toujours casser votre logiciel - ne donnez jamais à l'utilisateur plus d'informations qu'il n'en demande, et s'il vous le demande, vérifiez toujours s'il a le privilège de recevoir ne serait-ce qu'une réponse simple "Vous n'avez pas d'accès" - les messages d'erreur peuvent aider hacker pour comprendre l'état du système, il essaie de casser.

On pourrait penser à plus, mais cela peut et doit être appréhendé dès le début.

J'aimerais voir des recherches sur le succès de l'enseignement des regex aux élèves de première année. Si cela peut être fait, cela résoudrait tant de problèmes cognitifs à mesure qu'ils grandiraient ...
@schroeder Personnellement, j'ai commencé avec le petit livre de Ben Forta http://www.forta.com/books/0672325667/ traduit en russe. Mais, je suppose, la plupart des professeurs / enseignants ne comprennent pas l'expression régulière par eux-mêmes, c'est pourquoi ils ne l'enseignent pas.


Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...