circuitbuild_relay.c (20348B)
1 /* Copyright (c) 2001 Matej Pfajfar. 2 * Copyright (c) 2001-2004, Roger Dingledine. 3 * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. 4 * Copyright (c) 2007-2021, The Tor Project, Inc. */ 5 /* See LICENSE for licensing information */ 6 7 /** 8 * @file circuitbuild_relay.c 9 * @brief Implements the details of exteding circuits (by relaying extend 10 * cells as create cells, and answering create cells). 11 * 12 * On the server side, this module handles the logic of responding to 13 * RELAY_EXTEND requests, using circuit_extend() and onionskin_answer(). 14 * 15 * The shared client and server code is in core/or/circuitbuild.c. 16 **/ 17 18 #include "orconfig.h" 19 #include "feature/relay/circuitbuild_relay.h" 20 21 #include "lib/crypt_ops/crypto_rand.h" 22 23 #include "core/or/or.h" 24 #include "app/config/config.h" 25 26 #include "core/crypto/relay_crypto.h" 27 28 #include "core/or/cell_st.h" 29 #include "core/or/circuit_st.h" 30 #include "core/or/extend_info_st.h" 31 #include "core/or/or_circuit_st.h" 32 33 #include "core/or/channel.h" 34 #include "core/or/circuitbuild.h" 35 #include "core/or/circuitlist.h" 36 #include "core/or/extendinfo.h" 37 #include "core/or/onion.h" 38 #include "core/or/relay.h" 39 40 #include "feature/nodelist/nodelist.h" 41 42 #include "feature/relay/router.h" 43 #include "feature/relay/routermode.h" 44 #include "feature/relay/selftest.h" 45 46 /* Before replying to an extend cell, check the state of the circuit 47 * <b>circ</b>, and the configured tor mode. 48 * 49 * <b>circ</b> must not be NULL. 50 * 51 * If the state and mode are valid, return 0. 52 * Otherwise, if they are invalid, log a protocol warning, and return -1. 53 */ 54 STATIC int 55 circuit_extend_state_valid_helper(const struct circuit_t *circ) 56 { 57 if (!server_mode(get_options())) { 58 circuitbuild_warn_client_extend(); 59 return -1; 60 } 61 62 IF_BUG_ONCE(!circ) { 63 return -1; 64 } 65 66 if (circ->n_chan) { 67 log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, 68 "n_chan already set. Bug/attack. Closing."); 69 return -1; 70 } 71 72 if (circ->n_hop) { 73 log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, 74 "conn to next hop already launched. Bug/attack. Closing."); 75 return -1; 76 } 77 78 return 0; 79 } 80 81 /* Make sure the extend cell <b>ec</b> has an ed25519 link specifier. 82 * 83 * First, check that the RSA node id is valid. 84 * If the node id is valid, add the ed25519 link specifier (if required), 85 * and return 0. 86 * 87 * Otherwise, if the node id is invalid, log a protocol warning, 88 * and return -1.(And do not modify the extend cell.) 89 * 90 * Must be called before circuit_extend_lspec_valid_helper(). 91 */ 92 STATIC int 93 circuit_extend_add_ed25519_helper(struct extend_cell_t *ec) 94 { 95 IF_BUG_ONCE(!ec) { 96 return -1; 97 } 98 99 /* Check if they asked us for 0000..0000. We support using 100 * an empty fingerprint for the first hop (e.g. for a bridge relay), 101 * but we don't want to let clients send us extend cells for empty 102 * fingerprints -- a) because it opens the user up to a mitm attack, 103 * and b) because it lets an attacker force the relay to hold open a 104 * new TLS connection for each extend request. */ 105 if (tor_digest_is_zero((const char*)ec->node_id)) { 106 log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, 107 "Client asked me to extend without specifying an id_digest."); 108 return -1; 109 } 110 111 /* Fill in ed_pubkey if it was not provided and we can infer it from 112 * our networkstatus */ 113 if (ed25519_public_key_is_zero(&ec->ed_pubkey)) { 114 const node_t *node = node_get_by_id((const char*)ec->node_id); 115 const ed25519_public_key_t *node_ed_id = NULL; 116 if (node && 117 node_supports_ed25519_link_authentication(node, 1) && 118 (node_ed_id = node_get_ed25519_id(node))) { 119 ed25519_pubkey_copy(&ec->ed_pubkey, node_ed_id); 120 } 121 } 122 123 return 0; 124 } 125 126 /* Make sure the extend cell <b>ec</b> has an IPv4 address if the relay 127 * supports in, and if not, fill it in. */ 128 STATIC int 129 circuit_extend_add_ipv4_helper(struct extend_cell_t *ec) 130 { 131 IF_BUG_ONCE(!ec) { 132 return -1; 133 } 134 135 const node_t *node = node_get_by_id((const char *) ec->node_id); 136 if (node) { 137 tor_addr_port_t node_ipv4; 138 node_get_prim_orport(node, &node_ipv4); 139 if (tor_addr_is_null(&ec->orport_ipv4.addr) && 140 !tor_addr_is_null(&node_ipv4.addr)) { 141 tor_addr_copy(&ec->orport_ipv4.addr, &node_ipv4.addr); 142 ec->orport_ipv4.port = node_ipv4.port; 143 } 144 } 145 146 return 0; 147 } 148 149 /* Make sure the extend cell <b>ec</b> has an IPv6 address if the relay 150 * supports in, and if not, fill it in. */ 151 STATIC int 152 circuit_extend_add_ipv6_helper(struct extend_cell_t *ec) 153 { 154 IF_BUG_ONCE(!ec) { 155 return -1; 156 } 157 158 const node_t *node = node_get_by_id((const char *) ec->node_id); 159 if (node) { 160 tor_addr_port_t node_ipv6; 161 node_get_pref_ipv6_orport(node, &node_ipv6); 162 if (tor_addr_is_null(&ec->orport_ipv6.addr) && 163 !tor_addr_is_null(&node_ipv6.addr)) { 164 tor_addr_copy(&ec->orport_ipv6.addr, &node_ipv6.addr); 165 ec->orport_ipv6.port = node_ipv6.port; 166 } 167 } 168 169 return 0; 170 } 171 172 /* Check if the address and port in the tor_addr_port_t <b>ap</b> are valid, 173 * and are allowed by the current ExtendAllowPrivateAddresses config. 174 * 175 * If they are valid, return true. 176 * Otherwise, if they are invalid, return false. 177 * 178 * If <b>log_zero_addrs</b> is true, log warnings about zero addresses at 179 * <b>log_level</b>. If <b>log_internal_addrs</b> is true, log warnings about 180 * internal addresses at <b>log_level</b>. 181 */ 182 static bool 183 circuit_extend_addr_port_is_valid(const struct tor_addr_port_t *ap, 184 bool log_zero_addrs, bool log_internal_addrs, 185 int log_level) 186 { 187 /* It's safe to print the family. But we don't want to print the address, 188 * unless specifically configured to do so. (Zero addresses aren't sensitive, 189 * But some internal addresses might be.)*/ 190 191 if (!tor_addr_port_is_valid_ap(ap, 0)) { 192 if (log_zero_addrs) { 193 log_fn(log_level, LD_PROTOCOL, 194 "Client asked me to extend to a zero destination port or " 195 "%s address '%s'.", 196 fmt_addr_family(&ap->addr), safe_str(fmt_addrport_ap(ap))); 197 } 198 return false; 199 } 200 201 if (tor_addr_is_internal(&ap->addr, 0) && 202 !get_options()->ExtendAllowPrivateAddresses) { 203 if (log_internal_addrs) { 204 log_fn(log_level, LD_PROTOCOL, 205 "Client asked me to extend to a private %s address '%s'.", 206 fmt_addr_family(&ap->addr), 207 safe_str(fmt_and_decorate_addr(&ap->addr))); 208 } 209 return false; 210 } 211 212 return true; 213 } 214 215 /* Before replying to an extend cell, check the link specifiers in the extend 216 * cell <b>ec</b>, which was received on the circuit <b>circ</b>. 217 * 218 * If they are valid, return 0. 219 * Otherwise, if they are invalid, log a protocol warning, and return -1. 220 * 221 * Must be called after circuit_extend_add_ed25519_helper(). 222 */ 223 STATIC int 224 circuit_extend_lspec_valid_helper(const struct extend_cell_t *ec, 225 const struct circuit_t *circ) 226 { 227 IF_BUG_ONCE(!ec) { 228 return -1; 229 } 230 231 IF_BUG_ONCE(!circ) { 232 return -1; 233 } 234 235 /* Check the addresses, without logging */ 236 const int ipv4_valid = circuit_extend_addr_port_is_valid(&ec->orport_ipv4, 237 false, false, 0); 238 const int ipv6_valid = circuit_extend_addr_port_is_valid(&ec->orport_ipv6, 239 false, false, 0); 240 /* We need at least one valid address */ 241 if (!ipv4_valid && !ipv6_valid) { 242 /* Now, log the invalid addresses at protocol warning level */ 243 circuit_extend_addr_port_is_valid(&ec->orport_ipv4, 244 true, true, LOG_PROTOCOL_WARN); 245 circuit_extend_addr_port_is_valid(&ec->orport_ipv6, 246 true, true, LOG_PROTOCOL_WARN); 247 /* And fail */ 248 return -1; 249 } else if (!ipv4_valid) { 250 /* Always log unexpected internal addresses, but go on to use the other 251 * valid address */ 252 circuit_extend_addr_port_is_valid(&ec->orport_ipv4, 253 false, true, LOG_PROTOCOL_WARN); 254 } else if (!ipv6_valid) { 255 circuit_extend_addr_port_is_valid(&ec->orport_ipv6, 256 false, true, LOG_PROTOCOL_WARN); 257 } 258 259 IF_BUG_ONCE(circ->magic != OR_CIRCUIT_MAGIC) { 260 return -1; 261 } 262 263 const channel_t *p_chan = CONST_TO_OR_CIRCUIT(circ)->p_chan; 264 265 IF_BUG_ONCE(!p_chan) { 266 return -1; 267 } 268 269 /* Next, check if we're being asked to connect to the hop that the 270 * extend cell came from. There isn't any reason for that, and it can 271 * assist circular-path attacks. */ 272 if (tor_memeq(ec->node_id, p_chan->identity_digest, DIGEST_LEN)) { 273 log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, 274 "Client asked me to extend back to the previous hop."); 275 return -1; 276 } 277 278 /* Check the previous hop Ed25519 ID too */ 279 if (! ed25519_public_key_is_zero(&ec->ed_pubkey) && 280 ed25519_pubkey_eq(&ec->ed_pubkey, &p_chan->ed25519_identity)) { 281 log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, 282 "Client asked me to extend back to the previous hop " 283 "(by Ed25519 ID)."); 284 return -1; 285 } 286 287 return 0; 288 } 289 290 /* If possible, return a supported, non-NULL IP address. 291 * 292 * If both addresses are supported and non-NULL, choose one uniformly at 293 * random. 294 * 295 * If we have an IPv6-only extend, but IPv6 is not supported, returns NULL. 296 * If both addresses are NULL, also returns NULL. */ 297 STATIC const tor_addr_port_t * 298 circuit_choose_ip_ap_for_extend(const tor_addr_port_t *ipv4_ap, 299 const tor_addr_port_t *ipv6_ap) 300 { 301 const bool ipv6_supported = router_can_extend_over_ipv6(get_options()); 302 303 /* If IPv6 is not supported, we can't use the IPv6 address. */ 304 if (!ipv6_supported) { 305 ipv6_ap = NULL; 306 } 307 308 /* If there is no IPv6 address, IPv4 is always supported. 309 * Until clients include IPv6 ORPorts, and most relays support IPv6, 310 * this is the most common case. */ 311 if (!ipv6_ap) { 312 return ipv4_ap; 313 } 314 315 /* If there is no IPv4 address, return the (possibly NULL) IPv6 address. */ 316 if (!ipv4_ap) { 317 return ipv6_ap; 318 } 319 320 /* Now we have an IPv4 and an IPv6 address, and IPv6 is supported. 321 * So make an IPv6 connection at random, with probability 1 in N. 322 * 1 means "always IPv6 (and no IPv4)" 323 * 2 means "equal probability of IPv4 or IPv6" 324 * ... (and so on) ... 325 * (UINT_MAX - 1) means "almost always IPv4 (and almost never IPv6)" 326 * To disable IPv6, set ipv6_supported to 0. 327 */ 328 #define IPV6_CONNECTION_ONE_IN_N 2 329 330 bool choose_ipv6 = crypto_fast_rng_one_in_n(get_thread_fast_rng(), 331 IPV6_CONNECTION_ONE_IN_N); 332 if (choose_ipv6) { 333 return ipv6_ap; 334 } else { 335 return ipv4_ap; 336 } 337 } 338 339 /* When there is no open channel for an extend cell <b>ec</b>, set up the 340 * circuit <b>circ</b> to wait for a new connection. 341 * 342 * If <b>should_launch</b> is true, open a new connection. (Otherwise, we are 343 * already waiting for a new connection to the same relay.) 344 * 345 * Check if IPv6 extends are supported by our current configuration. If they 346 * are, new connections may be made over IPv4 or IPv6. (IPv4 connections are 347 * always supported.) 348 */ 349 STATIC void 350 circuit_open_connection_for_extend(const struct extend_cell_t *ec, 351 struct circuit_t *circ, 352 int should_launch) 353 { 354 /* We have to check circ first, so we can close it on all other failures */ 355 IF_BUG_ONCE(!circ) { 356 /* We can't mark a NULL circuit for close. */ 357 return; 358 } 359 360 /* Now we know that circ is not NULL */ 361 IF_BUG_ONCE(!ec) { 362 circuit_mark_for_close(circ, END_CIRC_REASON_CONNECTFAILED); 363 return; 364 } 365 366 /* Check the addresses, without logging */ 367 const int ipv4_valid = circuit_extend_addr_port_is_valid(&ec->orport_ipv4, 368 false, false, 0); 369 const int ipv6_valid = circuit_extend_addr_port_is_valid(&ec->orport_ipv6, 370 false, false, 0); 371 372 IF_BUG_ONCE(!ipv4_valid && !ipv6_valid) { 373 /* circuit_extend_lspec_valid_helper() should have caught this */ 374 circuit_mark_for_close(circ, END_CIRC_REASON_CONNECTFAILED); 375 return; 376 } 377 378 const tor_addr_port_t *chosen_ap = circuit_choose_ip_ap_for_extend( 379 ipv4_valid ? &ec->orport_ipv4 : NULL, 380 ipv6_valid ? &ec->orport_ipv6 : NULL); 381 if (!chosen_ap) { 382 /* An IPv6-only extend, but IPv6 is not supported */ 383 log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, 384 "Received IPv6-only extend, but we don't have an IPv6 ORPort."); 385 circuit_mark_for_close(circ, END_CIRC_REASON_CONNECTFAILED); 386 return; 387 } 388 389 circ->n_hop = extend_info_new(NULL /*nickname*/, 390 (const char*)ec->node_id, 391 &ec->ed_pubkey, 392 NULL, /*curve25519_key*/ 393 &chosen_ap->addr, 394 chosen_ap->port, 395 NULL /* protover summary */, 396 false); 397 398 circ->n_chan_create_cell = tor_memdup(&ec->create_cell, 399 sizeof(ec->create_cell)); 400 401 circuit_set_state(circ, CIRCUIT_STATE_CHAN_WAIT); 402 403 if (should_launch) { 404 /* we should try to open a connection */ 405 channel_t *n_chan = channel_connect_for_circuit(circ->n_hop); 406 if (!n_chan) { 407 log_info(LD_CIRC,"Launching n_chan failed. Closing circuit."); 408 circuit_mark_for_close(circ, END_CIRC_REASON_CONNECTFAILED); 409 return; 410 } 411 log_debug(LD_CIRC,"connecting in progress (or finished). Good."); 412 } 413 } 414 415 /** Take the 'extend' <b>cell</b>, pull out addr/port plus the onion 416 * skin and identity digest for the next hop. If we're already connected, 417 * pass the onion skin to the next hop using a create cell; otherwise 418 * launch a new OR connection, and <b>circ</b> will notice when the 419 * connection succeeds or fails. 420 * 421 * Return -1 if we want to warn and tear down the circuit, else return 0. 422 */ 423 int 424 circuit_extend(const relay_msg_t *rmsg, struct circuit_t *circ) 425 { 426 channel_t *n_chan; 427 extend_cell_t ec; 428 const char *msg = NULL; 429 int should_launch = 0; 430 431 IF_BUG_ONCE(!rmsg) { 432 return -1; 433 } 434 435 IF_BUG_ONCE(!circ) { 436 return -1; 437 } 438 439 if (circuit_extend_state_valid_helper(circ) < 0) 440 return -1; 441 442 /* We no longer accept EXTEND messages; only EXTEND2. */ 443 if (rmsg->command == RELAY_COMMAND_EXTEND) { 444 /* TODO: Should we log this? */ 445 return -1; 446 } 447 448 if (extend_cell_parse(&ec, rmsg->command, rmsg->body, rmsg->length) < 0) { 449 log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, 450 "Can't parse extend cell. Closing circuit."); 451 return -1; 452 } 453 454 if (circuit_extend_add_ed25519_helper(&ec) < 0) 455 return -1; 456 457 if (circuit_extend_lspec_valid_helper(&ec, circ) < 0) 458 return -1; 459 460 if (circuit_extend_add_ipv4_helper(&ec) < 0) 461 return -1; 462 463 if (circuit_extend_add_ipv6_helper(&ec) < 0) 464 return -1; 465 466 /* Check the addresses, without logging */ 467 const int ipv4_valid = circuit_extend_addr_port_is_valid(&ec.orport_ipv4, 468 false, false, 0); 469 const int ipv6_valid = circuit_extend_addr_port_is_valid(&ec.orport_ipv6, 470 false, false, 0); 471 IF_BUG_ONCE(!ipv4_valid && !ipv6_valid) { 472 /* circuit_extend_lspec_valid_helper() should have caught this */ 473 return -1; 474 } 475 476 n_chan = channel_get_for_extend((const char*)ec.node_id, 477 &ec.ed_pubkey, 478 ipv4_valid ? &ec.orport_ipv4.addr : NULL, 479 ipv6_valid ? &ec.orport_ipv6.addr : NULL, 480 false, 481 &msg, 482 &should_launch); 483 484 if (!n_chan) { 485 /* We can't use fmt_addr*() twice in the same function call, 486 * because it uses a static buffer. */ 487 log_debug(LD_CIRC|LD_OR, "Next router IPv4 (%s): %s.", 488 fmt_addrport_ap(&ec.orport_ipv4), 489 msg ? msg : "????"); 490 log_debug(LD_CIRC|LD_OR, "Next router IPv6 (%s).", 491 fmt_addrport_ap(&ec.orport_ipv6)); 492 493 circuit_open_connection_for_extend(&ec, circ, should_launch); 494 495 /* return success. The onion/circuit/etc will be taken care of 496 * automatically (may already have been) whenever n_chan reaches 497 * OR_CONN_STATE_OPEN. 498 */ 499 return 0; 500 } else { 501 /* Connection is already established. 502 * So we need to extend the circuit to the next hop. */ 503 tor_assert(!circ->n_hop); 504 circ->n_chan = n_chan; 505 log_debug(LD_CIRC, 506 "n_chan is %s.", 507 channel_describe_peer(n_chan)); 508 509 if (circuit_deliver_create_cell(circ, &ec.create_cell, 1) < 0) 510 return -1; 511 512 return 0; 513 } 514 } 515 516 /** On a relay, accept a create cell, initialise a circuit, and send a 517 * created cell back. 518 * 519 * Given: 520 * - a response payload consisting of: 521 * - the <b>created_cell</b> and 522 * - an optional <b>rend_circ_nonce</b>, and 523 * - <b>keys</b> of length <b>keys_len</b>, which must be 524 * CPATH_KEY_MATERIAL_LEN; 525 * then: 526 * - initialize the circuit <b>circ</b>'s cryptographic material, 527 * - set the circuit's state to open, and 528 * - send a created cell back on that circuit. 529 * 530 * If we haven't found our ORPorts reachable yet, and the channel meets the 531 * necessary conditions, mark the relevant ORPorts as reachable. 532 * 533 * Returns -1 if cell or circuit initialisation fails. 534 */ 535 int 536 onionskin_answer(struct or_circuit_t *circ, 537 const created_cell_t *created_cell, 538 relay_crypto_alg_t crypto_alg, 539 const char *keys, size_t keys_len, 540 const uint8_t *rend_circ_nonce) 541 { 542 cell_t cell; 543 544 IF_BUG_ONCE(!circ) { 545 return -1; 546 } 547 548 IF_BUG_ONCE(!created_cell) { 549 return -1; 550 } 551 552 IF_BUG_ONCE(!keys) { 553 return -1; 554 } 555 556 IF_BUG_ONCE(!rend_circ_nonce) { 557 return -1; 558 } 559 560 if (created_cell_format(&cell, created_cell) < 0) { 561 log_warn(LD_BUG,"couldn't format created cell (type=%d, len=%d).", 562 (int)created_cell->cell_type, (int)created_cell->handshake_len); 563 return -1; 564 } 565 cell.circ_id = circ->p_circ_id; 566 567 circuit_set_state(TO_CIRCUIT(circ), CIRCUIT_STATE_OPEN); 568 569 if (relay_crypto_init(crypto_alg, 570 &circ->crypto, keys, keys_len)<0) { 571 log_warn(LD_BUG,"Circuit initialization failed."); 572 return -1; 573 } 574 575 memcpy(circ->rend_circ_nonce, rend_circ_nonce, DIGEST_LEN); 576 577 int used_create_fast = (created_cell->cell_type == CELL_CREATED_FAST); 578 579 if (append_cell_to_circuit_queue(TO_CIRCUIT(circ), circ->p_chan, 580 &cell, CELL_DIRECTION_IN, 0) < 0) { 581 return -1; 582 } 583 log_debug(LD_CIRC,"Finished sending '%s' cell.", 584 used_create_fast ? "created_fast" : "created"); 585 586 /* Ignore the local bit when ExtendAllowPrivateAddresses is set: 587 * it violates the assumption that private addresses are local. 588 * Also, many test networks run on local addresses, and 589 * TestingTorNetwork sets ExtendAllowPrivateAddresses. */ 590 if ((!channel_is_local(circ->p_chan) 591 || get_options()->ExtendAllowPrivateAddresses) 592 && !channel_is_outgoing(circ->p_chan)) { 593 /* Okay, it's a create cell from a non-local connection 594 * that we didn't initiate. Presumably this means that create cells 595 * can reach us too. But what address can they reach us on? */ 596 const tor_addr_t *my_supposed_addr = &circ->p_chan->addr_according_to_peer; 597 if (router_addr_is_my_published_addr(my_supposed_addr)) { 598 /* Great, this create cell came on connection where the peer says 599 * that the our address is an address we're actually advertising! 600 * That should mean that we're reachable. But before we finally 601 * declare ourselves reachable, make sure that the address listed 602 * by the peer is the same family as the peer is actually using. 603 */ 604 tor_addr_t remote_addr; 605 int family = tor_addr_family(my_supposed_addr); 606 if (channel_get_addr_if_possible(circ->p_chan, &remote_addr) && 607 tor_addr_family(&remote_addr) == family) { 608 router_orport_found_reachable(family); 609 } 610 } 611 } 612 613 return 0; 614 }