Explorar el Código

When we mark a node as a sybil, mark it down and reset its uptime to 0

This prevents bug 8147, where such nodes would accrue points towards
Guard, Fast, HSDir, and so on.

Fixes bug 8147.
Nick Mathewson hace 11 años
padre
commit
4eff8b6530
Se han modificado 4 ficheros con 25 adiciones y 0 borrados
  1. 3 0
      changes/bug8146_etc
  2. 5 0
      src/or/dirserv.c
  3. 15 0
      src/or/rephist.c
  4. 2 0
      src/or/rephist.h

+ 3 - 0
changes/bug8146_etc

@@ -8,3 +8,6 @@
     - Do not consider nodes with extremely low bandwidths when deciding
       thresholds for various directory flags. Another fix for 8145.
 
+    - When marking a node as a likely sybil, reset its uptime metrics
+      to zero, so that it cannot time towards getting marked as Guard,
+      Stable, or HSDir. Fix for bug 8147.

+ 5 - 0
src/or/dirserv.c

@@ -2776,6 +2776,11 @@ dirserv_generate_networkstatus_vote_obj(crypto_pk_t *private_key,
   routers_sort_by_identity(routers);
   omit_as_sybil = get_possible_sybil_list(routers);
 
+  DIGESTMAP_FOREACH(omit_as_sybil, sybil_id, void *, ignore) {
+    (void) ignore;
+    rep_hist_make_router_pessimal(sybil_id, now);
+  } DIGESTMAP_FOREACH_END;
+
   dirserv_compute_performance_thresholds(rl, omit_as_sybil);
 
   routerstatuses = smartlist_new();

+ 15 - 0
src/or/rephist.c

@@ -422,6 +422,21 @@ rep_hist_note_router_unreachable(const char *id, time_t when)
   }
 }
 
+/** Mark a router with ID <b>id</b> as non-Running, and retroactively declare
+ * that it has never been running: give it no stability and no WFU. */
+void
+rep_hist_make_router_pessimal(const char *id, time_t when)
+{
+  or_history_t *hist = get_or_history(id);
+  tor_assert(hist);
+
+  rep_hist_note_router_unreachable(id, when);
+  mark_or_down(hist, when, 1);
+
+  hist->weighted_run_length = 0;
+  hist->weighted_uptime = 0;
+}
+
 /** Helper: Discount all old MTBF data, if it is time to do so.  Return
  * the time at which we should next discount MTBF data. */
 time_t

+ 2 - 0
src/or/rephist.h

@@ -24,6 +24,8 @@ void rep_hist_dump_stats(time_t now, int severity);
 void rep_hist_note_bytes_read(size_t num_bytes, time_t when);
 void rep_hist_note_bytes_written(size_t num_bytes, time_t when);
 
+void rep_hist_make_router_pessimal(const char *id, time_t when);
+
 void rep_hist_note_dir_bytes_read(size_t num_bytes, time_t when);
 void rep_hist_note_dir_bytes_written(size_t num_bytes, time_t when);