Browse Source

Безопасность: pubkey check при reusing линка + node_changed при конфликте адреса чужого конна

topo_upd
Evgeny 2 months ago
parent
commit
15ca0675c0
  1. 34
      src/etcp_connections.c

34
src/etcp_connections.c

@ -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;

Loading…
Cancel
Save