110-avoid-infinite-circuits.txt 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. Filename: 110-avoid-infinite-circuits.txt
  2. Title: Avoiding infinite length circuits
  3. Version: $Revision$
  4. Last-Modified: $Date$
  5. Author: Roger Dingledine
  6. Created: 13-Mar-2007
  7. Status: Accepted
  8. Target: 0.2.1.x
  9. Implemented-In: 0.2.1.3-alpha
  10. History:
  11. Revised 28 July 2008 by nickm: set K.
  12. Revised 3 July 2008 by nickm: rename from relay_extend to
  13. relay_early. Revise to current migration plan. Allow K cells
  14. over circuit lifetime, not just at start.
  15. Overview:
  16. Right now, an attacker can add load to the Tor network by extending a
  17. circuit an arbitrary number of times. Every cell that goes down the
  18. circuit then adds N times that amount of load in overall bandwidth
  19. use. This vulnerability arises because servers don't know their position
  20. on the path, so they can't tell how many nodes there are before them
  21. on the path.
  22. We propose a new set of relay cells that are distinguishable by
  23. intermediate hops as permitting extend cells. This approach will allow
  24. us to put an upper bound on circuit length relative to the number of
  25. colluding adversary nodes; but there are some downsides too.
  26. Motivation:
  27. The above attack can be used to generally increase load all across the
  28. network, or it can be used to target specific servers: by building a
  29. circuit back and forth between two victim servers, even a low-bandwidth
  30. attacker can soak up all the bandwidth offered by the fastest Tor
  31. servers.
  32. The general attacks could be used as a demonstration that Tor isn't
  33. perfect (leading to yet more media articles about "breaking" Tor), and
  34. the targetted attacks will come into play once we have a reputation
  35. system -- it will be trivial to DoS a server so it can't pass its
  36. reputation checks, in turn impacting security.
  37. Design:
  38. We should split RELAY cells into two types: RELAY and RELAY_EARLY.
  39. Only K (say, 10) Relay_early cells can be sent across a circuit, and
  40. only relay_early cells are allowed to contain extend requests. We
  41. still support obscuring the length of the circuit (if more research
  42. shows us what to do), because Alice can choose how many of the K to
  43. mark as relay_early. Note that relay_early cells *can* contain any
  44. sort of data cell; so in effect it's actually the relay type cells
  45. that are restricted. By default, she would just send the first K
  46. data cells over the stream as relay_early cells, regardless of their
  47. actual type.
  48. (Note that a circuit that is out of relay_early cells MUST NOT be
  49. cannibalized later, since it can't extend. Note also that it's always okay
  50. to use regular RELAY cells when sending non-EXTEND commands targetted at
  51. the first hop of a circuit, since there is no intermediate hop to try to
  52. learn the relay command type.)
  53. Each intermediate server would pass on the same type of cell that it
  54. received (either relay or relay_early), and the cell's destination
  55. will be able to learn whether it's allowed to contain an Extend request.
  56. If an intermediate server receives more than K relay_early cells, or
  57. if it sees a relay cell that contains an extend request, then it
  58. tears down the circuit (protocol violation).
  59. Security implications:
  60. The upside is that this limits the bandwidth amplification factor to
  61. K: for an individual circuit to become arbitrary-length, the attacker
  62. would need an adversary-controlled node every K hops, and at that
  63. point the attack is no worse than if the attacker creates N/K separate
  64. K-hop circuits.
  65. On the other hand, we want to pick a large enough value of K that we
  66. don't mind the cap.
  67. If we ever want to take steps to hide the number of hops in the circuit
  68. or a node's position in the circuit, this design probably makes that
  69. more complex.
  70. Migration:
  71. In 0.2.0, servers speaking v2 or later of the link protocol accept
  72. RELAY_EARLY cells, and pass them on. If the next OR in the circuit
  73. is not speaking the v2 link protocol, the server relays the cell as
  74. a RELAY cell.
  75. In 0.2.1.3-alpha, clients begin using RELAY_EARLY cells on v2
  76. connections. This functionality can be safely backported to
  77. 0.2.0.x. Clients should pick a random number betweeen (say) K and
  78. K-2 to send.
  79. In 0.2.1.3-alpha, servers close any circuit in which more than K
  80. relay_early cells are sent.
  81. Once all versions the do not send RELAY_EARLY cells are obsolete,
  82. servers can begin to reject any EXTEND requests not sent in a
  83. RELAY_EARLY cell.
  84. Parameters:
  85. Let K = 8, for no terribly good reason.
  86. Spec:
  87. [We can formalize this part once we think the design is a good one.]
  88. Acknowledgements:
  89. This design has been kicking around since Christian Grothoff and I came
  90. up with it at PET 2004. (Nathan Evans, Christian Grothoff's student,
  91. is working on implementing a fix based on this design in the summer
  92. 2007 timeframe.)