Quelques bases pour préparer une indexation dans Elasticsearch

Sortie de Ruby 1.9.3-p429

Ruby 1.9.3-p429 vient de sortir. Le niveau de patch p426 ne date que de quelques heures, mais il causait quelques problèmes de compilation sur certaines plateformes : il est donc recommandé de passer sur la release p429.

Par ailleurs, cette release comporte également un correctif de sécurité concernant DL / Fiddle et quelques corrections de bugs mineurs.

Pour plus de détails, consultez les tickets et le ChangeLog associés.

Téléchargement

À propos de cette release

De nombreux contributeurs, testeurs et utilisateurs m’ont aidé à produire ces correctifs et cette release, en remplissant des rapports de bugs. Je les en remercie.

Sortie de Ruby 2.0.0-p195

Ruby 2.0.0-p195 vient de sortir. Il s’agit du premier niveau de patch pour Ruby 2, depuis la sortie de la version 2.0.0.

Cette release contient un correctif de sécurité pour Ruby DL / Fiddle ainsi que de nombreuses corrections de bugs et des optimisations. On trouvera également quelques corrections sur la documentation.

Pour plus de détails, consultez les tickets et le ChangeLog associés. Les principales corrections de bugs sont listées ci-dessous.

Téléchargement

À propos de cette release

Merci à tous les contributeurs.

Changements importants

Core - prepend

  #7841 Module#prepend now detect cyclic prepend.
  #7843 removing prepended methods causes exceptions.
  #8357 Module#prepend breaks Module's comparison operators.
  #7983 Module#prepend can't override Fixnum's operator methods.
  #8005 methods made private/protected after definition become uncallable on prepended class.
  #8025 Module#included_modules include classes when prepended.

Core - keyword arguments

  #7922 unnamed keyword rest argument cause SyntaxError.
  #7942 support define method only receive keyword arguments without paren.
  #8008 fix a bug in super with keyword arguments.
  #8236 fix a treatment of rest arguments and keyword arguments through `super'.
  #8260 non-symbol key should not treated as keyword arguments.

Core - refinements

  #7925 fix a bug of refinements with a method call super in a block.

Core - GC

  #8092 improve accuracy of GC.stat[:heap_live_num]
  #8146 avoid unnecessary heap growth.
  #8145  fix unlimited memory growth with large values of RUBY_FREE_MIN.

Core - Regexp

  #7972 Regexp POSIX space class is location sensitive.
  #7974 Regexp case-insensitive group doesn't work.
  #8023 Regexp lookbehind assertion fails with /m mode enabled
  #8001 Regexp \Z matches where it shouldn't

Core - other

  #8063 fix a potential memory violation and avoid abort on the environment _FORTIFY_SOURCE=2 (ex. Ubuntu).
  #8175 ARGF#skip doesn't work as documented.
  #8069 File.expand_path('something', '~') now support home path on Windows.
  #8220 fix a Segmentation fault when defined? ().
  #8367 fix a regression in defined?(super).
  #8283 Dir.glob doesn't recurse hidden directories.
  #8165 fix a bug of multiple require with non-ascii file path.
  #8290 fix an incompatible String#inspect behavior with NUL character.
  #8360 fix a Segmentation fault of Thread#join(Float::INFINITY) on some platforms.

RubyGems

  Bundled RubyGems version is updated to 2.0.2+
  #7698 fix an rubygems' incompatibility about installation of extension libraries.
  #8019 fix a bug of gem list --remote doesn't work.

Libraries

  #7911 File.fnmatch with US-ASCII pattern and UTF-8 path raise an exception.
  #8240 fix a bug about OpenSSL::SSL::SSLSocket breaks other connections or files on GC.
  #8183 CGI.unescapeHTML can't decode Numeric Character References with uppercase (&#Xnnnn).

Build/Platform specific

  #7830 fix build failure with compiler warning.
  #7950 fix a build failure on mswin/VC with --with-static-linked-ext.

Vulnérabilité : Object taint bypassing in DL and Fiddle in Ruby (CVE-2013-2065)

Les modules DL et Fiddle de Ruby comportaient une vulnérabilité mettant en œuvre une chaîne de caractère « contaminée » (tainted string, marquée avec la méthode Object#tain). Des appels systèmes pouvaient être fait en utilisant de telles chaînes de caractères, ignorant le niveau $SAFE de Ruby. Cette vulnérabilité porte l’identifiant CVE-2013-2065.

Explications et impact

Les fonctions natives exposées à Ruby via DL ou Fiddle ne vérifiaient pas la valeur du drapeau taint des objets manipulées. Cela pouvait causer des situations où des chaînes de caractères marquées comme contaminées étaient tout de même acceptées comme des données valides pour des exceptions de type SecurityError.

Un exemple de code utilisant DL illustrant cette vulnérabilité :

def my_function(user_input)
  handle    = DL.dlopen(nil)
  sys_cfunc = DL::CFunc.new(handle['system'], DL::TYPE_INT, 'system')
  sys       = DL::Function.new(sys_cfunc, [DL::TYPE_VOIDP])
  sys.call user_input
end

$SAFE = 1
my_function "uname -rs".taint

Un autre exemple, avec Fiddle :

def my_function(user_input)
  handle    = DL.dlopen(nil)
  sys = Fiddle::Function.new(handle['system'],
                          [Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT)
  sys.call user_input
end

$SAFE = 1
my_function "uname -rs".taint

Tous les rubyistes utilisant une version affectée par cette vulnérabilité sont invités à mettre à jour Ruby, ou à utiliser le palliatif décrit ci-après.

Veuillez notez que le correctif n’empêche pas l’utilisation d’offset numériques, car les nombres ne peuvent être marqués par Object#taint. Dans l’exemple suivant :

def my_function(input)
  handle    = DL.dlopen(nil)
  sys = Fiddle::Function.new(handle['system'],
                          [Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT)
  sys.call input
end

$SAFE = 1
user_input = "uname -rs".taint
my_function DL::CPtr[user_input].to_i

l’adresse mémoire est utilisée sans qu’il soit possible de déterminer si elle est valide ou non. Dans ce cas, il est recommandé de vérifier l’état de la donnée en entrée avant de passer l’adresse mémoire :

user_input = "uname -rs".taint
raise if $SAFE >= 1 && user_input.tainted?
my_function DL::CPtr[user_input].to_i

Palliatif

Si vous êtes dans l’impossibilité de mettre à jour Ruby, il est tout de même possible de palier cette vulnérabilité avec le monkey patching suivant :

class Fiddle::Function
  alias :old_call :call
  def call(*args)
    if $SAFE >= 1 && args.any? { |x| x.tainted? }
      raise SecurityError, "tainted parameter not allowed"
    end
    old_call(*args)
  end
end

Versions affectées

  • Toutes les versions de la branche 1.9 avant la 1.9.3-p426
  • Toutes les versions de la branche 2.0 avant la 2.0.0-p195
  • Les versions de développement avant la révision 40728

La branche 1.8 n’est pas concernée.

Remerciements

Merci à Vit Ondruch pour avoir mis en lumière cette vulnérabilité.

Historique

  • Initialement publié le 14 mai 2013 à 13:00:00 (UTC)