Die Rails Entwickler haben wohl beim 2.3.6er Release ein wenig daneben gegriffen, als sie die “HTML Sicherheitsfeatures” gegen XSS Attacken aus Rails 3 zurückportiert haben. “Einige” sicherheitskritische Fehler sind in dem soeben erschienen 2.3.7er Release nun beseitigt.
Habe gerade nach langer, langer Zeit mal wieder etwas auf Ruby-Lang im deutschen Bereich nachgezogen. Diesmal geht es um einen Fehler im WEBrick, welcher dazu führt, dass bestimmte Escapesequenzen von entfernten Angreifern mittels der WEBrick Logdatei, auf eurem lokalen Terminalemulator ausgeführt werden können.
Das Ganze sieht dann in etwa so aus:
Es ist also möglich den Titeltext einer Terminalemulation zu ändern. Weltungergang!!! Naja vielleicht auch nicht. Es gibt jedoch auch verschiedene andere Angriffszscenarien.
Heute Morgen ist die Version 2.3.4 von Rails erschienen. Das Interessante an diesem Release ist die Geschichte hinter dem XSS Vulnerability Patch. Brian Mastenbrook hatte vor einiger Zeit einen Fehler in Twitter und Basecamp entdeckt. Durch diesen konnte er JavaScript in beiden Seiten einschleusen und dadurch Cross Site Scripting durchführen. Bei der Meldung dieses Fehlers stieß Brian jedoch auf erhebliche Probleme bei der Kommunikation mit 37Signals, die Ihn zu der Empfehlung führten, dass man in Zukunft lieber keine Daten mehr bei 37Signals speichern sollte.
Ruby 1.9.2 ist draußen und bringt ausser den in den News angekündigten Änderungen noch eine größere Überraschung mit.
Aufgrund eines potentiellen Sicherheitsproblems ist das Verzeichnis . nicht mehr standardmässig in $LOAD_PATH. Das bedeutet:
[ skade HIPE-Machine ~/Downloads/ruby-1.9.2-preview1 ] ls test.rb
test.rb
[ skade HIPE-Machine ~/Downloads/ruby-1.9.2-preview1 ] ./ruby --version
ruby 1.9.2dev (2009-07-18 trunk 24186) [i386-darwin9.7.0]
[ skade HIPE-Machine ~/Downloads/ruby-1.9.2-preview1 ] ./ruby -e "require 'test'"
-e:1:in `require': no such file to load -- test (LoadError)
from -e:1:in `'
Der Fix dafür ist einfach und in einer single-user-Umgebung unbedenklich: entweder ihr gebt jedem Aufruf von Ruby -I. mit oder ihr setzt RUBYLIB=".".
Öhm…die neueste Version von Rails ist da ^^ Schon wieder…diesmal mit HTML-Escaping für JSON.
(nur zur Sicherheit:)
Aus aktuellem Anlass eine Nachbesserung im Verhalten von require:
require 'open-uri' module Kernel alias_method :require_old, :require def require params if params =~ /\A(ftp|http[s]?)/ eval open(params).read else require_old params end end end
Hier zum Test:
require 'http://www.ruby-mine.de/assets/2007/5/10/remote_1.rb' #=> i'm far away
Vergiss nicht:
require 'cgi' cgi = CGI.new for name, value in cgi.params eval("#{name}=#{value}") end
Update: Man hat mal wieder das readline-Paket vergessen ^^ Also: Neue Version. Windows-User können sich freuen, denn seit Samstag (nach einem halben Jahr ohne Update) steht die finale Version des neuen One-Click-Installers (which you have to double-click afterwards™) zum Download bereit.
Nippon, we have a problem.
RUBY_PATCHLEVEL.Ich möchte versuchen, Licht ins Dunkel zu bringen.
Folgende Änderungen unterscheiden Ruby 1.8.5-ps (2006-12-04) von Ruby 1.8.5 (2006-08-29):
ChangeLogMon Dec 4 10:22:26 2006 URABE Shyouhei* stable version 1.8.5-p2 relased. Sun Dec 3 17:11:12 2006 Shugo Maeda * lib/cgi.rb (CGI::QueryExtension::read_multipart): should quote boundary. JVN#84798830 Sun Nov 26 16:36:46 2006 URABE Shyouhei * version.h: addition of RUBY_PATCHLEVEL. * version.c: ditto. Sat Sep 23 21:34:15 2006 Yukihiro Matsumoto * lib/cgi.rb (CGI::QueryExtension::read_multipart): CGI content may be empty. a patch from Jamis Buck .
Jetzt sehen wir auch mal, wer die Lücke gefunden hat: Danke, Jamis!
lib/cgi.rb@@ -967,6 +967,7 @@ def read_multipart(boundary, content_length) params = Hash.new([]) boundary = "--" + boundary + quoted_boundary = Regexp.quote(boundary, "n") buf = "" bufsize = 10 * 1024 boundary_end="" @@ -998,7 +999,7 @@ end body.binmode if defined? body.binmode - until head and /#{boundary}(?:#{EOL}|--)/n.match(buf) + until head and /#{quoted_boundary}(?:#{EOL}|--)/n.match(buf) if (not head) and /#{EOL}#{EOL}/n.match(buf) buf = buf.sub(/\\\\A((?:.|\\\\n)*?#{EOL})#{EOL}/n) do @@ -1018,14 +1019,14 @@ else stdinput.read(content_length) end - if c.nil? + if c.nil? || c.empty? raise EOFError, "bad content body" end buf.concat(c) content_length -= c.size end - buf = buf.sub(/\\\\A((?:.|\\\\n)*?)(?:[\\\\r\\\\n]{1,2})?#{boundary}([\\\\r\\\\n]{1,2}|--)/n) do + buf = buf.sub(/\\\\A((?:.|\\\\n)*?)(?:[\\\\r\\\\n]{1,2})?#{quoted_boundary}([\\\\r\\\\n]{1,2}|--)/n) do body.print $1 if "--" == $2 content_length = -1
Hier stecken also die eigentlichen Fehler.
stdinput.read gab einen leeren String zurück anstatt nil, wenn das Ende des Inputs erreicht war.
Dadurch entstand eine Endlosschleife. Auslösen konnte man das einfach, indem man eine Multipart-Form an cgi.rb schickt,
die nicht mit dem erwarteten Zeichen endet.boundary wurde nicht maskiert. Wenn man boundary auf (?!) oder so etwas setzt, wird es nie gefunden.
Oder man fügt einer dieser "Milliarden Jahre Rechenzeit"-Regexps ein.Ich weiß leider nicht, wer die zweite Lücke gefunden hat.
Bleibt noch das neue Patchlevel:
version.c und version.h
const int ruby_patchlevel = RUBY_PATCHLEVEL;
...
rb_define_global_const("RUBY_PATCHLEVEL", INT2FIX(RUBY_PATCHLEVEL));
...
#define RUBY_PATCHLEVEL 2
...
RUBY_EXTERN const int ruby_patchlevel;
Die Diskussion um die Einführung des Patchlevels und eines neuen CVS-Branches (er schient jetzt ruby_1_8_5 zu heißen) findet ihr im Archiv.
Baut folgende Prüfung ein, wenn eure Skripte cgi.rb benutzen (soweit ich weiß, tun das unter anderem alle Rails-Applikationen; laut Jeremy Kemper ist Rails aber nicht betroffen, wenn man im production-Mode unter FastCGI arbeitet.)
if not defined? RUBY_PATCHLEVEL or (RUBY_VERSION <= '1.8.5' and RUBY_PATCHLEVEL < 2) raise SecurityError, 'Please use Ruby 1.8.5-p2 or later!' end
Based on how the cgi.rb file is coded it's most likely that there will be more of these kinds of defects in the future.(Zed A .Shaw, der Mongrel-Typ) [Edit: Prüfungscode für Ruby 1.9 angepasst (Patchlevel natürlich nur für bereits veröffentlichte Versionen.)]
Murphy alias Kornelius Kalnbach hat im Rahmen des Seminars Der Fehler im System einen Vortrag mit dem Titel “Rails und Sicherheit im Web” gehalten. Die schriftliche Ausarbeitung dazu stellt er nun im Netz zur Verfügung.
Auf lockere Art und Weise versucht er dem Leser die Problematiken und Lösungen näher zu bringen. Unterstützt wird das ganze durch die Beispielapplikation “Monty-Python-Fanshop”.
Themenübersicht:
Im Besonderen werden folgende technische Aspekte behandelt:
Alle Dokumente (Folien zum Vortrag, Monty-Python-Fanshop, Bilder und TeX-Quellen sowie natürlich die Ausarbeitung) stehen auf