[tor-dev] [RFC] On new guard algorithms and data structures

George Kadianakis desnacked at riseup.net
Thu Aug 20 11:28:26 UTC 2015


Hello there,

recently we've been busy specifying various important improvements to entry
guard security. For instance see proposals 250, 241 and ticket #16861.

Unfortunately, the current guard codebase is dusty and full of problems (see
#12466, #12450). We believe that refactoring and cleaning up the entry guard
code is essential before we proceed to more advanced security improvements.

We've been working on new algorithms and data structures for guard nodes as part
of ticket #12595.

In this mail I include some pseudocode for this new algorithm with the hope that
it will act as a draft for implementing these changes. You can find the pseucode
here:

   https://gitweb.torproject.org/user/asn/tor.git/tree/src/or/guardlist.c?h=bug12595

A short description of the algorithm is included on top, and then various
methods and functions are prototyped underneath to make the logic more concrete.

Apart from the comments and XXXs on the code, here are some more thoughts on
this work:

- This new design focuses on protecting against path bias attacks, by slightly
  damaging our reachability.

  Specifically, the old design is better at recovering in filtered networks,
  because it will keep on adding new nodes till one succeeds. In this new
  design, we will not try more than 80 relays per time. So if none of them
  passes the filtered network, bad luck no Tor.

  While this failure mode should not happen much, it's bad news for users behind
  FascistFirewalls which are actually quite frequent. A quick fix here would be
  to always add an 80/443 guard on our list, however as it stands only 30% of
  the guards are 80/443 guards, so this has bad anonymity consequences.

- To improve our algorithm and make it more robust we need to understand further
  what kind of path bias attacks are relevant here. The adversary here is a
  network adversary (like a gateway) that can block our connections to certain
  guards. What nasty attacks can this adversary do?

  If we can't find bad attacks here, then maybe we should stop worrying about
  those path bias attacks so much.

  For example a threat here with the old guard logic, is that if we used this
  evil gateway just for 10 minutes (in an airport), the adversary could launch a
  path bias attack and force us to connect to her guard node. Then even after we
  left that airport, we would still stick to the evil guard node which is bad.

  Also, an adversary that manages to own our guard using path bias attacks, then
  has further possibilites for biasing the rest of the circuit. What can this
  adversary do?

- Notice that the pseudocode contains no logic about bridges. I'm not sure how
  bridges should be handled here.

- I tried to keep the dirguard logic very simple, hoping that we can eventually
  forget about dirguards entirely when #12538 is done.

  The main dirguard feature is that we assume that populate_live_entry_guards()
  and add_an_entry_guard() will return dirguards when the circuit is a directory
  circuit.

  Maybe we should consider introducing the "primary dirguard" concept as well.
  And maybe also add some logic where Tor will move on to the next dirguard if
  it failed to receive a document from the current dirguard.

- I used the ATTEMPTED_THRESHOLD concept of prop241, but did not use the
  NET_THRESHOLD and CONNECTED_THRESHOLD ideas.

  I removed NET_THRESHOLD because I increased the value of ATTEMPTED_THRESHOLD
  to the point that it can also be used as a network down indicator.

  Also, I was not sure what CONNECTED_THRESHOLD was useful for, and there were
  certain engineering issues with it (Like, if that threshold is hit, we need a
  logic that will *only retry the successfully connected guards*, and not all
  guards).

- There is no log message warning the user of path bias attacks or bad network
  or anything.  That's because there is no way to figure out what's the problem,
  and issuing an alarming log message here would confuse and panic the user.

  If we want to inform the user anyhow, maybe if the user is *actively* trying
  to visit a destination, and we've been cycling through our guard list for
  ages, maybe we should then issue a log message telling the user that something
  is wrong with the network.

- In general, I tried to keep the number of heuristics and kludges to the
  minimum to keep the logic simple. Unfortunately, it seems that without a
  "network down" indicator (#16120) there is no way to avoid edge cases and
  false positives here.

  We should try to fix all problems here that can occur frequently or have
  security consequences, but there will always be scenarios where Tor will end
  up thinking there is no network while it's actually on a filternet. For this
  reason, we should give plenty of testing to this feature before we ship it to
  real users!

- Finally, all the constants & parameters in the pseudocode are subject to
  change. I tried to motivate some of them, but others are just arbitrary.

Feedback is very welcome and please let me know of any issues with security or
reachability that you find! Or of how the pseudocode should be altered to make
it more useful for implementors.

Cheers!



More information about the tor-dev mailing list