web-dev-qa-db-fra.com

Pourquoi est-ce que j'entends parler de tant d'insécurité Java? D'autres langues sont-elles plus sécurisées?

J'aime vraiment le langage de programmation Java, mais j'entends continuellement parler de son insécurité. La recherche sur 'Java insecure' ou 'Vulnérabilités Java' fait apparaître plusieurs articles expliquant pourquoi vous devriez désinstaller ou désactiver = Java pour protéger votre ordinateur. Java publie souvent un grand nombre de correctifs de sécurité à la fois, et pourtant il reste des tonnes de vulnérabilités à corriger).

Je comprends qu'il y aura toujours des bogues dans les logiciels, mais le nombre de vulnérabilités Java a eu ne semble pas normal (ou est-ce que j'imagine cela?). Ce qui est encore plus déroutant, c'est que s'il y a une seule décision architecturale qui crée ces vulnérabilités, pourquoi ne pas changer cette conception? Il y a des tonnes d'autres langages de programmation qui n'ont pas ce problème, donc il doit y avoir une meilleure façon de faire quoi que ce soit Java = fait mal. Alors pourquoi Java toujours si peu sûr?

104
gsingh2011

Si vous utilisez Java comme la plupart des autres langages de programmation, par exemple pour écrire des applications autonomes, il n'est pas moins sécurisé que les autres langages et plus sécurisé que C ou C++ en raison de pas de débordements de tampon, etc.

Mais Java est régulièrement utilisé comme plugin dans le navigateur Web, par exemple similaire à Flash. Parce que dans ce cas, l'utilisateur exécute du code non fiable sans l'avoir explicitement installé, l'idée est de faire exécuter le code à l'intérieur d'un bac à sable limité, où il ne devrait pas être en mesure d'agir contre le système ou l'utilisateur (par exemple, lire des fichiers locaux et les envoyer sur le site Web, scanner le réseau local, etc.). Et c'est là que Java a échoué ces dernières années, par exemple de nouveaux bugs surgissaient parfois quotidiennement ce qui permettait de s'échapper du bac à sable.

De plus, parfois, des bogues dans l'interpréteur de code d'octet ou les bibliothèques natives entraînent des débordements de tampon et peuvent compromettre le système, mais à cet égard, Flash est généralement considéré comme pire.

Et en ce qui concerne les autres langues, elles sont meilleures: elles ne peuvent généralement pas s'exécuter en tant que code non approuvé dans un bac à sable (à l'exception de JavaScript et peut-être de Flash), elles seraient donc encore pires car il n'y a aucun moyen intrinsèque de limiter leur interaction avec le système .

120
Steffen Ullrich

Les vulnérabilités de sécurité signalées ne concernent pas Java (le langage de programmation), qui, en raison de l'application de la JVM sécurité de la mémoire , est en fait plus robuste que des langages tels que C ou C++, où les débordements de tampon et les sur-lectures de tampon restent une menace et peuvent entraîner des dégâts comme Heartbleed.

Au lieu de cela, les vulnérabilités signalées se trouvent dans le Java Sandbox, qui tente d'appliquer un modèle de privilège qui permet une exécution sûre du code non approuvé, et qui est surtout utilisé pour permettre l'exécution automatique de Java Applets dans un navigateur. Ce bac à sable est criblé de trous. De plus, Oracle ne publie les correctifs (les "mises à jour critiques des correctifs") que 4 fois par an. Inutile de dire que les fournisseurs de navigateurs ne sont pas satisfaits de cela. Firefox , par exemple, est nécessitant l'autorisation de l'utilisateur pour lancer une Java Applet depuis Firefox 26.

La raison pour laquelle les articles de presse ne font pas cette distinction est qu'Oracle utilise la marque "Java" à la fois pour le langage de programmation et le plugin du navigateur qui exécute les applets . En fait, si un utilisateur ordinaire rencontre la marque Java, il fait probablement référence à cette dernière.

Il est quelque peu spéculatif pourquoi exactement le bac à sable reste vulnérable. Si vous me demandez, une des raisons est que la même API est utilisée à la fois avec et sans le bac à sable, et la plupart Java s'exécute sans le bac à sable (car le code est approuvé). Par conséquent, il est tout à fait possible pour un développeur d'oublier cette fonction obscure lors de la modification de l'API Java ou de son implémentation, exposant accidentellement des choses qui devraient être protégées (pour illustrer la facilité, voici le long - Directives de codage sécurisé pour Java SE ). Une autre raison, mais liée, est la taille de l'API Java ( 5800 et près de 50 000 méthodes pour Java SE 6 ).

81
meriton

Il y a des tonnes d'autres langages de programmation qui n'ont pas ce problème, donc il doit y avoir une meilleure façon de faire quoi que ce soit Java fait mal.

C'est une revendication assez élevée, où avez-vous eu cette impression? Il y a "des tonnes d'autres langages de programmation" qui n'ont pas été soumis aux mêmes rythmes que Java, ou qui sont utilisés de manière omniprésente.

En principe, la raison pour laquelle il y a tant de correctifs de sécurité est que Java a été conçu pour être sécurisé, avec un certain nombre de fonctionnalités axées sur la sécurité que d'autres langages ne possèdent pas.

L'environnement de langage Java Language

1.2.2 Robuste et sécurisé

La technologie Java est conçue pour fonctionner dans des environnements distribués, ce qui signifie que la sécurité est d'une importance capitale. Avec des fonctionnalités de sécurité conçues dans le langage et le système d'exécution, Java vous permet de créer des applications qui ne peuvent pas être envahies de l'extérieur. Dans l'environnement réseau, les applications écrites dans le Java est protégé contre les intrusions par du code non autorisé tentant de pénétrer dans les coulisses et de créer des virus ou d'envahir les systèmes de fichiers.

Si vous n'incluez pas "be secure" dans les spécifications de votre langage de programmation, vous devrez rarement publier des correctifs de sécurité. Si, d'autre part, c'est l'un de vos objectifs déclarés, vous aurez du mal à le faire pas.

11
dimo414

En soi, Java a de grands atouts pour la sécurité, à savoir sa résistance inhérente aux débordements de tampon et aux erreurs de gestion de la mémoire:

  • Tous les accès au tableau sont vérifiés en ce qui concerne la longueur de tableau allouée. Les débordements de tampon sont ainsi piégés de manière fiable et déclenchent une exception, ce qui est mieux (cela transforme les vulnérabilités d'exécution de code à distance en simple déni de service).

  • L'allocation de mémoire est gérée via un garbage collector, ce qui empêche les erreurs d'utilisation après libération et de double libération. En outre, le GC permet une gestion plus facile des chaînes de caractères (les chaînes sont immuables en Java), ce qui supprime la plupart des occasions de bogues de dépassement de tampon.

  • Une frappe stricte est appliquée; le code ne peut pas accéder aux octets de données pour ce qu'ils ne sont pas. Cela évite à nouveau les vulnérabilités (les bogues où les types de données sont transgressés seront signalés lors de la compilation ou, au pire, comme un runtime ClassCastException).

Cela rend Java beaucoup plus fort que de nombreux langages de programmation (en particulier le couple infernal C/C++) en matière de sécurité.

Cependant, les concepteurs Java Java ont essayé de tirer parti de cette sécurité améliorée pour rendre quelque chose de difficile, c'est-à-dire applets . Le problème est la surface d'attaque : puisque l'applet est du code potentiellement hostile, tout ce qu'il fait doit être contrôlé. Mais le code hostile doit pouvoir utiliser les "standards Java classes") s'il est de faire n'importe quoi, donc les "points de contrôle" doivent être appliqués à chaque standard Java. La surface d'attaque se compose donc de centaines de classes contenant des milliers de méthodes, et toutes d'entre eux doivent appliquer des contrôles adéquats.

Les concepteurs de Java Java ont péché par ambition: la difficulté d'implémenter des milliers de vérifications sans les bousiller était beaucoup plus élevée que ce qu'ils imaginaient. Tous les "bogues Java" viennent de ce fait.

Nous pouvons comparer Java avec Javascript ici; par exemple, Java permet l'accès aux fichiers sur les disques, mais ce droit ne doit pas être accordé aux applets, sauf si le l'applet l'a demandé et l'utilisateur accepte (ce qui implique toute l'entreprise de signature d'applet). Javascript, moins ambitieux, n'a simplement aucune méthode d'accès aux fichiers: les contrôles d'accès sur une fonction ne peuvent pas être mis en œuvre de manière incorrecte si la fonction n'existe pas réellement!

Pour résumer: Java est très bien et sécurisé. Java applets implique une énorme surface d'attaque dont la sécurité est très difficile à assurer. Pour les applications et serveurs autonomes, l'utilisation de Java est une bonne idée si vous voulez la sécurité ( cela s'applique également à C #).

10
Thomas Pornin

De nos jours, trouver plus de vulnérabilités peut ne pas impliquer le degré d'insécurité du logiciel. Le problème est de savoir comment l'équipe de réponse de sécurité de chaque fournisseur de logiciels y réagit et à quelle vitesse les correctifs sortent.

Vérifiez simplement à quelle vitesse Firefox et Chrome sont corrigés. De nombreuses vulnérabilités sont également trouvées sur eux et résolues.

Si je me souviens bien, Oracle a un programme appelé Critical Patch Updates (CPU) qui donne de nombreux correctifs chaque trimestre. Ils publient également des correctifs sans CPU s'il y a vulnérabilité de jour zéro . Mais le problème est le temps mis par Oracle pour publier un correctif.

4
Kasun

Peur surfaite .. Java lui-même est très bien; les problèmes se produisent avec les Java-Applets à l'ancienne fonctionnant dans les navigateurs Web, mais je doute que quiconque crée réellement des Applets - la plupart des maisons de développement utilisent Flash ou HTML4/5 pour les interfaces Web frontales depuis au moins 10 ans.

De nos jours, Java est principalement utilisé pour le backend JEE, les clients d'interface graphique frontale (JFX/AWT/SWING), les applications de console et les applications mobiles - il n'y a donc aucun problème.

2
John