Skip to main content

Improper dependency pinning

Need

Ensure proper dependency management and version control

Context

  • Usage of Ruby 2.5.0 as the programming language for development
  • Usage of Rails framework for building web applications
  • Usage of pg for connecting and interacting with PostgreSQL databases
  • Usage of Puma for high-performance Ruby web applications
  • Usage of sass-rails for integrating Sass with the Rails asset pipeline
  • Usage of Uglifier for minifying JavaScript code
  • Usage of coffee-rails for integrating CoffeeScript with Rails
  • Usage of Turbolinks for faster navigation and page rendering in web applications
  • Usage of jbuilder for building JSON responses in a structured and efficient manner
  • Usage of Redis for in-memory data storage and caching
  • Usage of bcrypt for password hashing and encryption
  • Usage of image_processing for image manipulation and processing
  • Usage of bootsnap for faster Ruby application boot times

Description

Non compliant code

# Gemfile
source 'https://rubygems.org'

gem 'rails', '5.2.3'
gem 'pg'
gem 'puma'
gem 'sass-rails'
gem 'uglifier'
gem 'coffee-rails'
gem 'turbolinks'
gem 'jbuilder'
gem 'redis'
gem 'bcrypt'
gem 'image_processing'
gem 'bootsnap'

The above Gemfile contains a list of dependencies that the Ruby on Rails application requires. However, it does not explicitly specify the versions for all its dependencies.

For instance, while the version for rails is specified as 5.2.3, the versions for other dependencies like pg, puma, sass-rails, uglifier, coffee-rails, turbolinks, jbuilder, redis, bcrypt, image_processing, and bootsnap are not specified.

This is an example of improper dependency pinning. Without explicit versioning, the application could potentially fetch and use the latest versions of these gems, which might introduce breaking changes, security vulnerabilities, or other unexpected behavior.

Moreover, this lack of version specificity also applies to the dependencies of these gems (i.e., indirect dependencies). The versions of these indirect dependencies are also not pinned, leading to the same potential problems.

In a worst-case scenario, an attacker could potentially release a malicious version of one of these gems, and applications without proper version pinning could automatically start using the malicious version, leading to a serious security breach.

Steps

  • Identify all the direct and indirect dependencies of the application.
  • Determine the specific versions of each dependency that the application requires.
  • Update the Gemfile to explicitly specify the versions of each dependency.
  • Regularly review and update the Gemfile to ensure that the dependency versions are up to date and secure.
  • Consider using a dependency management tool like Bundler to manage and track the dependencies of the application.
  • Regularly monitor for security advisories and updates for the dependencies used in the application.
  • Perform regular security audits and vulnerability scans to identify any potential vulnerabilities in the application's dependencies.

Compliant code

# Gemfile
source 'https://rubygems.org'

gem 'rails', '5.2.3'
gem 'pg', '1.2.3'
gem 'puma', '4.3.5'
gem 'sass-rails', '6.0.0'
gem 'uglifier', '4.2.0'
gem 'coffee-rails', '5.0.0'
gem 'turbolinks', '5.2.1'
gem 'jbuilder', '2.10.1'
gem 'redis', '4.2.5'
gem 'bcrypt', '3.1.13'
gem 'image_processing', '1.11.0'
gem 'bootsnap', '1.7.2'

The updated Gemfile now includes explicit versions for each gem dependency. This ensures that the application will always use the specified versions, preventing potential issues caused by unexpected updates or changes in the dependencies.

The versions specified are just examples, you should replace them with the versions that your application requires.

It's important to regularly review and update these versions to ensure that they are up to date and secure. This can be done manually or by using a dependency management tool like Bundler.

Additionally, you should regularly monitor for security advisories and updates for the dependencies used in the application. This can help you identify and address potential vulnerabilities in a timely manner.

Finally, consider performing regular security audits and vulnerability scans to identify any potential vulnerabilities in the application's dependencies. This can help you ensure that your application remains secure and reliable.

References