Skip to main content

Mejora la seguridad de tu Gemfile de Ruby: guía paso a paso con Snyk

Escrito por
Headshot of DeveloperSteve Coochin

DeveloperSteve Coochin

blog feature ruby security

10 de agosto de 2021

0 minutos de lectura

Ruby es un lenguaje bien definido y cuidadosamente diseñado que existe desde mediados de la década de 1990. En 2004, Ruby incorporó RubyGems como administrador de paquetes. RubyGems se usa para administrar bibliotecas y dependencias en un formato independiente conocido como gem. La interfaz de RubyGems es una herramienta de línea de comandos que se integra con el entorno de ejecución de Ruby y permite agregar o actualizar archivos Gemfile en un proyecto.

Analicé tres plataformas de Ruby y encontré vulnerabilidades que me sorprendieron, incluso a mí. Esto es lo que debes buscar para mejorar la seguridad de tu Gemfile de Ruby y qué hacer si encuentras vulnerabilidades.

La función de la administración de paquetes

Al igual que otros lenguajes, Ruby ofrece algunas opciones de administración de paquetes. Una de las más usadas para administrar aplicaciones es Bundler, que, de hecho, se instala inicialmente como una gem de Ruby.

Un administrador de paquetes como Bundler puede instalar muchas gems desde un Gemfile, mientras que RubyGems requiere instalarlas una por una con gem install. Esto agiliza la administración de paquetes de Ruby cuando tienes que mantener o instalar un conjunto grande de gems en una aplicación.

Sin duda, los administradores de paquetes facilitan el mantenimiento de bibliotecas y dependencias en una aplicación. Sin embargo, es importante saber qué estás usando y qué riesgos pueden surgir en tu stack. Algo tan sencillo como un análisis de seguridad puede hacerse rápidamente para identificar posibles problemas y ahorrar tiempo y dinero, además de proteger la confianza de tus usuarios finales.

Un vistazo a las vulnerabilidades

Antes de profundizar en lo que encontré al analizar plataformas que usé en el pasado, quiero señalar algunas cosas:

  • Como usuario y desarrollador de estas plataformas, me sorprendieron los resultados. Esto refuerza la idea de que crear conciencia y promover la educación de manera continua es fundamental para desarrollar de forma segura.

  • En todos los casos que se indican a continuación, me comuniqué con las comunidades correspondientes para hablar sobre las vulnerabilidades y asegurarme de que conocieran los problemas, aunque muchas ya tenían soluciones.

Spree Commerce

Spree es una de las plataformas de comercio electrónico más usadas en el ecosistema de Ruby. Siempre ha sido una de mis opciones de código abierto favoritas para el comercio electrónico. Spree existe desde 2007 y cuenta con una gran comunidad de desarrolladores y empresas que ayudan a mantenerla.

El primer paso del análisis es crear un manifiesto Gemfile.lock que se pueda analizar con la herramienta Snyk CLI. Después de clonar el repositorio de Spree y ejecutar Bundle install, se crea el archivo de bloqueo con las bibliotecas y dependencias requeridas del Gemfile del proyecto.

Un consejo para quienes usan OSX y brew y tienen MariaDB instalado: la instalación de la gem MySQL2 puede generar un error durante el proceso de instalación de Bundler. Primero tuve que ejecutar brew install openssl y configurar la ruta con export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/opt/openssl/lib/

Una vez creado el archivo de bloqueo, ejecuta [snyk test](https://snyk.io/blog/snyk-cli-cheat-sheet/). En mi caso, se encontraron las siguientes vulnerabilidades de gravedad media:

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

El análisis anterior identificó dos problemas de gravedad media.

Exposición de información se introduce a través de una dependencia indirecta, una gem llamada alpha, con spree_core. Como su nombre indica, puede permitir que se recuperen datos de forma remota desde la plataforma central.

La otra vulnerabilidad identificada es envenenamiento de la caché web, que se introduce mediante una dependencia indirecta, una gem llamada actionpack. Básicamente, permite que un atacante engañe a la caché del servidor para que genere respuestas maliciosas a solicitudes válidas. Consulta esta publicación sobre el envenenamiento de caché para obtener más información.

Sinatra

Sinatra es un servidor web ligero y portátil. No solo es uno de mis favoritos para demostraciones y aplicaciones pequeñas, sino que también permite poner aplicaciones en marcha de forma rápida y sencilla. Con más de 160 millones de descargas hasta la fecha, se usa ampliamente en una gran variedad de proyectos.

Esta vez, usé Bundler para ejecutar bundle init en un directorio nuevo y crear un Gemfile vacío. Luego edité el archivo de gem para agregar gem 'sinatra' al final. También agregué una gem llamada erubis, que es una gem de plantillas HTML de uso común que permite desarrollar el frontend con rapidez (y combina muy bien con Sinatra).

# frozen_string_literal: true

source "https://rubygems.org"

gem 'sinatra'
gem 'erubis'

Una vez guardado el Gemfile, instala todas las dependencias de gem necesarias ejecutando bundler install. Después de unos segundos, el administrador de paquetes creará un manifiesto Gemfile.lock y estará listo para el análisis de seguridad. Esto fue lo que encontré:

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

Analicé en detalle la vulnerabilidad de la gem erubis (CWE-79). La documentación incluye un método de escape incorrecto que podría exponer la aplicación a un ataque XSS. En la documentación de erubis, muchos ejemplos usan <%= expr %>, que no escapa las variables almacenadas en plantillas. Para escapar correctamente y evitar que los elementos HTML almacenados se incluyan en las plantillas, deben escaparse así: <%== expr %>.

Como desarrollador, es importante analizar no solo el código en busca de vulnerabilidades, sino también comprender las amenazas como parte de la debida diligencia en seguridad durante el desarrollo.

Ruby on Rails

Rails es una de las gems más usadas en todo el ecosistema de Ruby. Con más de 293 millones de descargas totales desde RubyGems, es una opción evidente y popular para desarrollar aplicaciones web.

Como parte de la debida diligencia, consulté la Snyk Vulnerability Database y vi que había varias versiones que convenía evitar. Sin embargo, la versión actual (6.1.4 al momento de escribir esto) no tiene vulnerabilidades conocidas.

Ejecuta gem install rails_,_y luego crea un proyecto de Rails vacío con rails new myapp. Esto crea una plantilla nueva y vacía de Rails sobre la que puedes desarrollar una aplicación. Una vez configuradas las bibliotecas y dependencias, realicé un análisis de seguridad con [snyk test](https://snyk.io/blog/snyk-cli-cheat-sheet/). El análisis detectó las siguientes vulnerabilidades en el manifiesto del paquete.

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

Al investigar un poco más, vi que la gem Action Cable, una dependencia de Rails, tiene una alerta por posible exposición de información. Este problema parece haberse identificado en 2016 y no se ha publicado una solución en la biblioteca central del framework. Tras revisar con más detalle la solicitud de cambios que aparece en la Snyk Vulnerability Database, encontré una alternativa a nivel de código que mitiga el problema. Se propuso en 2019.

El otro problema se introduce mediante la gem Rack y también se relaciona con el envenenamiento de la caché web, igual que el problema de Spree Commerce mencionado antes.

Apoya a las comunidades con tus contribuciones

Siempre me encanta trabajar directamente con el código, sobre todo investigar las vulnerabilidades detectadas y comprenderlas a nivel de código.

Solo toma unos momentos analizar las bibliotecas, el código o las plataformas que usas para comprobar si tienen vulnerabilidades conocidas. Esto puede ahorrarte tiempo y proteger a los usuarios finales. Los desarrolladores, equipos o empresas que usan estas plataformas en producción podrían no saber qué están incorporando. Espero que este blog ayude a algunos equipos a mantenerse seguros.

Recuerda también que estas comunidades hacen un trabajo increíble al crear bibliotecas para que todos podamos usarlas, así que es importante contribuir cuando puedas. Incluso ayudar con la documentación o probar una versión candidata puede marcar la diferencia. Soy un solo desarrollador y este es un solo blog. Para lograr un impacto importante en la seguridad, te animo a probar los proyectos por tu cuenta y contribuir a las correcciones.

Comienza con Capture the Flag

Aprende a resolver desafíos de Capture the Flag con nuestro taller virtual 101 a pedido.

Leer más

Blog

Los modelos de frontera encontraron las vulnerabilidades. Solo el atacante encontró las cadenas.

El análisis estático encontró las fallas, pero solo las pruebas de ataque en vivo demostraron cómo podían encadenarse para provocar brechas. Una comparación de Evo COS, Claude Security y Claude Code Security.

feature insights context
Blog

Los ataques autónomos ya están aquí. La defensa debe estar a su altura.

Los atacantes autónomos están reduciendo el tiempo disponible para defenderse. Descubre cómo el descubrimiento, la corrección, la validación y la prevención continuos pueden ayudar a los equipos de seguridad a seguirles el ritmo.

Blog

Por qué los agentes de programación con IA siguen generando fallas de control de acceso

Los agentes de programación con IA pueden generar lógica de autorización que compila y supera la revisión, pero expone los datos de un inquilino a otro. Descubre por qué es difícil detectar el control de acceso roto y cómo prevenirlo.