No commit activity in last 3 years
No release in over 3 years
There's a lot of open issues
Mitigates the BREACH and CRIME attacks on TLS in Rails applications
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

~> 1.3
>= 0
>= 0

Runtime

 Project Readme

breach-mitigation-rails

Makes Rails 3 and 4 applications less susceptible to the BREACH / CRIME attacks. See breachattack.com for details.

How it works

This gem implements two of the suggestion mitigation strategies from the paper:

Masking Secrets: The Rails CSRF token is 'masked' by encrypting it with a 32-byte one-time pad, and the pad and encrypted token are returned to the browser, instead of the "real" CSRF token. This only protects the CSRF token from an attacker; it does not protect other data on your pages (see the paper for details on this).

Length Hiding: The BreachMitigation::LengthHiding middleware appends an HTML comment up to 2k in length to the end of all HTML documents served by your app. As noted in the paper, this does not prevent plaintext recovery, but it can slow the attack and it's relatively inexpensive to implement. Unlike the CSRF token masking, length hiding protects the entire page body from recovery.

Warning!

BREACH and CRIME are complicated and wide-ranging attacks, and this gem offers only partial protection for Rails applications. If you're concerned about the security of your web app, you should review the BREACH paper and look for other, application-specific things you can do to prevent or mitigate this class of attacks.

Installation

Add this line to your Rails Gemfile:

gem 'breach-mitigation-rails'

And then execute:

$ bundle

The length-hiding can be disabled by doing:

Rails.application.config.exclude_breach_length_hiding = true

For most Rails apps, that should be enough, but read on for the gory details...

Gotchas

  • The length-hiding middleware adds random text (in the form of an HTML comment) to every page you serve. This can break HTTP caching / ETags for public pages since they are no longer identical on each request.
  • The length-hiding middleware adds up to 2k of text to each page you serve, which means more bandwidth consumed and potentially slower performance.
  • If you have overridden the verified_request? method in your application (likely in ApplicationController) you may need to update it to be compatible with the secret masking code. See lib/breach_mitigation/railtie.rb for an example.

Contributing

Pull requests are welcome, either to enhance the existing mitigation strategies or to add new ways to mitigate against the attack.