Scope group isolation plan to CHAT and defer UTUN

This commit is contained in:
evgeny committed 2026-11-03 19:38:35 +01:00
1 parent bb02709be3
commit cbffb6492a
2 files changed
+53 -57

No files matched your search

+42 -51
View File
@@ -1,11 +1,13 @@
Межгрупповой доступ: план завершения изоляции
Межгрупповой доступ: план изоляции CHAT-групп
Дата: 03.11.2026
Статус: проект исправления; этапы ниже ещё не реализованы.
Уточнение объёма: по указанию пользователя UTUN пока не дорабатывать.
1. Цель и исходное состояние
На одном ядре могут существовать несколько CHAT-групп и UTUN. Узел, допущенный
только в A, не должен получать данные, менять состояние или запускать операции B.
На одном ядре могут существовать несколько CHAT-групп и UTUN. Текущая задача —
изоляция CHAT-групп: узел, допущенный только в A, не должен получать данные,
менять состояние или запускать операции другой CHAT-группы B.
Проверка должна работать на уже открытом общем ETCP и после отзыва членства.
Наличие транспорта, маршрута, TOPO_GROUP_NODE или записи в общем node_registry
не является разрешением на API группы.
@@ -19,8 +21,6 @@ topo_group_chat_allowed и закрытие запрещённых канало
Основные подтверждённые места для исправления/проверки:
- radio_recv/broadcast_recv: выбор группы без проверки допуска входящего соседа;
- conn_mgr_router_recv_handler/cm_open: существование группы/узла вместо допуска;
- TCP/UDP/ICMP proxy и routing_pkt_from_etcp_cb: отсутствует входной фильтр группы;
- topo_group_peer_allowed: для не-CHAT возвращает разрешение;
- MEMBER_FILES/GROUP_AVATAR и ряд других сервисов: проверка данных внутри
callback не задаёт обязательную подпись router HELLO/ACK/CLOSE и других controls;
- multicast mc_report_recv: проверяет форму и дескриптор группы, но не членство
@@ -36,9 +36,19 @@ topo_group_chat_allowed и закрытие запрещённых канало
Развивать существующие механизмы, без второго универсального слоя авторизации.
Схема обычного запроса к CHAT-группе B:
общий транспорт
-> проверенная личность отправителя для данного протокола
-> живая CHAT-группа B и активное локальное членство self и peer в B
-> право на конкретную операцию и совпадение контекста запроса с B
-> выполнение операции внутри B.
Отказ на любом шаге прекращает обработку до соответствующих побочных действий.
Членство в A не помогает пройти проверку B, даже при общем ETCP и тех же ID файлов.
JOIN и восстановление MEMBERS имеют отдельные ограниченные входы из п. 2.4.
2.1. Групповые routed API
Использовать etcp_router_require_crypto и etcp_router_set_authorize. Для CHAT
Использовать существующие механизмы обязательной криптографии и authorize router. Для CHAT
базовый допуск уже реализован в topo_group_chat_allowed: живая группа и активное
локальное членство self и peer (source=0, deleted=0, admitted=1).
Криптографически проверяется конечный source из router, а не ETCP next hop.
@@ -58,8 +68,12 @@ supernode, подпись автора, приглашение, адресат,
CONN_MGR: он помогает создать соединение. Его локальный open и входящие команды
проверяют допуск до загрузки узла в группу, cm_ensure_entry, таймеров и NCD.
Повторная проверка нужна при выборе посредника, retry и публикации готового пути.
Для сервисов, работающих и с CHAT, и с UTUN, выбор политики определяется типом
реальной группы; неизвестный тип не получает автоматического разрешения.
Для сервисов, работающих и с CHAT, и с UTUN, новые правила применять только к CHAT.
Не устанавливать для них глобальное требование crypto, меняющее обмен UTUN:
нынешний etcp_router_require_crypto задаёт требование сразу всему service ID.
Для общих service ID потребуется выбор требований по группе; crypto-проверка
должна предшествовать допуску по source. Существующую политику UTUN сохранять,
попытки обратиться к несуществующей CHAT-группе отклонять.
2.2. Raw групповые пакеты
@@ -81,31 +95,13 @@ STREAM имеет собственные сессии и проверки уча
допуска до побочных действий, сохраняя его транспортный жизненный цикл. Проверки
соседства RADIO нельзя автоматически навязать прямому STREAM поверх общего NCD.
2.3. UTUN
2.3. UTUN — отложено
Проверки group_id == TOPO_GROUP_UTUN недостаточно: чужой CHAT-узел может указать
это значение. [allowed_keys] сейчас управляет входящим транспортом; allow_all=1
нужен, в частности, для новых CHAT-узлов и не должен открывать TUN/NAT/proxy.
Предлагаемая политика: отдельный список публичных ключей UTUN, например секция
[utun_allowed_keys]. По умолчанию внешний доступ закрыт; self допускается при
работающем UTUN-сервисе. Не импортировать автоматически транспортные allowed_keys,
все [client] или записи BGP. Список проверяется по проверенной идентичности узла,
одинаково для UDP/STCP/REALITY и routed источника за промежуточным узлом.
Явно открытый UTUN, если он нужен продукту, должен включаться отдельной настройкой
UTUN; транспортный allow_all не является этой настройкой.
Это изменение конфигурационного контракта: на каждом принимающем UTUN-узле
понадобится допуск конечных участников, а не только ближайшего сервера. Простой
список ключей выбран для первого исправления; подписанное распределённое членство
UTUN означало бы отдельный протокол управления и существенно больший объём.
Одной политикой UTUN закрыть BGP JOIN/обмен, CONN_MGR, NAT_DETECTION, DATA,
NAT и обе стороны TCP/UDP/ICMP proxy. У routed API обязательна проверенная подпись
source, иначе проверка списка ключей по подставленному node_id не имеет смысла.
NAT/proxy сохраняют собственные ограничения provider/via, ожидаемого peer и потока.
При изменении допуска закрывать соответствующие логические операции и сокеты,
сохраняя общий транспорт, необходимый CHAT. Учесть start/stop и применение конфига.
Не менять допуск UTUN, его конфигурацию, DATA/TUN, NAT и TCP/UDP/ICMP proxy.
В общих CONN_MGR, BGP, NAT_DETECTION, multicast и router сохранить поведение UTUN;
не распространять на него новые CHAT-проверки или обязательные crypto-флаги.
Ранее найденные пробелы UTUN остаются отдельной отложенной задачей.
Регрессии существующего поведения UTUN запускать, доработку доступа не выполнять.
2.4. Bootstrap, синхронизация и личные данные
@@ -145,7 +141,7 @@ self, остановка/удаление группы. Отмена серви
Расширить подход test_media_delivery_integration: реальные ядра, SQLite,
подписанные участники, две группы и один физический ETCP. Инъекция должна идти
ниже локального запрета отправителя, иначе тест проверит лишь клиентскую защиту.
Зафиксировать отрицательные воспроизведения RADIO/BROADCAST, CONN_MGR и proxy.
Зафиксировать отрицательные воспроизведения RADIO/BROADCAST и CONN_MGR в CHAT.
Добавить осмысленные логи отказа и очистки: service, group, source, next_hop,
команда/операция, фаза проверки, причина; без приватных ключей/содержимого файлов.
Критерий: в старом коде наблюдаем конкретный запрещённый эффект, после исправления
@@ -156,7 +152,8 @@ self, остановка/удаление группы. Отмена серви
ADMIN_KEY и routed JOIN. ADMIN_KEY дополнительно связывает канал с router group.
CONN_MGR проверяет вход, local open, кандидатов и отложенные переходы состояния.
NAT_DETECTION и MULTICAST_REPORT получают допуск конечного источника и подпись
controls; STREAM routed — согласованную с его действующими проверками политику.
controls для CHAT; STREAM routed — согласованную с его проверками политику.
Общие service ID используют требования по группе, сохраняя контракт UTUN.
MEDIA_DELIVERY остаётся контрольным образцом и регрессией.
Критерий: чужой/отозванный peer не создаёт сессий, файлов, запросов подключения,
NAT-проб и отчётов; unsigned HELLO/ACK/CLOSE не воздействуют на разрешённый канал.
@@ -169,28 +166,19 @@ self, остановка/удаление группы. Отмена серви
Критерий: подстановка чужого group/src не доставляет callback, не загрязняет
dedup и не порождает пересылку; удаление участника прекращает текущую передачу.
Этап 4. Независимый допуск UTUN
Реализовать отдельную конфигурацию доступа, отказ по умолчанию и применение
политики из п. 2.3 во всех входах UTUN, включая DATA/TUN и клиентские proxy replies.
Обновить sample, документацию и тестовые конфиги явным допуском нужных узлов.
Критерий: CHAT-only peer с валидным транспортом не использует UTUN даже указав
правильный UTUN group_id; разрешённый routed клиент работает через посредника.
Проверить UDP/STCP/REALITY и существующие proxy/NAT/load тесты, включая нагрузку
после введения подписи. Не заменять проверку членства наличием маршрута.
Этап 5. Личные сервисы, bootstrap и полная матрица
Этап 4. Личные сервисы, bootstrap и полная матрица CHAT
Проверить DM, DM_MAILBOX, DM_MEDIA, FILE_TRANSFER, CALL/CALL_AUDIO/CALL_VIDEO,
CALL_VIDEO_CONTROL и DEVGROUP; обязательные controls и групповые/предметные права.
Завершить тесты raw JOIN/invite, MEMBERS recovery и серверного add_key.
Сопоставить каждый ID из etcp_api.h с реализованной политикой и сетевым тестом.
Сопоставить каждый ID из etcp_api.h с политикой и тестом либо пометкой «UTUN отложен».
NTP_TIME/NCD_CONTROL/SVC_ROUTE — общие транспортные службы: проверить их границы
отдельно. Не навязывать им фиктивное CHAT-членство. Проверить отсутствие обхода
через raw DATA/неизвестный ID и явно включаемую BLE_PROBE instrumentation.
к CHAT через неизвестный ID и явно включаемую BLE_PROBE instrumentation.
Критерий: по каждому ID есть разрешённый сценарий, отказ либо документированный
транспортный/bootstrap контракт; без строки «не проверено» для групповых API.
транспортный/bootstrap контракт; без строки «не проверено» для API CHAT-групп.
После каждого этапа: целевые тесты и ./check.sh; изменения фиксировать отдельными
логически завершёнными коммитами. Этапы 2/3 не означают готовность этапов 4/5.
логически завершёнными коммитами. Этапы 2/3 не означают готовность этапа 4.
Успешный общий набор без новых отрицательных сценариев не закрывает задачу.
4. Обязательная матрица регрессий
@@ -211,8 +199,11 @@ self, остановка/удаление группы. Отмена серви
при совпавшем числовом stream/transfer ID. Учесть существующие границы epochs.
11) Для запрета проверяется побочный эффект: callback/БД/файл/сокет/таймер/NCD,
а не только отсутствие ответа. Логи объясняют точную причину отказа.
12) Положительные JOIN, MEMBERS recovery, DM через другую общую группу и разрешённый
UTUN проходят. Локальные loopback-вызовы соблюдают ту же предметную политику.
12) Положительные JOIN, MEMBERS recovery и DM через другую общую группу проходят.
Локальные loopback-вызовы соблюдают ту же предметную политику.
13) Существующие UTUN-сценарии на общих сервисах сохраняют поведение и формат;
новых требований к его конфигурации и криптографии не появляется.
Задача завершена только после реализации всех этапов и этой матрицы для каждого
относящегося к ней сервиса. Сам этот документ не подтверждает устранение пробелов.
относящегося к CHAT сервиса. UTUN не входит в эту гарантию и остаётся отложенным.
Сам этот документ не подтверждает устранение пробелов.
+11 -6
View File
@@ -5,18 +5,23 @@
## Текущие задачи
[ ] **Завершить аудит межгруппового доступа всех сетевых сервисов** — 03.11.2026.
[ ] **Завершить изоляцию API CHAT-групп** — 03.11.2026. UTUN пока не трогать по указанию пользователя.
MEDIA_DELIVERY закрыт отдельной политикой router и негативными сетевыми тестами; это не гарантия для остальных сервисов.
По чтению кода: RADIO/BROADCAST выбирают группу из wire без проверки членства входящего пира;
CONN_MGR разрешает диспетчеризацию по существованию группы, DIRECT_REQ использует общий node_registry;
TCP/UDP/ICMP proxy на приёме не проверяют router group. MEMBER_FILES/GROUP_AVATAR проверяют данные в обработчиках,
MEMBER_FILES/GROUP_AVATAR проверяют данные в обработчиках,
но не задают обязательную подпись control-пакетов в router. Нужны отдельные воспроизведения на общем ETCP,
проверка подмены источника, отзыва доступа и соседней группы; правила JOIN/invite и личных DM учитывать отдельно.
На этом этапе перечисленные дополнительные сценарии проверены чтением кода, сетевые регрессии ещё не добавлены.
План исправления и критерии по пяти этапам: [group_isolation_plan.txt](group_isolation_plan.txt).
Дополнительно включены DATA/TUN, MULTICAST_REPORT, ADMIN_KEY, NAT_DETECTION и аудит допуска DM/mailbox;
отдельный доступ UTUN не должен наследовать transport allow_all. MEMBERS recovery и первичный JOIN требуют
отдельных правил. План зафиксирован; новые этапы ещё не реализованы, вывод о полной изоляции преждевременен.
План исправления и критерии по четырём этапам: [group_isolation_plan.txt](group_isolation_plan.txt).
Включены MULTICAST_REPORT, ADMIN_KEY, CHAT-обмен NAT_DETECTION и аудит допуска DM/mailbox.
MEMBERS recovery и первичный JOIN требуют отдельных правил. Общие service ID должны сохранить поведение
и crypto-требования UTUN. План зафиксирован; новые этапы ещё не реализованы.
[ ] **Отложено: отдельный допуск UTUN и его API** — 03.11.2026. Не выполнять в текущей задаче по указанию пользователя.
По чтению кода: TCP/UDP/ICMP proxy и routing DATA не проверяют входящий router group;
topo_group_peer_allowed разрешает не-CHAT группы, а allowed_keys ограничивает транспорт.
Проверка group_id сама по себе не заменяет допуск UTUN. Сетевые воспроизведения и решение остаются отложенными.
[+] **Панель устройств групповой лички: свои и собеседника** — 03.11.2026.
Общий снимок текущего состава закреплённых сторон, включая offline и fallback-устройство.