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 (inclus 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)