diff options
author | teor (Tim Wilson-Brown) <teor2345@gmail.com> | 2016-03-23 13:37:35 +1100 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2016-03-24 10:13:58 -0400 |
commit | f2153f9716876b87bfcc53ff13b86b878edaae86 (patch) | |
tree | f4ea20d094c9fbf4cb1d2ba594d52248cfc94f24 /src/or | |
parent | 45681f695c6096e280bc7ec3bf0a67c27708dbbc (diff) | |
download | tor-f2153f9716876b87bfcc53ff13b86b878edaae86.tar.gz tor-f2153f9716876b87bfcc53ff13b86b878edaae86.zip |
Always allow OR connections to bridges on private addresses
Regardless of the setting of ExtendAllowPrivateAddresses.
This fixes a bug with pluggable transports that ignore the
(potentially private) address in their bridge line.
Fixes bug 18517; bugfix on 23b088907f in tor-0.2.8.1-alpha.
Diffstat (limited to 'src/or')
-rw-r--r-- | src/or/circuitbuild.c | 11 | ||||
-rw-r--r-- | src/or/entrynodes.c | 24 | ||||
-rw-r--r-- | src/or/entrynodes.h | 3 |
3 files changed, 35 insertions, 3 deletions
diff --git a/src/or/circuitbuild.c b/src/or/circuitbuild.c index 237b61ab18..a5a933e6b0 100644 --- a/src/or/circuitbuild.c +++ b/src/or/circuitbuild.c @@ -495,14 +495,21 @@ circuit_handle_first_hop(origin_circuit_t *circ) int err_reason = 0; const char *msg = NULL; int should_launch = 0; + const or_options_t *options = get_options(); firsthop = onion_next_hop_in_cpath(circ->cpath); tor_assert(firsthop); tor_assert(firsthop->extend_info); - /* XX/teor - does tor ever need build a circuit directly to itself? */ + /* Some bridges are on private addresses. Others pass a dummy private + * address to the pluggable transport, which ignores it. + * Deny the connection if: + * - the address is internal, and + * - we're not connecting to a configured bridge, and + * - we're not configured to allow extends to private addresses. */ if (tor_addr_is_internal(&firsthop->extend_info->addr, 0) && - !get_options()->ExtendAllowPrivateAddresses) { + !extend_info_is_a_configured_bridge(firsthop->extend_info) && + !options->ExtendAllowPrivateAddresses) { log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, "Client asked me to connect directly to a private address"); return -END_CIRC_REASON_TORPROTOCOL; diff --git a/src/or/entrynodes.c b/src/or/entrynodes.c index 3287fcd584..8dbfeaecea 100644 --- a/src/or/entrynodes.c +++ b/src/or/entrynodes.c @@ -1795,7 +1795,7 @@ get_configured_bridge_by_orports_digest(const char *digest, } /** If we have a bridge configured whose digest matches <b>digest</b>, or a - * bridge with no known digest whose address matches <b>addr</b>:<b>/port</b>, + * bridge with no known digest whose address matches <b>addr</b>:<b>port</b>, * return that bridge. Else return NULL. If <b>digest</b> is NULL, check for * address/port matches only. */ static bridge_info_t * @@ -1818,6 +1818,28 @@ get_configured_bridge_by_addr_port_digest(const tor_addr_t *addr, return NULL; } +/** If we have a bridge configured whose digest matches <b>digest</b>, or a + * bridge with no known digest whose address matches <b>addr</b>:<b>port</b>, + * return 1. Else return 0. If <b>digest</b> is NULL, check for + * address/port matches only. */ +int addr_is_a_configured_bridge(const tor_addr_t *addr, + uint16_t port, + const char *digest) +{ + tor_assert(addr); + return get_configured_bridge_by_addr_port_digest(addr, port, digest) ? 1 : 0; +} + +/** If we have a bridge configured whose digest matches + * <b>ei->identity_digest</b>, or a bridge with no known digest whose address + * matches <b>ei->addr</b>:<b>ei->port</b>, return 1. Else return 0. + * If <b>ei->onion_key</b> is NULL, check for address/port matches only. */ +int extend_info_is_a_configured_bridge(const extend_info_t *ei) +{ + const char *digest = ei->onion_key ? ei->identity_digest : NULL; + return addr_is_a_configured_bridge(&ei->addr, ei->port, digest); +} + /** Wrapper around get_configured_bridge_by_addr_port_digest() to look * it up via router descriptor <b>ri</b>. */ static bridge_info_t * diff --git a/src/or/entrynodes.h b/src/or/entrynodes.h index 59147d19b5..247c80940e 100644 --- a/src/or/entrynodes.h +++ b/src/or/entrynodes.h @@ -127,6 +127,9 @@ int getinfo_helper_entry_guards(control_connection_t *conn, void mark_bridge_list(void); void sweep_bridge_list(void); +int addr_is_a_configured_bridge(const tor_addr_t *addr, uint16_t port, + const char *digest); +int extend_info_is_a_configured_bridge(const extend_info_t *ei); int routerinfo_is_a_configured_bridge(const routerinfo_t *ri); int node_is_a_configured_bridge(const node_t *node); void learned_router_identity(const tor_addr_t *addr, uint16_t port, |