# Безопасность

## Как сообщить об уязвимости

**Приватно, на почту: dem4ev48@gmail.com.** Тема — `[russiano2d] безопасность`.
Публичный issue открывать не нужно: репозиторий публичный, и подробности
увидят раньше, чем выйдет исправление.

Что приложить, чтобы всё пошло быстро:

* версию (`project(... VERSION ...)` в `CMakeLists.txt`) и платформу;
* как воспроизвести — команды, файл-триггер, шаги;
* что происходит и что должно происходить;
* PoC, если он есть.

### Чего честно ждать

Движок делает один человек вместе с ИИ-агентами: дежурств, SLA и «ответим в
течение 48 часов» тут нет. Отвечу, как только смогу. Если подтвержу — чиню и
укажу вас в `CHANGELOG.md`, если захотите. Если не подтвержу — объясню, почему
считаю это не уязвимостью, а не просто закрою письмо.

Вознаграждения за найденные уязвимости нет: платить нечем, проект бесплатный.

## Что поддерживается

Только последний тег `vX.Y.Z` из [`dist/`](https://github.com/Nikide/russiano2d/blob/main/dist). Ветка `main` — рабочая,
в ней может быть что угодно недоделанное.

## Что считаем уязвимостью

Код самого движка:

| Область | Где смотреть | Что интересно |
|---|---|---|
| Разбор данных | `src/json.c`, `src/highlevel/csv.js` | падение или порча памяти на битом входе |
| Сохранения | `src/highlevel/save.js` | чтение вне границ, подмена чужих слотов, обход миграций |
| Уровни и проекты | `src/project.c`, `src/bsp.c` | падение на специально собранном файле проекта |
| Сеть | `src/http.c`, `src/highlevel/http.js` | утечка данных между запросами, обход ограничений |
| Агентский режим | `src/agent.c` | команды, выходящие за рамки заявленного в `docs/AGENT_API.md` |
| Груз игры | `src/payload.c`, `src/crypto.c`, `src/build.c` | подмена груза, обход целостности |
| Графика, свет, текст | `src/render.c`, `src/light.cpp`, `src/text.c`, `src/icons.c` | падение на подсунутых данных |
| Встраивание QuickJS | `src/script.c` | выход из песочницы движка в систему |

## Что уязвимостью НЕ считаем

Чтобы не тратить время друг друга:

* **«Шифрование» груза игры — это обфускация, а не защита.** Ключ лежит в том
  же собранном файле, и так и задумано: это прямо написано в `src/build.c`.
  Расшифровать свой же файл может кто угодно — это не дыра, а граница
  применимости. Не кладите в груз секреты.
* **Движок исполняет произвольный JS — он для этого и сделан.** Скрипты игры
  доверенные. Если вы запускаете чужой `.js`, это ваше решение, а не уязвимость.
* **Встроенный сокетный бэкенд `$.http` не умеет TLS** — только `http://`. Это
  осознанный аварийный режим на случай сборки без libcurl (`src/http.c`).
  Секреты через него не гоняйте; с libcurl доступен `https`.
* **Режим `--agent` читает команды со stdin и не имеет аутентификации.** Он
  для локальной автоматизации. Если вы выставили его наружу — это ваша
  конфигурация, а не уязвимость движка.
* **Уязвимости в сторонних библиотеках** (SDL3, QuickJS-ng, Box2D, RmlUi,
  Dear ImGui, glslang, SPIRV-Cross) — сообщайте их авторам. Мне тоже напишите:
  подниму версию в `cmake/Dependencies.cmake`.
* **Отсутствие прав на демо-ассеты** — это юридический вопрос, а не
  безопасность. Он разобран в `docs/RELEASING.md`, раздел 0.2.

## Как устроена защита сейчас

Коротко, чтобы вы понимали модель угроз:

* **Песочница скриптов.** Игровая логика исполняется во встроенном QuickJS и
  общается с C через один объект `$`. Выход в систему — только те функции,
  что движок выставил сам.
* **Границы буферов.** Разбор JSON, груза и проектов идёт с проверкой длин;
  `tests/json`, `tests/payload`, `tests/crypto` гоняются локально, часть — под
  ASan/UBSan (`-DR2D_SANITIZE=ON`).
* **Целостность груза.** ChaCha20-Poly1305 с самотестом шифра при сборке
  (`src/build.c` отменяет сборку, если самотест не прошёл). Защищает от
  случайной порчи, не от целенаправленной подмены.
* **Зависимости.** Список и лицензии — в `THIRD_PARTY_NOTICES.md`.

Нашли, что тут написано неправдой, — это тоже повод написать на почту.
