From b8bef61a8f7d9b24064be8f2b6a0c6fca58c042d Mon Sep 17 00:00:00 2001 From: AltF4 Date: Wed, 9 Feb 2011 22:03:53 -0700 Subject: [PATCH 1/6] Fix time skew values from untrusted sources Now when we receive a large time skew from a source which isn't a trusted dir, we go contact a trusted dir to trigger a NETINFO cell. --- src/or/command.c | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/src/or/command.c b/src/or/command.c index 00d9af33fa..abe755e20d 100644 --- a/src/or/command.c +++ b/src/or/command.c @@ -44,6 +44,8 @@ uint64_t stats_n_destroy_cells_processed = 0; uint64_t stats_n_versions_cells_processed = 0; /** How many CELL_NETINFO cells have we received, ever? */ uint64_t stats_n_netinfo_cells_processed = 0; +/** Have we received skew info from a NETINFO cell from a trusted dir, ever? */ +static int received_skew_from_trusted_dir = 0; /* These are the main functions for processing cells */ static void command_process_create_cell(cell_t *cell, or_connection_t *conn); @@ -617,15 +619,19 @@ command_process_netinfo_cell(cell_t *cell, or_connection_t *conn) } /* Act on apparent skew. */ - /** Warn when we get a netinfo skew with at least this value. */ + /** Warn when we get a netinfo skew with at least this value. + Ignore if we've already recieved skew info from a trusted dir */ #define NETINFO_NOTICE_SKEW 3600 if (labs(apparent_skew) > NETINFO_NOTICE_SKEW && - router_get_by_digest(conn->identity_digest)) { + router_get_by_digest(conn->identity_digest) && + !received_skew_from_trusted_dir) { char dbuf[64]; int severity; /*XXXX be smarter about when everybody says we are skewed. */ - if (router_digest_is_trusted_dir(conn->identity_digest)) + if (router_digest_is_trusted_dir(conn->identity_digest)) { severity = LOG_WARN; + received_skew_from_trusted_dir = 1; + } else severity = LOG_INFO; format_time_interval(dbuf, sizeof(dbuf), apparent_skew); @@ -636,11 +642,29 @@ command_process_netinfo_cell(cell_t *cell, or_connection_t *conn) conn->_base.address, (int)conn->_base.port, apparent_skew>0 ? "ahead" : "behind", dbuf, apparent_skew>0 ? "behind" : "ahead"); - if (severity == LOG_WARN) /* only tell the controller if an authority */ + if (severity == LOG_WARN) { /* only tell the controller if an authority */ control_event_general_status(LOG_WARN, "CLOCK_SKEW SKEW=%ld SOURCE=OR:%s:%d", apparent_skew, conn->_base.address, conn->_base.port); + } + else { /* Connect to a trusted dir to trigger a NETINFO cell*/ + routerstatus_t *any_trusted_dir = + router_pick_trusteddirserver(NO_AUTHORITY, 0); + const tor_addr_t trusted_dir_addr; + tor_addr_from_ipv4n(&trusted_dir_addr, any_trusted_dir->addr); + connection_or_connect(&trusted_dir_addr, + any_trusted_dir->or_port, + any_trusted_dir->descriptor_digest); + + } + } + + /* Mark a flag if we get a good skew from a trusted dir */ + if (labs(apparent_skew) < NETINFO_NOTICE_SKEW && + router_digest_is_trusted_dir(conn->identity_digest) && + !received_skew_from_trusted_dir) { + received_skew_from_trusted_dir = 1; } /* XXX maybe act on my_apparent_addr, if the source is sufficiently From 82023f6a1ebb25e48a9ccfd9d68f5ebc5ea8c4c0 Mon Sep 17 00:00:00 2001 From: AltF4 Date: Tue, 15 Feb 2011 22:32:21 -0700 Subject: [PATCH 2/6] Sebastian's Changes to #1074 Fixes some small mistakes with AltF4's #1074 fix --- src/or/command.c | 34 ++++++++++++---------------------- 1 file changed, 12 insertions(+), 22 deletions(-) diff --git a/src/or/command.c b/src/or/command.c index abe755e20d..c8735165e2 100644 --- a/src/or/command.c +++ b/src/or/command.c @@ -44,8 +44,9 @@ uint64_t stats_n_destroy_cells_processed = 0; uint64_t stats_n_versions_cells_processed = 0; /** How many CELL_NETINFO cells have we received, ever? */ uint64_t stats_n_netinfo_cells_processed = 0; -/** Have we received skew info from a NETINFO cell from a trusted dir, ever? */ -static int received_skew_from_trusted_dir = 0; +/** Have we received a NETINFO cell from a trusted dir, ever? Used + * to decide what to do about time skew. */ +static int received_netinfo_from_trusted_dir = 0; /* These are the main functions for processing cells */ static void command_process_create_cell(cell_t *cell, or_connection_t *conn); @@ -620,20 +621,15 @@ command_process_netinfo_cell(cell_t *cell, or_connection_t *conn) /* Act on apparent skew. */ /** Warn when we get a netinfo skew with at least this value. - Ignore if we've already recieved skew info from a trusted dir */ + Ignore if we've already received skew info from a trusted dir */ #define NETINFO_NOTICE_SKEW 3600 if (labs(apparent_skew) > NETINFO_NOTICE_SKEW && router_get_by_digest(conn->identity_digest) && - !received_skew_from_trusted_dir) { + !received_netinfo_from_trusted_dir) { char dbuf[64]; - int severity; /*XXXX be smarter about when everybody says we are skewed. */ - if (router_digest_is_trusted_dir(conn->identity_digest)) { - severity = LOG_WARN; - received_skew_from_trusted_dir = 1; - } - else - severity = LOG_INFO; + int severity = router_digest_is_trusted_dir(conn->identity_digest) ? + LOG_WARN : LOG_INFO; format_time_interval(dbuf, sizeof(dbuf), apparent_skew); log_fn(severity, LD_GENERAL, "Received NETINFO cell with skewed time from " "server at %s:%d. It seems that our clock is %s by %s, or " @@ -647,25 +643,20 @@ command_process_netinfo_cell(cell_t *cell, or_connection_t *conn) "CLOCK_SKEW SKEW=%ld SOURCE=OR:%s:%d", apparent_skew, conn->_base.address, conn->_base.port); - } - else { /* Connect to a trusted dir to trigger a NETINFO cell*/ + } else { /* Connect to a trusted dir to trigger a NETINFO cell*/ routerstatus_t *any_trusted_dir = router_pick_trusteddirserver(NO_AUTHORITY, 0); - const tor_addr_t trusted_dir_addr; + tor_addr_t trusted_dir_addr; tor_addr_from_ipv4n(&trusted_dir_addr, any_trusted_dir->addr); connection_or_connect(&trusted_dir_addr, any_trusted_dir->or_port, any_trusted_dir->descriptor_digest); - } } - /* Mark a flag if we get a good skew from a trusted dir */ - if (labs(apparent_skew) < NETINFO_NOTICE_SKEW && - router_digest_is_trusted_dir(conn->identity_digest) && - !received_skew_from_trusted_dir) { - received_skew_from_trusted_dir = 1; - } + /* Note that we received a netinfo cell from a trusted directory */ + if (router_digest_is_trusted_dir(conn->identity_digest)) + received_netinfo_from_trusted_dir = 1; /* XXX maybe act on my_apparent_addr, if the source is sufficiently * trustworthy. */ @@ -679,4 +670,3 @@ command_process_netinfo_cell(cell_t *cell, or_connection_t *conn) conn->_base.port, (int)conn->link_proto); assert_connection_ok(TO_CONN(conn),time(NULL)); } - From 24096d0cec3084b2cbc1c35cbb26a5d92dd4add2 Mon Sep 17 00:00:00 2001 From: AltF4 Date: Tue, 15 Feb 2011 22:36:41 -0700 Subject: [PATCH 3/6] Fix for #1074 "Part 3" Changed received_netinfo_from_trusted_dir into a tristate in order to keep track of whether we have already tried contacting a trusted dir. So we don't send multiple requests if we get a bunch of skews. --- src/or/command.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/or/command.c b/src/or/command.c index c8735165e2..44420c980b 100644 --- a/src/or/command.c +++ b/src/or/command.c @@ -45,7 +45,11 @@ uint64_t stats_n_versions_cells_processed = 0; /** How many CELL_NETINFO cells have we received, ever? */ uint64_t stats_n_netinfo_cells_processed = 0; /** Have we received a NETINFO cell from a trusted dir, ever? Used - * to decide what to do about time skew. */ + * to decide what to do about time skew. + * 0 == No, and and we haven't tried asking an authority yet + * 1 == No, we've launched a query but haven't heard back yet + * 2 == Yes + **/ static int received_netinfo_from_trusted_dir = 0; /* These are the main functions for processing cells */ @@ -625,9 +629,9 @@ command_process_netinfo_cell(cell_t *cell, or_connection_t *conn) #define NETINFO_NOTICE_SKEW 3600 if (labs(apparent_skew) > NETINFO_NOTICE_SKEW && router_get_by_digest(conn->identity_digest) && - !received_netinfo_from_trusted_dir) { + received_netinfo_from_trusted_dir != 2) { char dbuf[64]; - /*XXXX be smarter about when everybody says we are skewed. */ + int severity = router_digest_is_trusted_dir(conn->identity_digest) ? LOG_WARN : LOG_INFO; format_time_interval(dbuf, sizeof(dbuf), apparent_skew); @@ -643,7 +647,10 @@ command_process_netinfo_cell(cell_t *cell, or_connection_t *conn) "CLOCK_SKEW SKEW=%ld SOURCE=OR:%s:%d", apparent_skew, conn->_base.address, conn->_base.port); - } else { /* Connect to a trusted dir to trigger a NETINFO cell*/ + received_netinfo_from_trusted_dir = 2; + /* Connect to a trusted dir to trigger a NETINFO cell + * only if we haven't already */ + } else if(received_netinfo_from_trusted_dir == 0) { routerstatus_t *any_trusted_dir = router_pick_trusteddirserver(NO_AUTHORITY, 0); tor_addr_t trusted_dir_addr; @@ -651,12 +658,14 @@ command_process_netinfo_cell(cell_t *cell, or_connection_t *conn) connection_or_connect(&trusted_dir_addr, any_trusted_dir->or_port, any_trusted_dir->descriptor_digest); + received_netinfo_from_trusted_dir = 1; } } - /* Note that we received a netinfo cell from a trusted directory */ - if (router_digest_is_trusted_dir(conn->identity_digest)) - received_netinfo_from_trusted_dir = 1; + /* Note that we received a good netinfo cell from a trusted directory */ + if (router_digest_is_trusted_dir(conn->identity_digest) && + labs(apparent_skew) <= NETINFO_NOTICE_SKEW) + received_netinfo_from_trusted_dir = 2; /* XXX maybe act on my_apparent_addr, if the source is sufficiently * trustworthy. */ From 612c7f32424d31dac51baad22e17ff4faf2b9b43 Mon Sep 17 00:00:00 2001 From: AltF4 Date: Wed, 23 Feb 2011 21:33:06 -0700 Subject: [PATCH 4/6] Fix for #1074 previous rev Changed tor_addr_from_ipv4n to tor_addr_from_ipv4h and changed descriptor_digest to identity_digest --- src/or/command.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/or/command.c b/src/or/command.c index 44420c980b..ef3a55963c 100644 --- a/src/or/command.c +++ b/src/or/command.c @@ -654,10 +654,10 @@ command_process_netinfo_cell(cell_t *cell, or_connection_t *conn) routerstatus_t *any_trusted_dir = router_pick_trusteddirserver(NO_AUTHORITY, 0); tor_addr_t trusted_dir_addr; - tor_addr_from_ipv4n(&trusted_dir_addr, any_trusted_dir->addr); + tor_addr_from_ipv4h(&trusted_dir_addr, any_trusted_dir->addr); connection_or_connect(&trusted_dir_addr, any_trusted_dir->or_port, - any_trusted_dir->descriptor_digest); + any_trusted_dir->identity_digest); received_netinfo_from_trusted_dir = 1; } } From c94f3711ee0eb7b740c7ad48d62c6d42ade863e5 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Fri, 25 Feb 2011 12:05:33 -0500 Subject: [PATCH 5/6] whitespace fixup --- src/or/command.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/or/command.c b/src/or/command.c index ef3a55963c..e026997bc1 100644 --- a/src/or/command.c +++ b/src/or/command.c @@ -650,7 +650,7 @@ command_process_netinfo_cell(cell_t *cell, or_connection_t *conn) received_netinfo_from_trusted_dir = 2; /* Connect to a trusted dir to trigger a NETINFO cell * only if we haven't already */ - } else if(received_netinfo_from_trusted_dir == 0) { + } else if (received_netinfo_from_trusted_dir == 0) { routerstatus_t *any_trusted_dir = router_pick_trusteddirserver(NO_AUTHORITY, 0); tor_addr_t trusted_dir_addr; @@ -679,3 +679,4 @@ command_process_netinfo_cell(cell_t *cell, or_connection_t *conn) conn->_base.port, (int)conn->link_proto); assert_connection_ok(TO_CONN(conn),time(NULL)); } + From 22810d740c33d71896822ec20d819724a8a38427 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Fri, 25 Feb 2011 12:12:02 -0500 Subject: [PATCH 6/6] Changes file for altf4's bug1074 stuff --- changes/launch_authcon_on_skew | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 changes/launch_authcon_on_skew diff --git a/changes/launch_authcon_on_skew b/changes/launch_authcon_on_skew new file mode 100644 index 0000000000..276e860575 --- /dev/null +++ b/changes/launch_authcon_on_skew @@ -0,0 +1,7 @@ + o Minor features + - When we get a connection from a non-authority that tells us our + clock is skewed, and we haven't heard about clock skew (or lack + thereof) from an authority, launch a connection to an authority + so we can find out whether we're really skewed. Related to + bug 1074. Patch from "AltF4". +