chat_join: верификация join-ключа на инвайтере (REQUEST_FWD)
Инвайтер добавлял мембера без проверки join-ключа — любой известный узел мог самопригласиться в канал через REQUEST_FWD напрямую владельцу. register_key теперь всегда хранит выданный ключ локально, process_request отклоняет запрос с неизвестным/чужим ключом. Тесты: unknown join_key rejected + регистрация ключа в t_process_request.
This commit is contained in:
1 parent
75e39d2fee
commit
fc2262912a
2 files changed
+24
-2
No files matched your search
+11
-2
@@ -140,6 +140,14 @@ void chat_join_process_request(struct UTUN_INSTANCE* inst, uint64_t group_id,
|
||||
char ch_id[32]; snprintf(ch_id, sizeof(ch_id), "%llu", (unsigned long long)group_id);
|
||||
sqlite3* db = inst->topo_sqlite_db;
|
||||
|
||||
/* 0. верификация join-ключа: принимаем только выданные нами (инвайтером) ключи */
|
||||
struct join_key_entry* ke = _keys_find(group_id, join_key);
|
||||
if (!ke || ke->inviter_id != inst->node_id) {
|
||||
DEBUG_WARN(DEBUG_CATEGORY_CHAT_SYNC, "%s: process_request invalid join key ch=%s from=%016llx key=%016llx — drop",
|
||||
CJ_ID, ch_id, (unsigned long long)from_node, (unsigned long long)join_key);
|
||||
return;
|
||||
}
|
||||
|
||||
/* 1. привязка идентичности: node_id = derive(x25519) */
|
||||
if (sc_derive_node_id_from_pubkey(m.x25519) != m.node_id) {
|
||||
DEBUG_ERROR(DEBUG_CATEGORY_CHAT_SYNC, "%s: process_request node_id/x25519 mismatch (forgery) nid=0x%016llx ch=%s",
|
||||
@@ -245,9 +253,10 @@ void chat_join_register_key(struct UTUN_INSTANCE* inst, uint64_t channel_id,
|
||||
uint64_t target_node_id, uint64_t join_key) {
|
||||
if (!inst || channel_id == 0 || join_key == 0) return;
|
||||
|
||||
/* инвайтер всегда хранит выданный ключ локально — для верификации REQUEST_FWD */
|
||||
_keys_put(channel_id, join_key, inst->node_id);
|
||||
|
||||
if (target_node_id == inst->node_id || target_node_id == 0) {
|
||||
/* инвайтер и есть connection-узел — храним ключ локально */
|
||||
_keys_put(channel_id, join_key, inst->node_id);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user