Новости
Через загрузку картинки в Rails можно было прочитать файлы сервера
Другой формат, тот же принцип: содержимое файла заставляло обработчик прочитать посторонние данные сервера.
Файл разметки Org-mode — это обычный текст, вроде «нестандартного Markdown». Но в самохостящемся Git-сервисе Gitea его директива включения оказалась дверью в чужой сервер: посторонний без входа мог заставить движок прочитать любой файл на диске. Разбираем, при чём тут форматы файлов и почему «безобидная разметка» — тоже поверхность атаки.

Коротко: в Git-сервисе Gitea закрыли критическую уязвимость CVE-2026-59774 (оценка 9,8 из 10). Директива #+INCLUDE в разметке Org-mode позволяла анонимному пользователю прочитать любой файл на сервере, а через утечку ключей — дойти до запуска чужого кода. Исправление вышло в версии 1.27.1; лечится немедленным обновлением.
2 августа 2026 года проект Gitea — популярный самохостящийся сервис для хранения Git-репозиториев (лёгкая альтернатива GitHub, которую ставят на свои серверы) — выпустил рекомендацию по безопасности для уязвимости CVE-2026-59774. По шкале CVSS ей присвоили 9,8 из 10 — фактически максимум для «критического» класса. О проблеме массово написали профильные издания 5 августа.
Брешь относится к типу «неаутентифицированное чтение произвольных файлов» (unauthenticated arbitrary file read): злоумышленнику не нужен ни аккаунт, ни пароль. Затронуты версии Gitea с 1.22.1 по 1.27.0 включительно; исправление вошло в выпуск 1.27.1 от 27 июля 2026 года. Облачные инстансы Gitea Cloud обновили автоматически, а вот тысячи серверов, поднятых компаниями и энтузиастами у себя, нужно обновлять вручную. Нашли уязвимость исследователи XBOW Security, независимо о ней сообщил и Шай Род (NightRang3r).
Gitea умеет красиво отображать не только Markdown, но и другие форматы разметки — в том числе Org-mode, текстовый формат заметок и документов из редактора Emacs (файлы с расширением .org). Именно обработка этого формата и подвела.
У Org-mode есть штатная директива #+INCLUDE — она вставляет в документ содержимое другого файла. Удобно для документации, опасно при отрисовке недоверенного текста. Цепочка выглядела так:
POST /{owner}/{repo}/markup. Для публичных репозиториев он допускал анонимные запросы — вход в систему не требовался..org, чтобы Gitea обработал его именно как разметку Org-mode, а не как обычный текст.#+INCLUDE: "/etc/passwd" — с абсолютным путём к постороннему файлу на сервере.ioutil.ReadFile без всяких ограничений по пути. В результате содержимое указанного файла честно попадало в отрисованный ответ.Ключевая мысль: движок доверял директиве внутри документа и читал ровно то, на что она указывала. Прочитать можно было любой файл, доступный сервисной учётной записи Gitea, — конфиги, ключи, приватные данные соседних репозиториев.
Само по себе чтение файлов уже критично, но разработчики Gitea показали, как превратить его в выполнение произвольного кода (RCE). Цепочка эскалации:
app.ini и вытащить из него внутренний токен INTERNAL_TOKEN;В том же выпуске 1.27.1 закрыли и вторую тяжёлую брешь — CVE-2026-60004 (тоже 9,8 из 10): через API diffpatch пользователь с правами записи в репозиторий мог установить вредоносный Git-хук и запускать команды на сервере. Разные векторы, но вывод один — обновляться нужно было ещё вчера.
На момент выхода материала (5–7 августа 2026 года) CVE-2026-59774 не значилась в каталоге активно эксплуатируемых уязвимостей CISA, а публичного готового эксплойта полной цепочки до RCE не публиковали. Но примитив «чтения файла» засветился ещё до официальной рекомендации — тянуть с обновлением нельзя.
Уязвимость касается всех, кто держит собственный сервер Gitea — а это частый выбор для внутренних репозиториев в компаниях, у хостеров и у разработчиков-одиночек. Порядок действий:
INTERNAL_TOKEN и другие ключи из app.ini потенциально скомпрометированными и ротируйте их./markup и необычные Git-хуки в репозиториях.Здесь интересная деталь для тех, кто разбирается в форматах файлов. Дело не в «плохом» Org-mode — дело в директивах включения, которые есть у многих форматов разметки и документов. Стоит движку выполнить такую директиву на недоверенном вводе без ограничения путей — и «безобидный текст» превращается в инструмент чтения чужих файлов. Это повторяющийся сюжет:
\input и \include. Онлайн-компиляторы неоднократно давали читать файлы сервера через включение.include — та же логика.#+INCLUDE — свежий пример из этой же серии.Вывод, о котором мы на Loadfile пишем постоянно: расширение и заявленный тип файла ничего не гарантируют, а «просто текст» может нести исполняемые для парсера инструкции. Что стоит вынести: