Skip to main content

Mehr Sicherheit für Ruby-Gemfiles: Eine Schritt-für-Schritt-Anleitung mit Snyk

Artikel von
Headshot of DeveloperSteve Coochin

DeveloperSteve Coochin

blog feature ruby security

10. August 2021

0 Min. Lesezeit

Ruby ist eine klar definierte und durchdachte Sprache, die es seit Mitte der 1990er-Jahre gibt. 2004 integrierte Ruby RubyGems als Paketmanager. RubyGems dient dazu, Bibliotheken und Abhängigkeiten in einem eigenständigen Format namens Gem zu verwalten. Die Schnittstelle zu RubyGems ist ein Kommandozeilen-Tool, das in die Ruby-Laufzeitumgebung integriert ist und das Hinzufügen oder Aktualisieren von Gemfiles in einem Projekt ermöglicht.

Ich habe drei Ruby-Plattformen untersucht und Schwachstellen gefunden, die selbst mich überrascht haben. Hier erfahren Sie, worauf Sie achten sollten, wenn Sie die Sicherheit Ihrer Ruby-Gemfiles verbessern möchten, und was Sie tun können, falls Sie Schwachstellen entdecken.

Die Rolle der Paketverwaltung

Wie bei anderen Programmiersprachen gibt es auch bei Ruby mehrere Möglichkeiten zur Paketverwaltung. Eine der am weitesten verbreiteten Lösungen für die Anwendungsverwaltung ist Bundler, das zunächst selbst als Ruby-Gem installiert wird.

Ein Paketmanager wie Bundler kann zahlreiche Gems aus einem Gemfile installieren. RubyGems hingegen erfordert die Installation jedes einzelnen Gems mit gem install. Das vereinfacht die Ruby-Paketverwaltung, wenn Sie eine große Menge an Gems in einer Anwendung verwalten oder installieren müssen.

Paketmanager erleichtern die Verwaltung von Bibliotheken und Abhängigkeiten in einer Anwendung zweifellos. Dennoch ist es wichtig, zu wissen, was Sie verwenden und welche Risiken dadurch in Ihrem Stack entstehen können. Mit einem einfachen Sicherheitsscan lassen sich mögliche Probleme schnell erkennen – so sparen Sie später Zeit und Geld und schützen das Vertrauen Ihrer Endnutzer.

Ein Blick auf die Schwachstellen

Bevor wir uns ansehen, was ich beim Scannen von Plattformen gefunden habe, die ich früher verwendet habe, möchte ich auf einige Punkte hinweisen:

  • Als Nutzer und Entwickler dieser Plattformen war ich von meinen Ergebnissen überrascht. Das unterstreicht, wie wichtig es ist, kontinuierlich das Bewusstsein und Wissen für sicheres Entwickeln zu fördern.

  • In allen folgenden Fällen habe ich mich an die jeweiligen Communities gewandt, um die Schwachstellen zu besprechen und sicherzustellen, dass sie davon wussten. Viele hatten allerdings bereits Korrekturen bereitgestellt.

Spree Commerce

Spree ist eine der verbreiteteren E-Commerce-Plattformen im Ruby-Ökosystem. Sie war schon immer eine meiner bevorzugten Open-Source-Lösungen für E-Commerce. Spree gibt es seit 2007 und wird von einer großen Community aus Entwicklern und Unternehmen unterstützt.

Der erste Schritt beim Scannen besteht darin, ein Gemfile.lock-Manifest zu erstellen, das sich mit dem Snyk-CLI-Tool scannen lässt. Nachdem Sie das Spree-Repository geklont und Bundle install ausgeführt haben, wird die Lockdatei erstellt. Sie enthält die erforderlichen Bibliotheken und Abhängigkeiten aus dem Gemfile-Manifest des Projekts.

Ein Tipp für OSX- und Brew-Nutzer mit installiertem MariaDB: Bei der Installation des MySQL2-Gems kann während des Bundler-Installationsprozesses ein Fehler auftreten. Ich musste zuerst brew install openssl ausführen und den Pfad mit export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/opt/openssl/lib/ festlegen.

Sobald die Lockdatei erstellt ist, führen Sie [snyk test](https://snyk.io/blog/snyk-cli-cheat-sheet/) aus. Bei mir wurden die folgenden mittelschweren Schwachstellen gefunden:

Tested 142 dependencies for known issues, found 2 issues, 84 vulnerable paths.

Issues with no direct upgrade or patch:
  ✗ Information Exposure [Medium Severity][https://snyk.io/vuln/SNYK-RUBY-ACTIONCABLE-20338] in actioncable@6.1.4
    introduced by spree@4.3.0.alpha > spree_core@4.3.0.alpha > active_storage_validations@0.9.5 > rails@6.1.4 > actioncable@6.1.4 and 1 other path(s)
  No upgrade or patch available
  ✗ Web Cache Poisoning [Medium Severity][https://snyk.io/vuln/SNYK-RUBY-RACK-1061917] in rack@2.2.3
    introduced by actionpack@6.1.4 > rack@2.2.3 and 81 other path(s)
  No upgrade or patch available

Der obige Scan hat zwei Probleme mit mittlerem Schweregrad erkannt.

Offenlegung von Informationen wird über eine indirekte Abhängigkeit durch ein Gem namens alpha mit spree_core eingeführt. Wie der Name schon andeutet, kann dies dazu führen, dass Daten remote von der Kernplattform abgerufen werden.

Web-Cache-Poisoning ist die weitere erkannte Schwachstelle. Sie wird über eine indirekte Abhängigkeit mit einem Gem namens actionpack eingebunden. Dadurch kann ein Angreifer den Server-Cache dazu bringen, auf gültige Anfragen mit schädlichen Antworten zu reagieren. Weitere Informationen finden Sie in diesem Beitrag zu Cache-Poisoning.

Sinatra

Sinatra ist ein schlanker, portabler Webserver. Er gehört nicht nur zu meinen Favoriten für Demos und kleine Anwendungen, sondern ermöglicht es auch, Apps besonders schnell und einfach zum Laufen zu bringen. Mit bislang über 160 Millionen Downloads wird Sinatra für zahlreiche Projekte eingesetzt.

Diesmal habe ich Bundler verwendet, um mit bundle init in einem neuen Verzeichnis ein leeres Gemfile zu erstellen. Anschließend habe ich die Gem-Datei bearbeitet und am Ende gem 'sinatra' hinzugefügt. Außerdem habe ich ein Gem namens erubis hinzugefügt, ein häufig verwendetes HTML-Template-Gem, das eine schnelle Frontend-Entwicklung ermöglicht und gut zu Sinatra passt.

# frozen_string_literal: true

source "https://rubygems.org"

gem 'sinatra'
gem 'erubis'

Sobald das Gemfile gespeichert ist, installieren Sie alle erforderlichen Gem-Abhängigkeiten mit bundler install. Nach wenigen Sekunden erstellt der Paketmanager ein Gemfile.lock-Manifest, und der Sicherheitsscan kann beginnen. Mein Scan ergab Folgendes:

Tested 7 dependencies for known issues, found 2 issues, 3 vulnerable paths.

Issues with no direct upgrade or patch:
  ✗ Cross-site Scripting (XSS) [Medium Severity][https://snyk.io/vuln/SNYK-RUBY-ERUBIS-20482] in erubis@2.7.0
    introduced by erubis@2.7.0
  No upgrade or patch available
  ✗ Web Cache Poisoning [Medium Severity][https://snyk.io/vuln/SNYK-RUBY-RACK-1061917] in rack@2.2.3
    introduced by sinatra@2.1.0 > rack@2.2.3 and 1 other path(s)
  No upgrade or patch available

Die Schwachstelle im erubis-Gem (CWE-79) habe ich genauer untersucht. Die Dokumentation enthält eine falsche Escaping-Methode, durch die die Anwendung für einen XSS-Angriff anfällig werden kann. In der erubis-Dokumentation verwenden viele Beispiele <%= expr %>, wodurch gespeicherte Template-Variablen nicht escaped werden. Um korrekt zu escapen und sicherzustellen, dass gespeicherte HTML-Elemente nicht in Templates ausgegeben werden, müssen sie wie folgt escaped werden: <%== expr %>.

Als Entwickler ist es wichtig, nicht nur auf Code-Ebene nach Schwachstellen zu suchen, sondern auch die Bedrohung im Rahmen der erforderlichen Sorgfalt für sichere Entwicklung zu verstehen.

Ruby on Rails

Rails gehört zu den am weitesten verbreiteten Gems im Ruby-Ökosystem. Mit insgesamt über 293 Millionen Downloads von RubyGems ist es eine naheliegende und beliebte Wahl für die Entwicklung von Webanwendungen.

Bei der sorgfältigen Prüfung der Snyk Vulnerability Database habe ich mehrere Versionen gefunden, bei denen Vorsicht geboten ist. Die aktuelle Version (zum Zeitpunkt der Erstellung dieses Beitrags 6.1.4) weist jedoch keine bekannten Schwachstellen auf.

Führen Sie gem install rails aus und erstellen Sie anschließend mit rails new myapp ein leeres Rails-Projekt. Dadurch wird ein neues, leeres Rails-Template erstellt, auf dessen Grundlage Sie eine App entwickeln können. Nachdem die Bibliotheken und Abhängigkeiten eingerichtet waren, habe ich mit [snyk test](https://snyk.io/blog/snyk-cli-cheat-sheet/) einen Sicherheitsscan durchgeführt. Dabei wurden die folgenden Schwachstellen im Paketmanifest erkannt.

Tested 72 dependencies for known issues, found 2 issues, 36 vulnerable paths.

Issues with no direct upgrade or patch:
  ✗ Information Exposure [Medium Severity][https://snyk.io/vuln/SNYK-RUBY-ACTIONCABLE-20338] in actioncable@6.1.4
    introduced by rails@6.1.4 > actioncable@6.1.4
  No upgrade or patch available
  ✗ Web Cache Poisoning [Medium Severity][https://snyk.io/vuln/SNYK-RUBY-RACK-1061917] in rack@2.2.3
    introduced by capybara@3.35.3 > rack@2.2.3 and 34 other path(s)
  No upgrade or patch available

Bei näherer Untersuchung sehe ich, dass das Action-Cable-Gem, eine Abhängigkeit von Rails, einen Hinweis auf eine mögliche Offenlegung von Informationen enthält. Dieses Problem scheint 2016 erkannt worden zu sein; eine behobene Version der Kernbibliothek gibt es jedoch nicht. Bei einer genaueren Prüfung des PRs, der in der Snyk Vulnerability Database aufgeführt ist, habe ich eine codebasierte Behelfslösung gefunden, die das Problem eindämmt. Sie wurde 2019 vorgeschlagen.

Das andere Problem wird durch das Rack-Gem eingeführt und betrifft erneut Web-Cache-Poisoning – wie beim oben beschriebenen Problem mit Spree Commerce.

Unterstützen Sie Communities durch eigene Beiträge

Ich arbeite immer gern direkt mit Code, insbesondere wenn es darum geht, erkannte Schwachstellen genauer zu untersuchen und sie nach entsprechender Recherche auf Code-Ebene zu verstehen.

Ein Scan dauert nur wenige Augenblicke und zeigt, ob die von Ihnen verwendeten Bibliotheken, der Code oder die Plattformen bekannte Schwachstellen aufweisen. Das kann Zeit sparen und Endnutzer schützen. Entwickler, Teams oder Unternehmen, die diese Plattformen unwissentlich in der Produktion einsetzen, sind sich möglicherweise nicht bewusst, was genau sie sich ins Haus holen. Ich hoffe, dieser Blog hilft einigen Teams, sicher zu bleiben.

Denken Sie auch daran, dass diese Communities großartige Arbeit leisten, indem sie Bibliotheken entwickeln, die wir alle nutzen können. Deshalb ist es wichtig, etwas zurückzugeben, wo immer Sie können. Schon Hilfe bei der Dokumentation oder beim Testen eines Release Candidates kann viel bewirken. Ich bin nur ein Entwickler, und dies ist nur ein Blogbeitrag. Damit wir wirklich viel für die Sicherheit erreichen, möchte ich Sie alle ermutigen, Projekte selbst zu testen und an den Korrekturen mitzuwirken.

Starten Sie mit Capture the Flag

Erfahren Sie in unserem virtuellen On-Demand-Workshop für Einsteiger, wie Sie Capture-the-Flag-Herausforderungen lösen.