Load testing with Siege

Sortie de Ruby 2.0.0-p0

Nous sommes heureux d'annoncer la sortie de Ruby 2.0.0-p0 !

Cette version est la première release stable de la branche 2.0. Elle intègre de nombreuses nouvelles fonctionnalités et améliorations, pour faire face à la diversification toujours plus importante des cas d'usages de Ruby.

Nous vous souhaitons un happy hacking avec Ruby 2.0.0 !

Téléchargements

Quoi de neuf dans Ruby 2.0.0 ?

Nouvelles fonctionnalités

Petit aperçu des nouveautés…

  • Fonctionnalités principales du langage :
    • les arguments mots-clés, pour plus de flexibilité (API…)
    • Module#prepend, une nouvelle façon « d'augmenter » une classe
    • le litéral %i, pour créer un tableau de symboles avec une syntaxe minimale
    • __dir__, pour accéder directement au nom du dossier contenant le fichier en cours d'exécution
    • UTF-8 devient l'encodage par défaut (fini les commentaires « magiques » !)
  • Au niveau des librairies du Core :
    • Enumerable#lazy et Enumerator::Lazy permettent de gérer des suites potentiellement infinies (lazy streams)
    • Enumerator#size et Range#size, pour déterminer la taille par évaluation retardée (lazy evaluation)
    • #to_h comme nouvelle méthode conventionnelle pour gérer la conversion vers un Hash
    • Onigmo remplace Oniguruma comme moteur d'expressions régulières (c'est un fork)
    • nouvelle API de gestion asynchrone des exceptions
  • Du côté de la chasse aux bugs
    • support de DTrace, ce qui permet notamment de produire des rapports at run-time en production
    • TracePoint, une meilleure API de tracing (pour l'analyse de logs)
  • Améliorations des performances
    • optimisation du ramasse-miettes par "bitmap marking"
    • optimisation de Kernel#require, ce qui permet par exemple à Ruby On Rails de démarrer très rapidement
    • diverses optimisations dans la VM (routage des messages aux méthodes…)
    • optimisation des opérations de calculs sur les flottants (Float)

Par ailleurs, et toujours en mode « expérimental », vous retrouverez dans cette version les Refinements.

Pour prendre connaissance de tous les détails, consultez le fichier NEWS.

Compatibilité

Nous avons pris garde à concevoir la version 2.0.0 de telle façon à ce qu'elle soit compatible avec la 1.9, à quelques détails près (seulement !). Il sera donc plus facile de migrer de la 1.9 à la 2.0 qu'il ne l'avait été pour le passage 1.8 / 1.9. Les incompatibilités principales sont décrites ci-après.

À noter que grâce au travail de nombreux collaborateurs, un certain nombre d'applications telles que Rails ou tDiary sont d'ores et déjà fonctionnelles sur cette version 2.0.0-p0 !

Documentation

Un effort important à également été produit pour améliorer la documentation, ce qui a été une demande régulière de la part de la communauté. Le volume de documentation rdoc pour les modules et les méthodes a ainsi notablement augmenté : 75% de la 2.0.0 est couvert, tandis que la 1.9.3 plafonnait vers les 60%. Par ailleurs, vous pouvez retrouver une description de la syntaxe ruby en appelant:

ri ruby:syntax

Stabilité

Contrairement à la 1.9.0, la version 2.0.0 est une release stable… bien que son numéro micro soit 0. Évidemment, nous incitons tous les mainteneurs de librairies à supporter dès que possible Ruby 2.0.0, ce qui devrait être relativement simple (cf. Compatibilité).

Pour conclure, Ruby 2.0.0 est bel et bien là, prête à vous simplifier une nouvelle fois la vie : adoptez-la !

Notes

Articles

Voici une sélection d'articles parus à l'occasion du lancement de la 2.0.0 :

Les articles suivants sont également intéressants, hormis pour ce qui concerne les Refinements (il y a eu des changements depuis leurs parutions) :

La dernière édition du Rubyist Magazine propose quelques articles très intéressants écrits par les contributeurs des fonctionnalités sur lesquels ils portent :

Ce dernier contenu est malheureusement disponible en japonais uniquement. Nous avons dans l'idée d'en faire des traductions anglaises rapidement.

Incompatibilités

Il y a cinq incompatibilités majeures connues à ce jour, par rapport à la 1.9 :

  • L'encodage par défaut des scripts ruby est désormais UTF-8 [#6679]. Certaines personnes ont mentionné le fait que cela affecte le fonctionnement de programmes existant, par exemple des systèmes de benchmarking qui deviennent très lents [ruby-dev:46547].
  • iconv a finalement été retiré, après avoir été déprécié lors de l'introduction de M17N dans ruby 1.9. Utilisez désormais String#encode et autres.
  • L'ABI (Application Binary Interface) connaît un changement majeur [ruby-core:48984]. A priori, une simple réinstallation des extensions doit faire l'affaire, mais soyez bien attentifs à ne pas copier les fichiers .so ou .bundle depuis une installation 1.9 ("DO NOT COPY .so OR .bundle FILES FROM 1.9"), faute de quoi Ruby ne fonctionnera pas.
  • #lines, #chars, #codepoints et #bytes retournent désormais un Array au lieu d'un Enumerator [#6670]. Cette modification permet d'éviter d'avoir à écrire systématiquement "lines.to_a". Pour retrouver un énumérateur, utilisez #each_line, par exemple.
  • Object#inspect retourne désormais toujours une chaîne de caractères, telle que #<ClassName:0x...>, au lieu de passer la main à #to_s [#2152].

Pour les incompatibilités mineures, voyez [ruby-core:49119].

À propos des Refinements

Nous avons décidé d'intégrer la nouvelle fonctionnalité appelée Refinements dans cette version. Elle étends les possibilité coté modularité des scripts Ruby. Il s'agit toutefois d'une fonctionnalité expérimentale, et sa spécification est susceptible de changer d'ici la prochaine version de Ruby. Néanmoins, nous vous encourageons à la tester, et à nous faire part de vos retours qui nous seront d'une grande aide pour la finaliser.

Remerciements

Un très grand nombre de personnes ont participé à l'élaboration de cette version. Il est rapidement devenu manifeste que même une liste partielle de remerciements serait trop longue à inclure directement dans cette actualité ! Aussi, permettez-moi de vous rediriger vers un lien spécial :

Merci à tous et à toutes !

Persisting changes - chrome dev tools

Sortie de la version 1.9.3-p392 de Ruby

La version 1.9.3-p392 de Ruby est sortie. Nous nous excusons des mises à jour trop fréquentes.

Cette version inclut des correctifs de sécurité pour les bibliothèques intégrées JSON et REXML :

Et d'autres correctifs de bugs mineurs sont également inclus.

Voyez les tickets et le ChangeLog pour plus de détails.

Téléchargement

Vous pouvez télécharger cette nouvelle version depuis :

Commentaire sur cette version

De nombreux commiteurs, testeurs et utilisateurs ayant remonté des bugs ont aidé à préparer cette version. Merci pour leurs contributions.

Vulnérabilité de type Déni de service par expansion des entités dans REXML (bombe XML)

L'expansion d'entités XML sans restriction peut conduire à un déni de service dans REXML. (L'identifiant CVE sera assigné plus tard.) Nous recommandons fortement de mettre à jour Ruby.

Détails

Lors de la lecture de nœuds texte au sein d'un document XML, le parseur REXML peut être forcé à allouer des chaînes de caractères extrêmement larges, ce qui peut consommer toute la mémoire de la machine, entraînant un déni de service.

Le code concerné ressemble à ceci :

document = REXML::Document.new some_xml_doc
document.root.text

Quand la méthode `text` est appelée, les entités sont étendues. Un attaquant peut envoyer un document XML relativement petit qui, lors de cette étape, consommera d'énormes quantités de mémoire sur le système cible.

Veuillez noter que cette attaque est similaire, bien que différente, à celle de l'attaque Billion Laughs. C'est aussi en rapport avec le CVE-2013-1664 de Python.

Tous les utilisateurs d'une version concernée sont incités à mettre à jour Ruby ou utiliser l'un des contournements ci-dessous immédiatement.

Contournements

Si vous ne pouvez pas mettre à jour Ruby, utiliser ce monkey patch comme contournement :

class REXML::Document
  @@entity_expansion_text_limit = 10_240

  def self.entity_expansion_text_limit=( val )
    @@entity_expansion_text_limit = val
  end

  def self.entity_expansion_text_limit
    @@entity_expansion_text_limit
  end
end

class REXML::Text
  def self.unnormalize(string, doctype=nil, filter=nil, illegal=nil)
    sum = 0
    string.gsub( /\r\n?/, "\n" ).gsub( REFERENCE ) {
      s = self.expand($&, doctype, filter)
      if sum + s.bytesize > REXML::Document.entity_expansion_text_limit
        raise "entity expansion has grown too large"
      else
        sum += s.bytesize
      end
      s
    }
  end

  def self.expand(ref, doctype, filter)
    if ref[1] == ?#
      if ref[2] == ?x
        [ref[3...-1].to_i(16)].pack('U*')
      else
        [ref[2...-1].to_i].pack('U*')
      end
    elsif ref == '&amp;'
      '&'
    elsif filter and filter.include?( ref[1...-1] )
      ref
    elsif doctype
      doctype.entity( ref[1...-1] ) or ref
    else
      entity_value = DocType::DEFAULT_ENTITIES[ ref[1...-1] ]
      entity_value ? entity_value.value : ref
    end
  end
end

Ce monkey patch limitera la taille des remplacements d'entités à 10k par nœud. REXML n'autorise déjà que 10000 remplacements d'entités par document (valeur par défaut). Ainsi la quantité maximale de mémoire pour le texte généré par les remplacements d'entités ne sera au maximum que d'environ 98 Mo.

Les versions de Ruby concernées

  • Toutes les versions de Ruby 1.9 antérieures à la version 1.9.3 patchlevel 392
  • Toutes les versions de Ruby 2.0 antérieures à la version 2.0.0 patchlevel 0
  • Toutes les versions trunk avant la révision 39384

Crédits

Merci à Ben Murphy pour avoir remonté cette vulnérabilité.

Historique

  • Publié initialement à 2013-02-22 12:00:00 (UTC)

Déni de service et vulnérabilité de création d’objets non-sûrs (CVE-2013-0269)

Il existe une vulnérabilité dans la bibliothèque JSON embarquée avec Ruby qui peut causer des dénis de service et la création d'objets non-sûrs. Cette vulnérabilité a reçu l'assignation CVE-2013-0269. Nous vous encourageons très fortement à mettre à jour Ruby.

Détails

Lors de l'analyse de certains documents JSON, la gem JSON (inclue avec ruby) peut être forcée à créer des symboles Ruby dans le système cible. Comme les symboles Ruby ne sont pas libérés de la mémoire par le ramasse-miettes, cela peut résulter en une attaque par déni de service.

La même technique peut être utilisée pour créer des objets dans le système cible qui se comporteront comme des objets internes. Ces objets « qui se comportent de façon similaire » peuvent être utilisés pour contourner certains mécanismes de sécurité et servir de tremplin pour des attaques par injection SQL dans Ruby on Rails.

Le code visé ressemble à ceci :

JSON.parse(user_input)

Où la variable `user_input` contient un document JSON comme celui-ci :

{"json_class":"foo"}

La gem JSON va essayer de récupérer la constante "foo" et, ce faisant, va créer un symbole.

Dans la version 1.7.x de JSON, des objets avec des attributs arbitraires peuvent être créés. Cela peut, par exemple, être fait avec un document JSON tel que celui-ci :

{"json_class":"JSON::GenericObject","foo":"bar"}

Ce document sera transformé en une instance de JSON::GenericObject, avec l'attribut "foo" qui aura pour valeur "bar". L'instanciation de tels objets permet la création de symboles arbitraires et, dans certains cas, peut être utilisée pour contourner des mesures de sécurité.

IMPORTANT : ce comportement *ne change pas* avec l'utilisation de `JSON.load`. `JSON.load` ne doit *jamais* être utilisé avec des données provenant de sources inconnues. Si vous traitez des documents JSON provenant d'une source inconnue, utiliser *toujours* `JSON.parse`.

Tous les utilisateurs d'une version de Ruby concernée par ce problème sont encouragés à mettre à jour ou à utiliser un des contournements ci-dessous immédiatement.

Contournements

Pour les utilisateurs pour lesquels une mise à jour de Ruby ou de la gem JSON n'est pas possible, remplacez dans votre code :

JSON.parse(json)

par ceci :

JSON.parse(json, :create_additions => false)

If you cannot change the usage of `JSON.parse` (for example you're using a gem which depends on `JSON.parse` like multi_json), then apply this monkey patch: Si vous ne pouvez modifier l'utilisation de `JSON.parse` (par exemple, si cet appel est fait dans une gem externe comme multi_json), alors appliquez ce monkey patch :

module JSON
  class << self
    alias :old_parse :parse
    def parse(json, args = {})
      args[:create_additions] = false
      old_parse(json, args)
    end
  end
end

Les versions de Ruby concernées

  • Toutes les versions de Ruby 1.9 antérieures à Ruby 1.9.3 patchlevel 392
  • Toutes les versions de Ruby 2.0 antérieures à Ruby 2.0.0 patchlevel 0
  • Toutes les versions trunk avant la révision 39208

Crédits

Un énorme merci va pour les personnes suivantes pour avoir remonté de façon responsable cette vulnérabilité et avoir travaillé avec l'équipe Rails pour la corriger:

  • Thomas Hollstegge of Zweitag (www.zweitag.de)
  • Ben Murphy

Historique

  • Publié originalement à 2013-02-22 12:00:00 (UTC)

Ruby 2.0 : Keyword arguments

Speakers recherchés pour la Barcelona Ruby Conference

La Barcelona Ruby Conference se tiendra en Catalogne les 14 et 15 septembre. De nombreux intervenants connus et reconnus seront présents : Aaron Patterson (contributeur à Rails et Ruby), David Chelimsky (auteur du RSpec book, contributeur à RSpec), Charles Nutter (mainteneur de JRuby), Sandi Metz (auteur de Practical Object-Oriented Design in Ruby) ou encore Yukihiro Matz (le Créateur).

L'appel à communication est lancé : soumissions attendues avant le 10 mars. Les 4 meilleures seront retenues. Chacun des lauréats de ce mini-concours verra son entrée à la conférence et son hébergement offerts et gérés par les organisateurs. Tous les détails sur le site web !

Les Ruby Hero Awards, édition 2013

Un nouvel opus des Ruby Hero Awards débute ! Les nominations sont d'ores et déjà acceptées, et les organisateurs comptent sur vous pour dénicher de nouveaux talents au sein de la communauté… notamment celles et ceux qui n'ont pas encore reçus toute l'attention méritée. Profil typique : une personne qui contribue à l'écosystème open-source Ruby de façon particulièrement utile (au moins selon vous…), un mentor, un organisateur de conférences ou ateliers…

Si vous avez une idée en tête, proposer un nom sur RubyHeroes.com ne vous prendra pas plus d'une minute : indiquez un pseudo github et expliquez en quelques mots les raisons de votre choix. Dans environ un mois, les lauréats des années précédentes se concerteront pour désigner leurs six nouveaux héros, lesquels seront révélés au monde lors de la RailsConf, fin avril.

Sortie de Ruby 2.0.0-rc2

Ruby 2.0.0-rc2 est disponible ! Il s'agit de la dernière release candidate avant la version 2.0.0.

N'hésitez pas à la tester et à rapporter tout problème rencontré.

Téléchargement

Vous pouvez obtenir cette version depuis :

Nouvelles fonctionnalités de Ruby 2.0.0

  • arguments « mots-clé »
  • Enumerable#lazy
  • Module#prepend
  • #to_h: convention pour la conversion vers un Hash
  • %i: un literal pour produire un tableau de symboles (à l'instar de %s pour les chaînes de caractères)
  • Moteur d'expression régulière mis à jour : Onigmo (un fork d'Oniguruma)
  • Enumerator#size et Range#size font leur apparition
  • support de DTrace
  • TracePoint
  • de meilleurs performances pour la directive require (en particulier sous Windows)
  • support de NativeClient
  • amélioration générale de la documentation
  • meilleure gestion des interruptions asynchrones
  • apparition de paramètres pour modifier la taille du stack de démarrage
  • Refinements (expérimental !)

... et bien plus encore. Voir le fichiers NEWS pour tous les détails.

Voici quelques articles sur ces différents sujets récemment publiés :

S'il vous prend l'envie d'écrire un article, prévenez-nous pour qu'il soit cité dans la prochaine actualité.

Notes

Incompatibilités

Il en existe à notre connaissance trois principales :

  • L'encodage par défaut des scripts ruby est désormais UTF-8 [#6679]. Certaines personnes ont mentionné le fait que cela affecte le fonctionnement de programmes existant, par exemple des systèmes de benchmarking qui deviennent très lents [ruby-dev:46547]. La spécification pourrait de ce fait encore évoluer d'ici la release finale.
  • iconv a finalement été retiré, après avoir été déprécié lors de l'introduction de M17N dans ruby 1.9. Utilisez désormais String#encode et autres.
  • L'ABI (Application Binary Interface) connaît un changement majeur [ruby-core:48984]. A priori, une simple réinstallation des extensions doit faire l'affaire, mais soyez bien attentifs à ne pas copier les fichiers .so ou .bundle depuis une installation 1.9 ("DO NOT COPY .so OR .bundle FILES FROM 1.9"), faute de quoi Ruby ne fonctionnera pas.

Il existe par ailleurs quelques incompatibilités mineurs, voir [ruby-core:49119]. Merci de rapporter tout autre problème de ce type d'ici la release.

Bon à savoir : nous avons créé des notes de mise-à-jour, bien qu'une partie d'entre elles soient déjà dépassées.

À propose des Refinements

Ruby 2.0.0 apportera les Refinements en tant que « fonctionnalité expérimentale », faute d'un accord final sur leur spécification.

Notez donc que leur comportement pourrait changer dans les prochaines versions.

Remerciements spéciaux

Merci à tous ceux et celles qui ont testé les preview et release candidates ! Je suis très honoré du travail acharné de tous ces contributeurs pour résoudre les bugs : je vous remercie tous chaleureusement.