Новости · Безопасность файлов

Через .org-разметку в Gitea читали произвольные файлы сервера

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

7 августа 2026 Редакция LoadFile Чтение 7 мин
Текстовый документ с директивой включения тянет по скрытому каналу секретный файл из серверной стойки

Коротко: в 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).

Как .org-разметка читала чужие файлы

Gitea умеет красиво отображать не только Markdown, но и другие форматы разметки — в том числе Org-mode, текстовый формат заметок и документов из редактора Emacs (файлы с расширением .org). Именно обработка этого формата и подвела.

У Org-mode есть штатная директива #+INCLUDE — она вставляет в документ содержимое другого файла. Удобно для документации, опасно при отрисовке недоверенного текста. Цепочка выглядела так:

  1. Открытая точка входа. В Gitea есть эндпоинт предпросмотра разметки POST /{owner}/{repo}/markup. Для публичных репозиториев он допускал анонимные запросы — вход в систему не требовался.
  2. Подсунутый формат. Атакующий отправлял туда свой текст с именем файла на .org, чтобы Gitea обработал его именно как разметку Org-mode, а не как обычный текст.
  3. Директива включения. Внутри лежала строка вида #+INCLUDE: "/etc/passwd" — с абсолютным путём к постороннему файлу на сервере.
  4. Чтение чужого. Разметку разбирала встроенная библиотека go-org. Gitea не переопределил её функцию чтения файла, и та по умолчанию вызывала ioutil.ReadFile без всяких ограничений по пути. В результате содержимое указанного файла честно попадало в отрисованный ответ.

Ключевая мысль: движок доверял директиве внутри документа и читал ровно то, на что она указывала. Прочитать можно было любой файл, доступный сервисной учётной записи Gitea, — конфиги, ключи, приватные данные соседних репозиториев.

От чтения файла — до захвата сервера

Само по себе чтение файлов уже критично, но разработчики Gitea показали, как превратить его в выполнение произвольного кода (RCE). Цепочка эскалации:

  • прочитать главный конфиг app.ini и вытащить из него внутренний токен INTERNAL_TOKEN;
  • с этим токеном внедрить Git-хук через внутренний механизм логирования;
  • спровоцировать срабатывание хука при анонимном клонировании репозитория — и получить выполнение команд от имени сервиса.

В том же выпуске 1.27.1 закрыли и вторую тяжёлую брешь — CVE-2026-60004 (тоже 9,8 из 10): через API diffpatch пользователь с правами записи в репозиторий мог установить вредоносный Git-хук и запускать команды на сервере. Разные векторы, но вывод один — обновляться нужно было ещё вчера.

!
Важно

На момент выхода материала (5–7 августа 2026 года) CVE-2026-59774 не значилась в каталоге активно эксплуатируемых уязвимостей CISA, а публичного готового эксплойта полной цепочки до RCE не публиковали. Но примитив «чтения файла» засветился ещё до официальной рекомендации — тянуть с обновлением нельзя.

Кому это важно и что делать

Уязвимость касается всех, кто держит собственный сервер Gitea — а это частый выбор для внутренних репозиториев в компаниях, у хостеров и у разработчиков-одиночек. Порядок действий:

  1. Обновите Gitea до 1.27.1 или новее — это главное и достаточное лекарство. Готовые сборки есть на официальной странице загрузки.
  2. Смените засветившиеся секреты. Если сервер был доступен извне, считайте INTERNAL_TOKEN и другие ключи из app.ini потенциально скомпрометированными и ротируйте их.
  3. Ограничьте анонимный доступ. Пересмотрите, действительно ли предпросмотр разметки и публичные репозитории должны быть открыты неавторизованным пользователям.
  4. Проверьте логи на подозрительные запросы к /markup и необычные Git-хуки в репозиториях.

Урок: директивы-включения — недооценённый класс дыр в форматах

Здесь интересная деталь для тех, кто разбирается в форматах файлов. Дело не в «плохом» Org-mode — дело в директивах включения, которые есть у многих форматов разметки и документов. Стоит движку выполнить такую директиву на недоверенном вводе без ограничения путей — и «безобидный текст» превращается в инструмент чтения чужих файлов. Это повторяющийся сюжет:

  • XML → сущности (XXE). Внешние сущности в XML умеют подтягивать локальные файлы — классика arbitrary file read.
  • LaTeX → \input и \include. Онлайн-компиляторы неоднократно давали читать файлы сервера через включение.
  • Server-Side Includes (SSI), шаблонизаторы, Markdown-препроцессоры с поддержкой include — та же логика.
  • Org-mode #+INCLUDE — свежий пример из этой же серии.

Вывод, о котором мы на Loadfile пишем постоянно: расширение и заявленный тип файла ничего не гарантируют, а «просто текст» может нести исполняемые для парсера инструкции. Что стоит вынести:

Источники

Читайте также