Безопасность: pubkey check при reusing линка + node_changed при конфликте адреса чужого конна
This commit is contained in:
1 parent
ccd35074d8
commit
15ca0675c0
1 file changed
+28
-6
+28
-6
@@ -1694,13 +1694,35 @@ void etcp_connections_read_callback_socket(socket_t sock, void* arg) {
|
||||
|
||||
struct ETCP_LINK* existing_link = etcp_link_find_by_remote_id(conn, req->link_id);
|
||||
if (!existing_link) {
|
||||
existing_link = etcp_link_find_by_addr(e_sock, &addr);
|
||||
if (existing_link && existing_link->etcp == conn) {
|
||||
DEBUG_INFO(DEBUG_CATEGORY_CONNECTION, "[%s] found existing outbound link by addr for incoming INIT, reusing link=%p",
|
||||
conn->log_name, existing_link);
|
||||
} else {
|
||||
existing_link = NULL;
|
||||
existing_link = etcp_link_find_by_addr(e_sock, &addr);
|
||||
if (existing_link && existing_link->etcp == conn) {
|
||||
if (memcmp(conn->crypto_ctx.peer_public_key, sc.peer_public_key, SC_PUBKEY_SIZE)) {
|
||||
DEBUG_WARN(DEBUG_CATEGORY_CONNECTION, "[%s] link address match but pubkey mismatch, firing node_changed", conn->log_name);
|
||||
DEBUG_ERROR(DEBUG_CATEGORY_CRYPTO, "pubkey mismatch on reused link for node %016llx", (unsigned long long)peer_id);
|
||||
conn->callbacks_running = 1;
|
||||
struct etcp_cbk_entry* cbe = conn->node_changed_cbks;
|
||||
while (cbe) { struct etcp_cbk_entry* n = cbe->next; cbe->fn(conn, cbe->arg); cbe = n; }
|
||||
conn->callbacks_running = 0;
|
||||
errorcode = 67;
|
||||
goto ec_fr;
|
||||
}
|
||||
DEBUG_INFO(DEBUG_CATEGORY_CONNECTION, "[%s] found existing outbound link by addr for incoming INIT, reusing link=%p",
|
||||
conn->log_name, existing_link);
|
||||
} else if (existing_link) {
|
||||
struct ETCP_CONN* old_conn = existing_link->etcp;
|
||||
DEBUG_WARN(DEBUG_CATEGORY_CONNECTION, "[%s] conflicting link at %s belongs to %s, firing node_changed",
|
||||
conn->log_name, sockaddr_storage_to_str(&addr).str, old_conn->log_name);
|
||||
DEBUG_ERROR(DEBUG_CATEGORY_CRYPTO, "link address conflict for node %016llx, firing node_changed callbacks on %s",
|
||||
(unsigned long long)peer_id, old_conn->log_name);
|
||||
old_conn->callbacks_running = 1;
|
||||
struct etcp_cbk_entry* cbe = old_conn->node_changed_cbks;
|
||||
while (cbe) { struct etcp_cbk_entry* n = cbe->next; cbe->fn(old_conn, cbe->arg); cbe = n; }
|
||||
old_conn->callbacks_running = 0;
|
||||
errorcode = 67;
|
||||
goto ec_fr;
|
||||
} else {
|
||||
existing_link = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t send_reset = 0;
|
||||
|
||||
Reference in new issue
Block a user