Критична уязвимост в Ruby on Rails може да позволи на неавтентикиран атакуващ да записва произволни файлове на сървъра на приложението чрез качване на специално конструиран файл, ако приложението обработва качените файлове с ImageMagick. Проектът Rails разкри уязвимостта в бюлетин за сигурност и я отстрани във версии 8.1.4.1 и 8.0.5.2.

Уязвимостта се намира в Active Storage – частта от Rails, която отговаря за качването на файлове. Някои приложения съхраняват качените файлове чрез услугата Disk на Active Storage, която ги записва на диска на сървъра. При тези приложения атакуващият би могъл също да прочете всеки файл, до който приложението има достъп за четене.

Тези файлове обикновено включват ключа secret_key_base на приложението и неговите идентификационни данни за други системи, посочват от Rails. Прочитането им от своя страна може да позволи отдалечено изпълнение на код или странично придвижване (lateral movement) към тези системи.

Rails оценява уязвимостта с 9.8 от 10 по скалата CVSS. Тя се проследява като GHSA-f3w6-w445-fwh9 и все още няма CVE идентификатор.

ImageMagick избира обработчик на формати, който нарича кодер (coder), въз основа на съдържанието на файла. Някои кодери действат върху други файлове, посочени вътре в изображението, а не върху самото изображение. Active Storage не налага ограничения за това кои кодери може да използва даден качен файл, така че единственото ограничение е била собствената политика на сървъра за ImageMagick.

Анализаторът на ImageMagick в Active Storage се стартира при прикачване на файл. Самото прикачване на качения файл е достатъчно, за да се достигне до уязвимостта. Не е необходимо приложението да създава вариант (трансформирано копие на изображението) или визуализация, нито да извиква функцията analyze.

Качен SVG файл е достигнал до MSL кодера на ImageMagick чрез този анализатор, става ясно от промяната в кода (commit), която отстранява уязвимостта. MSL е скриптов кодер, който чете и записва файлове, посочени от неговия скрипт.

От Rails заявиха, че им е била докладвана една верига за атака, но „не приемат, че тя е единствената съществуваща“. В бюлетина не се посочва дали уязвимостта е била експлоатирана.

Уязвимостта е докладвана чрез HackerOne от RyotaK, изследовател в GMO Flatt Security.

Кои приложения на Rails са засегнати

Дадено приложение е засегнато само ако са изпълнени едновременно и трите условия по-долу:

  • Използва ImageMagick за обработка на изображения в Active Storage. Това е настройката config.active_storage.variant_processor = :mini_magick, която е по подразбиране за приложения с load_defaults 6.1 или по-ранна версия.
  • Политиката за сигурност на ImageMagick не блокира предварително засегнатите кодери. От Rails посочват, че политиките, идващи стандартно с Debian и Ubuntu, не ги блокират.
  • Приема качвания на файлове от недоверени потребители.

За да проверите първото условие, погледнете config.active_storage.variant_processor. Ако не е зададено, стойността по подразбиране зависи от load_defaults: :mini_magick преди версия 7.0 и :vips от 7.0 нататък. Същата настройка определя коя библиотека анализира качените файлове, а не само коя създава варианти.

Всяка версия на Active Storage преди 8.0.5.2 е засегната, както и версиите от клона 8.1 преди 8.1.4.1. Сериите на изданията, по-стари от 8.0, вече не се поддържат и Rails няма да пусне коригирани версии за тях.

През юли Rails отстрани друга критична уязвимост в Active Storage – CVE-2026-66066, която засягаше приложения, използващи libvips вместо ImageMagick. Приложенията, използващи ImageMagick, не бяха изложени на вектора на атака от онази уязвимост, но могат да бъдат изложени на настоящата.

Същите нови издания отстраняват и втора уязвимост в Active Storage – GHSA-v924-7rp8-4mxh, която Rails определя като високорискова с оценка по CVSS от 8.8. Active Storage е предавал качените файлове към ImageMagick и FFmpeg под временни файлови имена, които са запазвали разширението на качения файл.

Тези инструменти могат да изберат декодер въз основа на разширението, когато съдържанието на файла не показва неговия формат. Така атакуващ, който е избрал името на качвания файл и е декларирал неговия тип съдържание (content type), е можел да избере декодера, който да го обработи.

Какво трябва да се направи

Rails настоятелно препоръчва обновяване възможно най-скоро. Двете нови издания отстраняват общо 21 проблема със сигурността.

Коригираните версии включват политика за сигурност на ImageMagick. MiniMagick е Ruby библиотеката (gem), която Active Storage използва за извикване на ImageMagick. В стандартната си конфигурация всяка команда на ImageMagick, която тя стартира, прилага тази политика, а не само командите от Active Storage.

Политиката блокира MSL кодера; кодери, които четат или изтриват файлове, различни от изображението; кодери, които извличат отдалечени или локални референции или ги показват на екран; всеки кодер, базиран на Ghostscript, заедно с делегата gs; както и индиректното препращане чрез @filename.

  • Обновете до Rails 8.1.4.1 или 8.0.5.2. Приложенията, използващи :mini_magick, се нуждаят също от mini_magick 5.1 или по-нова версия, в противен случай генерират грешка при стартиране. Rails 8.0 получава корекции за сигурност само до 7 ноември 2026 г. съгласно своята политика за поддръжка.
  • Уверете се, че приложението зарежда новата политика, както е описано в ръководството на Active Storage, като изпълните bin/rails runner 'puts MiniMagick.identify { |i| i.list "policy" }'.
  • Проверете дали включената политика изобщо достига до приложението. Тя не достига до приложение, което заменя MiniMagick.cli_env след стартиране, изчиства средата с MiniMagick.cli_prefix или инсталира собствен MiniMagick::Shell. Такова приложение трябва да постави правилата в системната политика на ImageMagick.
  • Приложенията, които използват GraphicsMagick, не получават защита от включената политика, тъй като GraphicsMagick не чете политиките на ImageMagick.
  • Проверете собствената политика на сървъра за ImageMagick. Включената политика се добавя към нея, вместо да я заменя. Правило там, което разрешава даден кодер, включително универсален символ (wildcard) като pattern="*", отменя блокирането на този кодер от включената политика.
  • Ако приложението рендерира PDF или PostScript файлове чрез ImageMagick, разрешете отново делегата gs и кодерите, които той използва, във файла policy.xml на сървъра.
  • Ако все още не можете да обновите, копирайте правилата от включената политика, activestorage/lib/active_storage/image_magick/policy.xml, в системната политика на ImageMagick, като например /etc/ImageMagick-7/policy.xml. Като минимум блокирайте MSL кодера, кодерите на Ghostscript и делегата gs. Rails публикува решението и под формата на корекции за сигурност за версии 8.1 и 8.0.
  • Приложенията от серии на изданията, по-стари от 8.0, могат да използват това заобиколно решение или да обновят до версия 8.0 или по-нова.
  • Заобиколните решения на Rails за втората уязвимост променят само начина, по който се използва FFmpeg. Никое от тях не покрива ImageMagick.
  • Ако приложението съхранява прикачени файлове с услугата Disk, сменете secret_key_base и всяка друга тайна, която процесът на приложението може да прочете. Това включва главния ключ (master key), всичко, което се съдържа в config/credentials.yml.enc, идентификационните данни за хранилища и бази данни, както и токените за трети страни. Не запазвайте компрометирана тайна като резервен вариант.

В бюлетина не се обяснява как да се провери дали дадено приложение вече е било обект на атака.