diff --git a/doc/group_isolation_plan.txt b/doc/group_isolation_plan.txt index 22a224858..e560cea10 100644 --- a/doc/group_isolation_plan.txt +++ b/doc/group_isolation_plan.txt @@ -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 не входит в эту гарантию и остаётся отложенным. +Сам этот документ не подтверждает устранение пробелов. diff --git a/doc/tasks.md b/doc/tasks.md index bd7f862bc..3c5852e2f 100644 --- a/doc/tasks.md +++ b/doc/tasks.md @@ -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-устройство.