68 votes

Le "Code Access Security" est-il d'une quelconque utilité dans le monde réel ?

Attention :

Des versions plus récentes de .Net et de .Net core ont supprimé et/ou modifié le "Code Access Security" (CAS) depuis que cette question a été posée.

Question originale :

Je suis en train d'étudier pour le 70-536 .NET Framework - Examen de base du développement d'applications Comme je programme .net depuis de nombreuses années, cela ne devrait pas être difficile !

Cependant, je dois apprendre ce qu'est la "sécurité d'accès au code" (CAS). Comme je n'ai jamais eu besoin de l'utiliser ou de la configurer, je me demandais si quelqu'un d'autre l'avait utilisée dans la vie réelle ?

Veuillez fournir des exemples de cas où vous avez utilisé le CAS et où il a fait partie de la solution plutôt que du problème.

(Jusqu'à présent, tout le reste avait un rapport avec les tâches que j'ai dû accomplir au cours de mes années de programmation .NET).


Questions connexes :


Résultats jusqu'à présent.

  • CAS est utile lorsque vous hébergez du code tiers. Par exemple, une société d'hébergement web peut l'utiliser pour empêcher le code Asp.net de ses clients d'endommager les serveurs. (Office l'utilise également lorsque .NET est utilisé en remplacement de VBA).

  • Les seuls exemples détaillés de son utilisation en dehors d'une application Microsoft sont jusqu'à présent :

    Un projet récent que j'ai fait avait quelque chose similaire : permettre à l'utilisateur de télécharger une bibliothèque, et la tester pour ses performances ("qui fait le meilleur algorithme"). Inutile de dire que nous avions besoin de CAS fortement là.

  • Le CAS semble être utile pour obtenir la certification JITDC, qui est comme le département de la défense des États-Unis, mais je ne sais pas si le CAS a été d'une réelle utilité, ou s'il s'agissait simplement de cocher des cases.

(Si vous devez contourner un hôte qui utilise CAS et que vous avez des droits d'administrateur sur cette machine, vous pouvez simplement placer vos assemblages dans le GAC).

Je suis impatient, CAS est un peu moins complexe dans .net 4 .


Au moins, il semble que les nouveaux examens de Microsoft ne comporteront pas d'examen "de base" incluant le CAS. Je ne sais pas s'il sera intégré aux nouveaux examens Winforms/WPF.

2 votes

J'ai eu la même réaction en préparant cet examen ; mon opinion est qu'il s'agit d'un élément clé du cadre .NET en interne, utilisé par Microsoft pour combler de nombreuses failles de sécurité, et qu'ils l'ont exposé pour que d'autres personnes puissent l'utiliser également. Mais je ne l'ai jamais utilisé moi-même, et je ne connais personne qui l'ait utilisé dans une application commerciale.

0 votes

Le CAS a une surface énorme. Il est probable qu'il contienne beaucoup de bogues de sécurité. Les bogues JIT, par exemple, peuvent contourner le CAS. Consultez GitHub CoreClr pour voir combien de bogues JIT il y a. CAS est une barrière de sécurité de type "best effort". Un attaquant suffisamment motivé peut le surmonter. L'exécution de code non fiable à l'aide de CAS est très dangereuse.

35voto

Abel Points 24335

Je rencontre la sécurité d'accès par code assez souvent dans le "monde réel", souvent quand je m'y attends le moins. Et d'une certaine manière, SilverLight serait une excellente application du monde réel, si ce n'était pas que SilverLight a choisi de ne pas employer le CAS en fin de compte.

Fournisseurs d'hébergement

Les endroits où vous le voyez en action sont ceux où un environnement sécurisé est nécessaire : ASP.NET lui-même bien sûr, mais les fournisseurs d'hébergement ASP.NET utilisent un modèle de sécurité modifié pour empêcher l'intrusion dans leurs précieux systèmes. Je sais pertinemment que Webhost4Life l'utilise (aucune information sur leur site à ce sujet, mais j'ai travaillé avec eux, c'est là, vraiment). En regardant plus loin, d'autres fournisseurs d'hébergement ASP.NET font de même, mais ils ne sont pas non plus très clairs à ce sujet : fil sur godaddy.com pas vouloir modifier le CAS (et ne pas savoir clairement ce qui est pris en charge et ce qui ne l'est pas) ou cette discussion connexe sur 1&1 . Certains sites d'hébergement en nuage (rackspacecloud) sont allés un peu plus loin et ont "a travaillé avec Microsoft pour un niveau de confiance complet modifié" quel qu'il soit.

En bref : si vous trouvez un hébergeur ASP.NET, il est fort probable qu'il utilise CAS pour vous empêcher de faire ce qu'il ne veut pas que vous fassiez. Ils peuvent même l'utiliser pour faire la différence entre l'hébergement "de base" (nombreuses restrictions) et l'hébergement "d'entreprise" (peu de restrictions), ce qui donne un tout autre sens au CAS.

Autres applications du CAS

Voilà pour quelques situations du monde réel que j'ai rencontrées moi-même. Un projet récent que j'ai réalisé avait quelque chose de similaire : permettre à l'utilisateur de télécharger une bibliothèque, et la tester pour ses performances ("qui fait le meilleur algorithme"). Inutile de dire que nous avions fortement besoin de CAS à cet endroit. Autres exemples ou ressources intéressantes :

Dans toutes les situations où vous avez le contrôle total de vous-même, où vous construisez votre propre application et votre code (ou le faites construire) et où vous avez le contrôle total de votre système, je ne pense pas que vous aurez besoin du CAS trop souvent. C'est plutôt quelque chose que vous utiliserez dès que vous aurez à exécuter du code provenant de sources moins fiables (c'est-à-dire, en gros, tout ce qui n'est pas sous votre contrôle total).

CAS vs ClickOnce

Les paramètres CAS par défaut limitent les capacités du code exécuté à partir d'un partage réseau ou d'autres sources non locales. C'est logique, mais les restrictions strictes rendent difficile l'utilisation d'un référentiel central pour les applications distribuées. .NET 2.0 a introduit ClickOnce, qui était censé élever le niveau de sécurité ( discussion ici ).

ClickOnce lui-même utilise le CAS pour empêcher l'installateur d'accéder aux fonctions du système. En tant que tel, je crois que c'est discutable l'application la plus connue qui s'appuie sur le CAS .

Ce que je veux dire, c'est que vous devez comprendre le CAS pour pouvoir créer quelque chose qui peut être exécuté directement à partir d'un partage, ou vous ignorez tout et utilisez ClickOnce.

Enquête de Microsoft sur le CAS

En 2005, Microsoft a convoqué une enquête pour découvrir pourquoi le CAS était si impopulaire, dans l'espoir de l'améliorer pour qu'il soit mieux applicable. Malheureusement, je n'ai pas pu trouver les résultats réels de l'enquête, sauf que ce billet détaillant quelque peu pourquoi le CAS est sous-utilisé.

CAS dans un autre monde

Ce post, cependant, pointe vers une niche intrigante : Le CAS appliqué à un autre monde : Unix / Linux. Ils ne l'appellent pas CAS, mais plutôt BitFrost . C'est une application du monde réel : l'équipe de la "Projet "Un ordinateur portable par enfant qui s'appuie sur BitFrost pour remplacer le modèle de sécurité traditionnel d'Unix.

Mise à jour : section sur le CAS dans Unix/Linux comme BitFrost et section sur l'enquête.
Mise à jour : ajout de la section CAS vs ClickOnce
Mise à jour : ajout d'une liste de ressources utilisant le CAS (et toutes mes excuses pour toutes ces mises à jour d'affilée !)

10voto

Michael Stum Points 72046

Techniquement, c'est très utile car cela permet de spécifier les autorisations de manière très fine. C'est à la fois bon pour vous (car théoriquement, cela rend l'exploitation des failles de sécurité beaucoup plus difficile - même si un attaquant prend le contrôle total de votre application, il reste enfermé dans le CAS Sandbox) et pour votre client (car il peut voir exactement ce que votre application peut faire et effectuer son propre audit de sécurité).

Dans la pratique, cela n'a pratiquement aucun sens. Je pense que c'est trop complexe, trop peu pris en charge par les outils de développement disponibles et la plupart des utilisateurs s'en moquent de toute façon.

Il y a bien sûr des exceptions (les gouvernements et les clients qui connaissent vraiment .net/CAS) et j'aimerais dire que le CAS est absolument utile et obligatoire, mais la réalité parle un langage clair.

0 votes

Encore un bon idéal qui ne passe pas le test de la "vraie vie", dommage que nous devions tous l'apprendre pour passer les examens

0 votes

Malheureusement, oui. Je vois le principal problème dans le fait qu'il n'y a tout simplement pas d'outillage pour cela. Je ne sais tout simplement pas quelles sont les permissions dont j'ai besoin (du moins pas leurs noms internes) et les choses sont assez complexes. Idéalement, j'aimerais pouvoir exécuter mon application dans un "bac à sable" et obtenir un rapport "Votre application a besoin de ces autorisations" afin de pouvoir les examiner et créer la politique de CAS à partir de là, mais un tel bac à sable n'existe pas (AFAIK).

0 votes

C'est une excellente explication succincte et je peux en voir la valeur, cela peut valoir la peine de se casser la tête.

5voto

Marc Gravell Points 482669

Note au lecteur : voir les deux commentaires ci-dessous ; il semble que je gonfle accidentellement la définition de CAS pour y inclure (à tort) RBS. Je laisse la réponse ici pour référence, mais notez la distinction.


Il y a deux havlings pour le CAS ; la chose que vous verrez le plus sur dans cet examen c'est toutes les nuances pour que le code appelle un autre code, ce qui puede peut être utile pour la confiance partielle, mais la plupart du temps, c'est tout simplement pénible - et pire encore : si votre code a une confiance totale (ce qui est le cas de la plupart / trop) rien ne s'exécute réellement (il est entièrement ignoré).

Le site utile partie de CAS RBS est la permission principale, qui est utilisé ; bien sûr, votre interface utilisateur doit vérifier l'accès aux fonctionnalités, mais vous pouvez mettre (dans votre logique de bas de page) :

[PrincipalPermission(SecurityAction.Demand, Role = "ADMIN")]
static void DeleteOrder(int id) { ... }

Cette règle sera appliquée même en cas de confiance totale ; vous pouvez définir votre propre principal (lié à l'utilisateur) en mettant en œuvre la méthode suivante IPrincipal (regardez IsInRole() ). Et comme les principes sont pris en charge dans la plupart des environnements (winforms, webforms, mvc, wcf, etc.), cela peut constituer un moyen très souple de vérifier la sécurité au niveau de l'entreprise. sans avoir à faire référence au modèle de sécurité spécifique . Notez que la vérification ci-dessus fonctionnerait dans tout l'environnement.

Vous pouvez aussi peut-être l'utiliser pour piloter votre interface utilisateur. J'ai eu un message sur Usenet qui activait / désactivait les contrôles winforms en fonction du principal (en utilisant les propriétés d'exécution pour spécifier le rôle par contrôle, un peu comme ToolTip etc) - Je ne peux pas le trouver en ce moment, cependant (éditer : peut-être celui-ci ).

2 votes

À ma connaissance, PrincipalPermission ne relève pas de CAS, mais plutôt de Role-Based Security. CAS place la détermination de la confiance entre les mains de l'administrateur du site. RBS place la détermination de la confiance entre les mains du développeur. Une énorme différence fondamentale.

1 votes

Je ne pense pas que le CAS inclut la sécurisation du code en fonction du principal ou de l'identité de l'utilisateur. En fait, selon la définition de CAS de microsoft ( msdn.microsoft.com/fr/us/library/930b76w0.aspx ), il est explicitement décrit comme quelque chose au-delà de donner des autorisations en fonction de l'identité de l'utilisateur, ce qui est qualifié d'utile mais de loin insuffisant.

0 votes

@gWiz, @Cheeso - OK ; merci pour la clarification. Il s'agit donc simplement de connexe concepts. Dans ce cas, je pense que ma réponse pourrait être beaucoup plus courte : "IMO, pas tant que ça" ;-p

2voto

Nick Berardi Points 31361

Ce qu'il faut comprendre à propos de la sécurité d'accès au code, c'est qu'elle est très peu utile pour un développeur d'applications, si ce n'est pour comprendre comment elle est utilisée et à quel niveau de permission pour les API que vous pouvez appeler. La seule exception à cette règle, que j'ai trouvée vraiment utile, est un CAS appelé PrincipalPermission, qui empêche l'exécution de certains codes si le bon rôle n'est pas défini pour le Principal actuel. Voir cet article à ce sujet :

http://www.coderjournal.com/2008/03/securing-mvc-controller-actions/

Les développeurs qui doivent vraiment prêter attention au CAS et à la manière dont il doit être mis en œuvre dans leur application sont les développeurs de cadres et de bibliothèques de codes. En effet, il existe certains niveaux de confiance que vous devez exiger pour que votre application fonctionne, en particulier lorsque vous traitez des ressources non gérées telles que des fichiers, des flux réseau, des ports série, etc. Ou si vous créez le code pour cette ressource non gérée, comme un serveur spécialisé, ou toute sorte d'accès de bas niveau à vos assemblages, vous voudrez créer une certaine sécurité d'accès au code autour de lui afin que les gens ne soient pas autorisés à exécuter quelque chose qui leur a été strictement interdit.

Le fait que Microsoft n'ait pas vraiment réussi à expliquer comment utiliser le CAS dans les applications quotidiennes n'aide pas. C'est donc la raison du manque d'utilisation. Cependant, CAS est l'une des nombreuses raisons pour lesquelles .NET est un langage si sûr et souffre de beaucoup moins de problèmes que ses concurrents.

2 votes

PrincipalPermission n'est techniquement pas une sécurité d'accès au code, c'est une sécurité basée sur les rôles. La différence est que la sécurité basée sur les rôles s'appuie sur le PrincipalActuel comme preuve, alors que la sécurité d'accès au code s'appuie sur la politique de sécurité de la machine et le strong-naming de l'assemblage. CurrentPrincipal est modifiable par l'appelant, la confiance repose donc entre les mains du développeur. La politique de sécurité est définie par l'administrateur local, la confiance est donc entre les mains de l'opérateur.

2voto

Dana Holt Points 7150

J'étais le chef du développement d'un projet visant à obtenir Certification JITC (ministère américain de la Défense) pour une solution basée sur .NET, et les paramètres du CAS ont été examinés de très près lors des tests de certification.

Comme la plupart des autres exigences de certification, le code ne pouvait utiliser que les privilèges dont il avait besoin pour fonctionner et pas plus.

Si vous envisagez d'obtenir des certifications en matière de sécurité, le CAS peut certainement être important.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X