Java : Oracle publie d'urgence des correctifs
Contre le bogue des nombres à virgule flottante
Le 2011-01-05 12:52:26, par Idelways, Expert éminent sénior
Mise à jour du 10/02/11, par Hinault Romaric
Oracle vient de publier en urgence des correctifs pour le bogue des nombres à virgule flottante dans Java.
Ce bogue entraine le blocage du Runtine Java lorsque celui-ci convertit le nombre 2.2250738585072012e-308 en binaire à virgule flottante.
Un bogue qui peut-être exploité à distance sans authentification. L’exploitation de cette faille peut entrainer le blocage ou le crash du Runtine Java et permettre les attaques par Déni de Service.
Les applications et serveurs Web Java sont particulièrement exposés à cette vulnérabilité selon l’alerte de sécurité publiée par Oracle.
Un certain nombre de produits sont touchés comme Java SE et Java for Business. La liste complète des technologies impactées ainsi que les liens vers les correctifs recommandés ont été publiée sur le site web d’Oracle.
Les correctifs Java SE et Java for Business sont disponibles sur cette page
Source : Alerte de sécurité Oracle
Le bogue des nombres à virgule flottante refait surface en Java
Et plonge le compilateur et les programmes dans des boucles infinies
Mise à jour du 08/02/2011
Quelque temps après sa correction sur PHP, le bogue étrange des nombres à virgule flottante refait surface sur un langage tout aussi populaire : Java.
Ce bogue provoquait sur PHP avant sa correction le crash du système par le passage d'un simple paramètre dans l'URL, pour peu que le script convertisse en nombres ou utilise ces variables dans des opérations arithmétiques (pour plus de détails, lire ci-devant)
Sur Java, un bogue similaire plongerait les programmes à l'exécution (ou leur compilateur) dans des boucles infinies d'après Exploring Binary, le site où ont été mis en lumière les deux bogues.
Le nombre en question, le désormais célèbre 2.2250738585072012e-308 et ses différentes représentations sont supposés être convertie en 0x1p-1022, qui correspond à la constante DBL_MIN.
Au lieu de cela, Java se retrouve coincé, oscillant sans arrêt entre les valeurs 0x1p-1022 et 0x0.fffffffffffffp-1022, le plus grand nombre dénormalisé à double précision et à virgule flottante.
Le bogue serait provoqué par la boucle de correction de la classe FloatingDecimal, chargée de trouver la meilleure approximation, qui la trouve mais la remplace et la retrouve infiniment...
Le bogue a été reporté à Oracle depuis plusieurs semaines, son rapport a récemment été assigné pour analyse interne non accessible sur Sun Developer Network (SDN).
Pour reproduire ce bogue à l'exécution des programmes, compilez et exécutez ce programme
Pour provoquer une boucle infinie au niveau du compilateur, il suffit de tenter de compiler cette classe :
Source : Exploring Binary
Et vous ?
Arrivez-vous à reproduire ce bug ?
Sur quelle plateforme, architecture et version de JRE/JDK ?
PHP : deux correctifs pour le bogue des nombres à virgule flottante
L'équipe de PHP recommande de l'appliquer immédiatement
Mise à jour du 07/01/2011
L'équipe de développement de PHP vient de publier des patchs pour corriger le bogue étrange découvert cette semaine. Un bogue capable de provoquer le crash du système par le passage d'un simple paramètre dans l'URL des sites hébergés sur des systèmes x86 (pour plus de détails, lire ci-avant)
Après analyse, il s'agit vraisemblablement d'un bogue sur le code optimisé pour les x86 du GCC (le compilateur du projet GNU) à l'origine d'une incompatibilité avec x87, l'Unité de calcul en virgule flottante (ou FPU).
Deux nouvelles versions de PHP viennent donc d'être packagées : la 5.3.5 et la 5.2.17.
Ces versions n'incluent aucune autre nouveauté que ce correctif.
L'équipe de PHP "recommande vivement" l'application immédiate de ce patch disponible sur php.net.
Pour vérifier si votre installation de serveur web est vulnérable à cet bug, exécutez ce script en ligne de commande
Les deux correctifs sont téléchargeables sur cette page
Source : l'annonce du lancement de la 5.2.17 et de la 5.3.5, le rapport de bug sur le tracker de GCC
Par Idelways
PHP : un bug étrange rendrait enfantines les attaques par Déni de Service
Il toucherait les versions 5.2 et 5.3 du langage sous Windows et Linux
Un bug critique vient d'être découvert dans les branches 5.2 et 5.3 de PHP, le langage de programmation Web parmi les plus populaires.
Ce bug est provoqué par certaines valeurs de nombres à virgule flottante ayant un nombre considérable de décimaux. Leurs calculs ou évaluations en PHP provoqueraient une boucle infinie occupant 100% des ressources du CPU.
L'exécution de la ligne de code suivante, ou même son équivalent sans la notation scientifique (avec 324 décimales), provoquerait donc le plantage de la machine, et ce sous Linux comme sous Windows.
Ce bug ne se produit vraisemblablement pas sous MacOS selon les premiers tests.
Quoi qu'il en soit, cette découverte s'avère d'autant plus redoutable que ce bug peut être exploité en ajoutant simplement l'une des valeurs en question aux URL des sites, pour peu que les sites attaqués convertissent en nombres ou utilise ces variables dans des opérations arithmétiques.
Enfantin donc.
Comme PHP propulse un grand nombre de sites Web, à l'instar de Développez.com ou Wikipedia, les conséquences pourraient être désastreuses car les sites potentiellement vulnérables se comptent par millions.
Selon Rick Regan, le développeur qui a découvert le bug, cette valeur (2.2250738585072011e-308) est le "plus grand nombre dénormalisé à double précision et à virgule flottante".
Mais on ne sait toujours pas, pour l'instant, pourquoi une telle valeur provoque le crash des machines sur PHP.
Selon certains, il serait dû à la manière dont les processeurs type x86 (ou 32 bits) calculent les nombres à virgule flottante et à grand nombre de décimales. Il serait, selon d'autres, dû à la nature même de ces chiffres, qui ne sont que des représentations approximatives de nombres réels.
Le problème pourrait donc se situer au niveau de l'algorithme chargé de trouver la meilleure approximation.
Une solution temporaire pour ce prémunir contre ce bug est de recompiler PHP avec la variable CFLAGS -ffloat-store, qui désactive l'exécution des versions décimales des nombres passés en paramètre.
Source : Exploring Binary
Et vous ?
Arrivez-vous à reproduire ce bug ? Sur quel OS et version de PHP ?
Comment l'expliquez-vous ?
En collaboration avec Gordon Fowler
Oracle vient de publier en urgence des correctifs pour le bogue des nombres à virgule flottante dans Java.
Ce bogue entraine le blocage du Runtine Java lorsque celui-ci convertit le nombre 2.2250738585072012e-308 en binaire à virgule flottante.
Un bogue qui peut-être exploité à distance sans authentification. L’exploitation de cette faille peut entrainer le blocage ou le crash du Runtine Java et permettre les attaques par Déni de Service.
Les applications et serveurs Web Java sont particulièrement exposés à cette vulnérabilité selon l’alerte de sécurité publiée par Oracle.
Un certain nombre de produits sont touchés comme Java SE et Java for Business. La liste complète des technologies impactées ainsi que les liens vers les correctifs recommandés ont été publiée sur le site web d’Oracle.
Source : Alerte de sécurité Oracle
Le bogue des nombres à virgule flottante refait surface en Java
Et plonge le compilateur et les programmes dans des boucles infinies
Mise à jour du 08/02/2011
Quelque temps après sa correction sur PHP, le bogue étrange des nombres à virgule flottante refait surface sur un langage tout aussi populaire : Java.
Ce bogue provoquait sur PHP avant sa correction le crash du système par le passage d'un simple paramètre dans l'URL, pour peu que le script convertisse en nombres ou utilise ces variables dans des opérations arithmétiques (pour plus de détails, lire ci-devant)
Sur Java, un bogue similaire plongerait les programmes à l'exécution (ou leur compilateur) dans des boucles infinies d'après Exploring Binary, le site où ont été mis en lumière les deux bogues.
Le nombre en question, le désormais célèbre 2.2250738585072012e-308 et ses différentes représentations sont supposés être convertie en 0x1p-1022, qui correspond à la constante DBL_MIN.
Au lieu de cela, Java se retrouve coincé, oscillant sans arrêt entre les valeurs 0x1p-1022 et 0x0.fffffffffffffp-1022, le plus grand nombre dénormalisé à double précision et à virgule flottante.
Le bogue serait provoqué par la boucle de correction de la classe FloatingDecimal, chargée de trouver la meilleure approximation, qui la trouve mais la remplace et la retrouve infiniment...
Le bogue a été reporté à Oracle depuis plusieurs semaines, son rapport a récemment été assigné pour analyse interne non accessible sur Sun Developer Network (SDN).
Code : |
1 2 3 4 5 6 7 | class runhang { public static void main(String[] args) { System.out.println("Test:"); double d = Double.parseDouble("2.2250738585072012e-308"); System.out.println("Value: " + d); } } |
Code : |
1 2 3 4 5 6 | class compilehang { public static void main(String[] args) { double d = 2.2250738585072012e-308; System.out.println("Value: " + d); } } |
Source : Exploring Binary
Et vous ?
PHP : deux correctifs pour le bogue des nombres à virgule flottante
L'équipe de PHP recommande de l'appliquer immédiatement
Mise à jour du 07/01/2011
L'équipe de développement de PHP vient de publier des patchs pour corriger le bogue étrange découvert cette semaine. Un bogue capable de provoquer le crash du système par le passage d'un simple paramètre dans l'URL des sites hébergés sur des systèmes x86 (pour plus de détails, lire ci-avant)
Après analyse, il s'agit vraisemblablement d'un bogue sur le code optimisé pour les x86 du GCC (le compilateur du projet GNU) à l'origine d'une incompatibilité avec x87, l'Unité de calcul en virgule flottante (ou FPU).
Deux nouvelles versions de PHP viennent donc d'être packagées : la 5.3.5 et la 5.2.17.
Ces versions n'incluent aucune autre nouveauté que ce correctif.
L'équipe de PHP "recommande vivement" l'application immédiate de ce patch disponible sur php.net.
Source : l'annonce du lancement de la 5.2.17 et de la 5.3.5, le rapport de bug sur le tracker de GCC
Par Idelways
PHP : un bug étrange rendrait enfantines les attaques par Déni de Service
Il toucherait les versions 5.2 et 5.3 du langage sous Windows et Linux
Un bug critique vient d'être découvert dans les branches 5.2 et 5.3 de PHP, le langage de programmation Web parmi les plus populaires.
Ce bug est provoqué par certaines valeurs de nombres à virgule flottante ayant un nombre considérable de décimaux. Leurs calculs ou évaluations en PHP provoqueraient une boucle infinie occupant 100% des ressources du CPU.
L'exécution de la ligne de code suivante, ou même son équivalent sans la notation scientifique (avec 324 décimales), provoquerait donc le plantage de la machine, et ce sous Linux comme sous Windows.
Code : |
1 2 | <?php $d = 2.2250738585072011e-308; ?> |
Quoi qu'il en soit, cette découverte s'avère d'autant plus redoutable que ce bug peut être exploité en ajoutant simplement l'une des valeurs en question aux URL des sites, pour peu que les sites attaqués convertissent en nombres ou utilise ces variables dans des opérations arithmétiques.
Enfantin donc.
Comme PHP propulse un grand nombre de sites Web, à l'instar de Développez.com ou Wikipedia, les conséquences pourraient être désastreuses car les sites potentiellement vulnérables se comptent par millions.
Selon Rick Regan, le développeur qui a découvert le bug, cette valeur (2.2250738585072011e-308) est le "plus grand nombre dénormalisé à double précision et à virgule flottante".
Mais on ne sait toujours pas, pour l'instant, pourquoi une telle valeur provoque le crash des machines sur PHP.
Selon certains, il serait dû à la manière dont les processeurs type x86 (ou 32 bits) calculent les nombres à virgule flottante et à grand nombre de décimales. Il serait, selon d'autres, dû à la nature même de ces chiffres, qui ne sont que des représentations approximatives de nombres réels.
Le problème pourrait donc se situer au niveau de l'algorithme chargé de trouver la meilleure approximation.
Une solution temporaire pour ce prémunir contre ce bug est de recompiler PHP avec la variable CFLAGS -ffloat-store, qui désactive l'exécution des versions décimales des nombres passés en paramètre.
Source : Exploring Binary
Et vous ?
En collaboration avec Gordon Fowler
-
stealth35Expert éminent sénioraïe
Code : 1
2$d = $_GET['d']; //'2.2250738585072011e-308'; $c = (float) $d;
le 05/01/2011 à 13:45 -
elias551Membre du ClubApparament ils ont trouvés l'erreur, c'est le code optimisé de gcc pour x86 qui produit du code bizarre
cf:
http://bugs.php.net/bug.php?id=53632
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=323le 05/01/2011 à 18:33 -
YannPeniguelMembre éprouvé
Toute personne malveillante connaissant ce bug et souhaitant dégommer ton application par un moyen, exposé publiquement, de lui fournir cette valeur en entrée. Mettons par exemple dans les appels AJAX utilisant des JSP, ou dans les parametres d'url pour tes servlets Java...le 08/02/2011 à 17:20 -
stealth35Expert éminent séniorle 05/01/2011 à 14:48
-
JeitEmgieExpert confirméPas de problème sur :
Ubuntu 8 Kernel 2.6.24-24-generic (AMD 64)
PHP 5.2.4-2ubuntu5.6 with Suhosin-Patch 0.9.6.2 (cli) (built: Apr 17 2009 14:29:38)
Copyright (c) 1997-2007 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies
with the ionCube PHP Loader v3.1.33, Copyright (c) 2002-2007, by ionCube Ltd.
Mac OS X Server 10.5 (Core2 i386)
PHP 5.2.14 (cli) (built: Oct 6 2010 16:57:10)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2010 Zend Technologies
Mac OS X 10.6 (Xeon x86_64)
PHP 5.3.3 (cli) (built: Aug 22 2010 19:41:55)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
SUSE 11.3 SP1 (VM 64 bits in IBM EHN DataCenter)
PHP 5.2.14 with Suhosin-Patch 0.9.7 (cli) (built: Aug 5 2010 10:04:36)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2010 Zend Technologies
with Suhosin v0.9.32.1, Copyright (c) 2007-2010, by SektionEins GmbH
Ubuntu 8 Kernel 2.6.27.10 (Intel x86-64)
PHP 5.2.6-2ubuntu4.3 with Suhosin-Patch 0.9.6.2 (cli) (built: Aug 21 2009 22:54:45)
Copyright (c) 1997-2008 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies
Mac OS X 10.4 (Core2 i386)
PHP 4.4.9 (cli) (built: Sep 17 2008 14:54:01)
Copyright (c) 1997-2008 The PHP Group
Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies
Mac OS X 10.5 (Xeon x86_64)
PHP 5.2.12 (cli) (built: Feb 9 2010 00:34:23)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2009 Zend Technologies
CentOS 5.5 Kernel 2.6.27.10 (Xeon x86-64)
PHP 5.2.8 (cli) (built: Sep 5 2009 19:13:55)
Copyright (c) 1997-2008 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologiesle 05/01/2011 à 14:49 -
stealth35Expert éminent séniorselon Zend :
Code : 1
2
3
4
5
6Platform Vulnerability Windows YES Linux (using 32-bit PHP build) YES Linux (using 64-bit PHP build) NO Mac OS NO IBM i NO
le 06/01/2011 à 10:13 -
stealth35Expert éminent séniorj'ai vu quelques fixs assez sympa en attendant de mettre à jour votre version
un petit fichier avecCode : 1
2
3
4
5
6foreach(array("_GET","_POST","_REQUEST","_COOKIES") as $G) { if (in_array('2.2250738585072011e-308', $$G)) { header("Status: 422 Unprocessable Entity"); exit; } }
sources :
http://stackoverflow.com/questions/4...ollowing-work-
http://stackoverflow.com/questions/4...605977#4605977le 06/01/2011 à 11:01 -
CrydeMembre du ClubComme quoi, les détracteurs du PHP auront vite compris qu'il n'y a pas que ce langage qui posait problème avec ça ^^le 08/02/2011 à 18:56
-
Rom_1Membre régulierUne attaque par déni de service est une attaque visant à rendre un service inutilisable.
Si ca marche avec une seule requête, l'attaque n'en est que plus efficace.
Mais normalement, le serveur web devrait utiliser un thread par requête (donc une requête ne bloque au maximum qu'un cœur et pas le service entier) et tuer le thread après un certain temps d'exécution.
Enfin c'est quand même sacrément efficace.
EDIT : vu les explications de la personne qui a découvert le bug, le problème vient du fait que la FPU des processeurs x86 utilise une précision étendue (80 bits) dans tous les cas, et ne sait pas calculer en double précision (64 bits). Donc ca viendrait plus de la plate-forme que du langage.
Et donc, ce ne serait pas étonnant que d'autres langages soient touchés, par exemple .net ou python...le 13/02/2011 à 10:43 -
bubulemasterMembre éclairéEffectivement, avec PHP 5.3.0 sous Win XP, le problème existe.
Comment j'esplique se problème ? Disons, que je commence à me dire que PHP, à voir le nombre de bug qui sont corrigés régulièrement, n'a pas une phase de test (de conception aussi ?) assez complète. (même si j'adore ce langage)le 05/01/2011 à 13:06