Ruby on Rails est impacté par une vulnérabilité d’attaque DoS qui affecte l’adaptateur Postgresql d’ActiveRecord. Cette vulnérabilité est enregistrée dans la base CVE sous l’identifiant CVE-2021-22880.
- Versions de Ruby on Rails affectées : >= 4.2.0
- Versions non affectées : < 4.2.0
- Versions corrigées : 6.1.2.1, 6.0.3.5, 5.2.4.5
Risque de sécurité
Si un champ d’une base de se données Postgresql du type money
reçoit une valeur spécifiquement construite pour déclencher la faille de sécurité, l’adaptateur ActiveRecord passera beaucoup trop de temps à traiter une expression régulière, résultant en une possible attaque Dos.
Cette faille impacte uniquement les applications qui utilisent Postgresql avec une colonne du type money
et qui accepte les valeurs fournies par des utilisateurs.
Versions de Rails contenant le correctif
Les versions de Rails inférieures à la version 4.2.0 ne sont pas affectées.
Concernant les versions 5, il suffit de mettre à jour vers une version égale ou supérieure à la version 5.2.4.5. Pour la version 6.0, il faut mettre à jour vers la version 6.0.3.5 ou supérieure. Pour la version 6.1, il faut mettre à jour vers la version 6.1.2.1 ou supérieure.
Installer un correctif manuellement avec un Monkey patch
Pour les applications affectées mais qui ne peuvent pas être mises à jour vers une version de Rails contenant le correctif, il est possible d’appliquer un monkey patch dans un fichier initializer :
module ActiveRecord
module ConnectionAdapters
module PostgreSQL
module OID # :nodoc:
class Money < Type::Decimal # :nodoc:
def cast_value(value)
return value unless ::String === value
value = value.sub(/^\((.+)\)$/, '-\1') # (4)
case value
when /^-?\D*+[\d,]+\.\d{2}$/ # (1)
value.gsub!(/[^-\d.]/, "")
when /^-?\D*+[\d.]+,\d{2}$/ # (2)
value.gsub!(/[^-\d,]/, "").sub!(/,/, ".")
end
super(value)
end
end
end
end
end
end
Patcher son application
Pour aider les utilisateurs qui ne pourraient pas mettre à jour leur version de rails, et ne souhaiteraient pas utiliser le monkey patch décrit au chapitre précédent, il existe 2 patchs au format git-am.
Ces patchs sont hébergés par discuss.rubyonrails.org. Vous devriez en vérifier la provenance avant de l’appliquer à votre code source :
À noter que seules les versions 5.2, 6.0, et 6.1 peuvent être corrigées par ces patchs. Il est conseillé aux utilisateurs de versions plus anciennes de faire la mise à jour dans les lus brefs délais.
Credits
Merci à @dee-see de HackerOne pour avoir reporté la faille de sécurité.