When using the #apply
method from image_processing to apply a series of operations that are coming from unsanitized user input, this allows the attacker to execute shell commands:
ImageProcessing::Vips.apply({ system: "echo EXECUTED" })
#>> EXECUTED
This method is called internally by Active Storage variants, so Active Storage is vulnerable as well.
The vulnerability has been fixed in version 1.12.2 of image_processing.
If you're processing based on user input, it's highly recommended that you always sanitize the user input, by allowing only a constrained set of operations. For example:
operations = params[:operations]
.map { |operation| [operation[:name], *operation[:value]] }
.select { |name, *| name.to_s.include? %w[resize_to_limit strip ...] } # sanitization
ImageProcessing::Vips.apply(operations)
{ "nvd_published_at": "2022-03-01T23:15:00Z", "github_reviewed_at": "2022-03-01T22:22:26Z", "severity": "CRITICAL", "github_reviewed": true, "cwe_ids": [ "CWE-20", "CWE-78" ] }