1 Filename: 121-hidden-service-authentication.txt
2 Title: Hidden Service Authentication
3 Author: Tobias Kamm, Thomas Lauterbach, Karsten Loesing, Ferdinand Rieger,
7 Implemented-In: 0.2.1.x
11 26-Sep-2007 Initial proposal for or-dev
12 08-Dec-2007 Incorporated comments by Nick posted to or-dev on 10-Oct-2007
13 15-Dec-2007 Rewrote complete proposal for better readability, modified
14 authentication protocol, merged in personal notes
15 24-Dec-2007 Replaced misleading term "authentication" by "authorization"
16 and added some clarifications (comments by Sven Kaffille)
17 28-Apr-2008 Updated most parts of the concrete authorization protocol
18 04-Jul-2008 Add a simple algorithm to delay descriptor publication for
19 different clients of a hidden service
20 19-Jul-2008 Added INTRODUCE1V cell type (1.2), improved replay
21 protection for INTRODUCE2 cells (1.3), described limitations
22 for auth protocols (1.6), improved hidden service protocol
23 without client authorization (2.1), added second, more
24 scalable authorization protocol (2.2), rewrote existing
25 authorization protocol (2.3); changes based on discussion
27 31-Jul-2008 Limit maximum descriptor size to 20 kilobytes to prevent
29 01-Aug-2008 Use first part of Diffie-Hellman handshake for replay
30 protection instead of rendezvous cookie.
31 01-Aug-2008 Remove improved hidden service protocol without client
32 authorization (2.1). It might get implemented in proposal
37 This proposal deals with a general infrastructure for performing
38 authorization (not necessarily implying authentication) of requests to
39 hidden services at three points: (1) when downloading and decrypting
40 parts of the hidden service descriptor, (2) at the introduction point,
41 and (3) at Bob's Tor client before contacting the rendezvous point. A
42 service provider will be able to restrict access to his service at these
43 three points to authorized clients only. Further, the proposal contains
44 specific authorization protocols as instances that implement the
45 presented authorization infrastructure.
47 This proposal is based on v2 hidden service descriptors as described in
48 proposal 114 and introduced in version 0.2.0.10-alpha.
50 The proposal is structured as follows: The next section motivates the
51 integration of authorization mechanisms in the hidden service protocol.
52 Then we describe a general infrastructure for authorization in hidden
53 services, followed by specific authorization protocols for this
54 infrastructure. At the end we discuss a number of attacks and non-attacks
55 as well as compatibility issues.
59 The major part of hidden services does not require client authorization
60 now and won't do so in the future. To the contrary, many clients would
61 not want to be (pseudonymously) identifiable by the service (though this
62 is unavoidable to some extent), but rather use the service
63 anonymously. These services are not addressed by this proposal.
65 However, there may be certain services which are intended to be accessed
66 by a limited set of clients only. A possible application might be a
67 wiki or forum that should only be accessible for a closed user group.
68 Another, less intuitive example might be a real-time communication
69 service, where someone provides a presence and messaging service only to
70 his buddies. Finally, a possible application would be a personal home
71 server that should be remotely accessed by its owner.
73 Performing authorization for a hidden service within the Tor network, as
74 proposed here, offers a range of advantages compared to allowing all
75 client connections in the first instance and deferring authorization to
76 the transported protocol:
78 (1) Reduced traffic: Unauthorized requests would be rejected as early as
79 possible, thereby reducing the overall traffic in the network generated
80 by establishing circuits and sending cells.
82 (2) Better protection of service location: Unauthorized clients could not
83 force Bob to create circuits to their rendezvous points, thus preventing
84 the attack described by Ă˜verlier and Syverson in their paper "Locating
85 Hidden Servers" even without the need for guards.
87 (3) Hiding activity: Apart from performing the actual authorization, a
88 service provider could also hide the mere presence of his service from
89 unauthorized clients when not providing hidden service descriptors to
90 them, rejecting unauthorized requests already at the introduction
91 point (ideally without leaking presence information at any of these
92 points), or not answering unauthorized introduction requests.
94 (4) Better protection of introduction points: When providing hidden
95 service descriptors to authorized clients only and encrypting the
96 introduction points as described in proposal 114, the introduction points
97 would be unknown to unauthorized clients and thereby protected from DoS
100 (5) Protocol independence: Authorization could be performed for all
101 transported protocols, regardless of their own capabilities to do so.
103 (6) Ease of administration: A service provider running multiple hidden
104 services would be able to configure access at a single place uniformly
105 instead of doing so for all services separately.
107 (7) Optional QoS support: Bob could adapt his node selection algorithm
108 for building the circuit to Alice's rendezvous point depending on a
109 previously guaranteed QoS level, thus providing better latency or
110 bandwidth for selected clients.
112 A disadvantage of performing authorization within the Tor network is
113 that a hidden service cannot make use of authorization data in
114 the transported protocol. Tor hidden services were designed to be
115 independent of the transported protocol. Therefore it's only possible to
116 either grant or deny access to the whole service, but not to specific
117 resources of the service.
119 Authorization often implies authentication, i.e. proving one's identity.
120 However, when performing authorization within the Tor network, untrusted
121 points should not gain any useful information about the identities of
122 communicating parties, neither server nor client. A crucial challenge is
123 to remain anonymous towards directory servers and introduction points.
124 However, trying to hide identity from the hidden service is a futile
125 task, because a client would never know if he is the only authorized
126 client and therefore perfectly identifiable. Therefore, hiding client
127 identity from the hidden service is not an aim of this proposal.
129 The current implementation of hidden services does not provide any kind
130 of authorization. The hidden service descriptor version 2, introduced by
131 proposal 114, was designed to use a descriptor cookie for downloading and
132 decrypting parts of the descriptor content, but this feature is not yet
133 in use. Further, most relevant cell formats specified in rend-spec
134 contain fields for authorization data, but those fields are neither
135 implemented nor do they suffice entirely.
139 1. General infrastructure for authorization to hidden services
141 We spotted three possible authorization points in the hidden service
144 (1) when downloading and decrypting parts of the hidden service
146 (2) at the introduction point, and
147 (3) at Bob's Tor client before contacting the rendezvous point.
149 The general idea of this proposal is to allow service providers to
150 restrict access to some or all of these points to authorized clients
153 1.1. Client authorization at directory
155 Since the implementation of proposal 114 it is possible to combine a
156 hidden service descriptor with a so-called descriptor cookie. If done so,
157 the descriptor cookie becomes part of the descriptor ID, thus having an
158 effect on the storage location of the descriptor. Someone who has learned
159 about a service, but is not aware of the descriptor cookie, won't be able
160 to determine the descriptor ID and download the current hidden service
161 descriptor; he won't even know whether the service has uploaded a
162 descriptor recently. Descriptor IDs are calculated as follows (see
163 section 1.2 of rend-spec for the complete specification of v2 hidden
164 service descriptors):
167 H(service-id | H(time-period | descriptor-cookie | replica))
169 Currently, service-id is equivalent to permanent-id which is calculated
170 as in the following formula. But in principle it could be any public
173 permanent-id = H(permanent-key)[:10]
175 The second purpose of the descriptor cookie is to encrypt the list of
176 introduction points, including optional authorization data. Hence, the
177 hidden service directories won't learn any introduction information from
178 storing a hidden service descriptor. This feature is implemented but
179 unused at the moment. So this proposal will harness the advantages
182 The descriptor cookie can be used for authorization by keeping it secret
183 from everyone but authorized clients. A service could then decide whether
184 to publish hidden service descriptors using that descriptor cookie later
185 on. An authorized client being aware of the descriptor cookie would be
186 able to download and decrypt the hidden service descriptor.
188 The number of concurrently used descriptor cookies for one hidden service
189 is not restricted. A service could use a single descriptor cookie for all
190 users, a distinct cookie per user, or something in between, like one
191 cookie per group of users. It is up to the specific protocol and how it
192 is applied by a service provider.
194 Two or more hidden service descriptors for different groups or users
195 should not be uploaded at the same time. A directory node could conclude
196 easily that the descriptors were issued by the same hidden service, thus
197 being able to link the two groups or users. Therefore, descriptors for
198 different users or clients that ought to be stored on the same directory
199 are delayed, so that only one descriptor is uploaded to a directory at a
200 time. The remaining descriptors are uploaded with a delay of up to
202 Further, descriptors for different groups or users that are to be stored
203 on different directories are delayed for a random time of up to 30
204 seconds to hide relations from colluding directories. Certainly, this
205 does not prevent linking entirely, but it makes it somewhat harder.
206 There is a conflict between hiding links between clients and making a
207 service available in a timely manner.
209 Although this part of the proposal is meant to describe a general
210 infrastructure for authorization, changing the way of using the
211 descriptor cookie to look up hidden service descriptors, e.g. applying
212 some sort of asymmetric crypto system, would require in-depth changes
213 that would be incompatible to v2 hidden service descriptors. On the
214 contrary, using another key for en-/decrypting the introduction point
215 part of a hidden service descriptor, e.g. a different symmetric key or
216 asymmetric encryption, would be easy to implement and compatible to v2
217 hidden service descriptors as understood by hidden service directories
218 (clients and services would have to be upgraded anyway for using the new
221 An adversary could try to abuse the fact that introduction points can be
222 encrypted by storing arbitrary, unrelated data in the hidden service
223 directory. This abuse can be limited by setting a hard descriptor size
224 limit, forcing the adversary to split data into multiple chunks. There
225 are some limitations that make splitting data across multiple descriptors
226 unattractive: 1) The adversary would not be able to choose descriptor IDs
227 freely and would therefore have to implement his own indexing
228 structure. 2) Validity of descriptors is limited to at most 24 hours
229 after which descriptors need to be republished.
231 The regular descriptor size in bytes is 745 + num_ipos * 837 + auth_data.
232 A large descriptor with 7 introduction points and 5 kilobytes of
233 authorization data would be 11724 bytes in size. The upper size limit of
234 descriptors should be set to 20 kilobytes, which limits the effect of
235 abuse while retaining enough flexibility in designing authorization
238 1.2. Client authorization at introduction point
240 The next possible authorization point after downloading and decrypting
241 a hidden service descriptor is the introduction point. It may be important
242 for authorization, because it bears the last chance of hiding presence
243 of a hidden service from unauthorized clients. Further, performing
244 authorization at the introduction point might reduce traffic in the
245 network, because unauthorized requests would not be passed to the
246 hidden service. This applies to those clients who are aware of a
247 descriptor cookie and thereby of the hidden service descriptor, but do
248 not have authorization data to pass the introduction point or access the
249 service (such a situation might occur when authorization data for
250 authorization at the directory is not issued on a per-user basis, but
251 authorization data for authorization at the introduction point is).
253 It is important to note that the introduction point must be considered
254 untrustworthy, and therefore cannot replace authorization at the hidden
255 service itself. Nor should the introduction point learn any sensitive
256 identifiable information from either the service or the client.
258 In order to perform authorization at the introduction point, three
259 message formats need to be modified: (1) v2 hidden service descriptors,
260 (2) ESTABLISH_INTRO cells, and (3) INTRODUCE1 cells.
262 A v2 hidden service descriptor needs to contain authorization data that
263 is introduction-point-specific and sometimes also authorization data
264 that is introduction-point-independent. Therefore, v2 hidden service
265 descriptors as specified in section 1.2 of rend-spec already contain two
266 reserved fields "intro-authorization" and "service-authorization"
267 (originally, the names of these fields were "...-authentication")
268 containing an authorization type number and arbitrary authorization
269 data. We propose that authorization data consists of base64 encoded
270 objects of arbitrary length, surrounded by "-----BEGIN MESSAGE-----" and
271 "-----END MESSAGE-----". This will increase the size of hidden service
272 descriptors, but this is allowed since there is no strict upper limit.
274 The current ESTABLISH_INTRO cells as described in section 1.3 of
275 rend-spec do not contain either authorization data or version
276 information. Therefore, we propose a new version 1 of the ESTABLISH_INTRO
277 cells adding these two issues as follows:
279 V Format byte: set to 255 [1 octet]
280 V Version byte: set to 1 [1 octet]
281 KL Key length [2 octets]
282 PK Bob's public key [KL octets]
283 HS Hash of session info [20 octets]
284 AUTHT The auth type that is supported [1 octet]
285 AUTHL Length of auth data [2 octets]
286 AUTHD Auth data [variable]
287 SIG Signature of above information [variable]
289 From the format it is possible to determine the maximum allowed size for
290 authorization data: given the fact that cells are 512 octets long, of
291 which 498 octets are usable (see section 6.1 of tor-spec), and assuming
292 1024 bit = 128 octet long keys, there are 215 octets left for
293 authorization data. Hence, authorization protocols are bound to use no
294 more than these 215 octets, regardless of the number of clients that
295 shall be authenticated at the introduction point. Otherwise, one would
296 need to send multiple ESTABLISH_INTRO cells or split them up, which we do
299 In order to understand a v1 ESTABLISH_INTRO cell, the implementation of
300 a relay must have a certain Tor version. Hidden services need to be able
301 to distinguish relays being capable of understanding the new v1 cell
302 formats and perform authorization. We propose to use the version number
303 that is contained in networkstatus documents to find capable
306 The current INTRODUCE1 cell as described in section 1.8 of rend-spec is
307 not designed to carry authorization data and has no version number, too.
308 Unfortunately, unversioned INTRODUCE1 cells consist only of a fixed-size,
309 seemingly random PK_ID, followed by the encrypted INTRODUCE2 cell. This
310 makes it impossible to distinguish unversioned INTRODUCE1 cells from any
311 later format. In particular, it is not possible to introduce some kind of
312 format and version byte for newer versions of this cell. That's probably
313 where the comment "[XXX011 want to put intro-level auth info here, but no
314 version. crap. -RD]" that was part of rend-spec some time ago comes from.
316 We propose that new versioned INTRODUCE1 cells use the new cell type 41
317 RELAY_INTRODUCE1V (where V stands for versioned):
320 V Version byte: set to 1 [1 octet]
321 PK_ID Identifier for Bob's PK [20 octets]
322 AUTHT The auth type that is included [1 octet]
323 AUTHL Length of auth data [2 octets]
324 AUTHD Auth data [variable]
325 Encrypted to Bob's PK:
326 (RELAY_INTRODUCE2 cell)
328 The maximum length of contained authorization data depends on the length
329 of the contained INTRODUCE2 cell. A calculation follows below when
330 describing the INTRODUCE2 cell format we propose to use.
332 1.3. Client authorization at hidden service
334 The time when a hidden service receives an INTRODUCE2 cell constitutes
335 the last possible authorization point during the hidden service
336 protocol. Performing authorization here is easier than at the other two
337 authorization points, because there are no possibly untrusted entities
340 In general, a client that is successfully authorized at the introduction
341 point should be granted access at the hidden service, too. Otherwise, the
342 client would receive a positive INTRODUCE_ACK cell from the introduction
343 point and conclude that it may connect to the service, but the request
344 will be dropped without notice. This would appear as a failure to
345 clients. Therefore, the number of cases in which a client successfully
346 passes the introduction point but fails at the hidden service should be
347 zero. However, this does not lead to the conclusion that the
348 authorization data used at the introduction point and the hidden service
349 must be the same, but only that both authorization data should lead to
350 the same authorization result.
352 Authorization data is transmitted from client to server via an
353 INTRODUCE2 cell that is forwarded by the introduction point. There are
354 versions 0 to 2 specified in section 1.8 of rend-spec, but none of these
355 contain fields for carrying authorization data. We propose a slightly
356 modified version of v3 INTRODUCE2 cells that is specified in section
357 1.8.1 and which is not implemented as of December 2007. In contrast to
358 the specified v3 we avoid specifying (and implementing) IPv6 capabilities,
359 because Tor relays will be required to support IPv4 addresses for a long
360 time in the future, so that this seems unnecessary at the moment. The
361 proposed format of v3 INTRODUCE2 cells is as follows:
363 VER Version byte: set to 3. [1 octet]
364 AUTHT The auth type that is used [1 octet]
365 AUTHL Length of auth data [2 octets]
366 AUTHD Auth data [variable]
367 TS Timestamp (seconds since 1-1-1970) [4 octets]
368 IP Rendezvous point's address [4 octets]
369 PORT Rendezvous point's OR port [2 octets]
370 ID Rendezvous point identity ID [20 octets]
371 KLEN Length of onion key [2 octets]
372 KEY Rendezvous point onion key [KLEN octets]
373 RC Rendezvous cookie [20 octets]
374 g^x Diffie-Hellman data, part 1 [128 octets]
376 The maximum possible length of authorization data is related to the
377 enclosing INTRODUCE1V cell. A v3 INTRODUCE2 cell with
378 1024 bit = 128 octets long public key without any authorization data
379 occupies 306 octets (AUTHL is only used when AUTHT has a value != 0),
380 plus 58 octets for hybrid public key encryption (see
381 section 5.1 of tor-spec on hybrid encryption of CREATE cells). The
382 surrounding INTRODUCE1V cell requires 24 octets. This leaves only 110
383 of the 498 available octets free, which must be shared between
384 authorization data to the introduction point _and_ to the hidden
387 When receiving a v3 INTRODUCE2 cell, Bob checks whether a client has
388 provided valid authorization data to him. He also requires that the
389 timestamp is no more than 30 minutes in the past or future and that the
390 first part of the Diffie-Hellman handshake has not been used in the past
391 60 minutes to prevent replay attacks by rogue introduction points. (The
392 reason for not using the rendezvous cookie to detect replays---even
393 though it is only sent once in the current design---is that it might be
394 desirable to re-use rendezvous cookies for multiple introduction requests
395 in the future.) If all checks pass, Bob builds a circuit to the provided
396 rendezvous point. Otherwise he drops the cell.
398 1.4. Summary of authorization data fields
400 In summary, the proposed descriptor format and cell formats provide the
401 following fields for carrying authorization data:
403 (1) The v2 hidden service descriptor contains:
404 - a descriptor cookie that is used for the lookup process, and
405 - an arbitrary encryption schema to ensure authorization to access
406 introduction information (currently symmetric encryption with the
409 (2) For performing authorization at the introduction point we can use:
410 - the fields intro-authorization and service-authorization in
411 hidden service descriptors,
412 - a maximum of 215 octets in the ESTABLISH_INTRO cell, and
413 - one part of 110 octets in the INTRODUCE1V cell.
415 (3) For performing authorization at the hidden service we can use:
416 - the fields intro-authorization and service-authorization in
417 hidden service descriptors,
418 - the other part of 110 octets in the INTRODUCE2 cell.
420 It will also still be possible to access a hidden service without any
421 authorization or only use a part of the authorization infrastructure.
422 However, this requires to consider all parts of the infrastructure. For
423 example, authorization at the introduction point relying on confidential
424 intro-authorization data transported in the hidden service descriptor
425 cannot be performed without using an encryption schema for introduction
428 1.5. Managing authorization data at servers and clients
430 In order to provide authorization data at the hidden service and the
431 authenticated clients, we propose to use files---either the Tor
432 configuration file or separate files. The exact format of these special
433 files depends on the authorization protocol used.
435 Currently, rend-spec contains the proposition to encode client-side
436 authorization data in the URL, like in x.y.z.onion. This was never used
437 and is also a bad idea, because in case of HTTP the requested URL may be
438 contained in the Host and Referer fields.
440 1.6. Limitations for authorization protocols
442 There are two limitations of the current hidden service protocol for
443 authorization protocols that shall be identified here.
445 1. The three cell types ESTABLISH_INTRO, INTRODUCE1V, and INTRODUCE2
446 restricts the amount of data that can be used for authorization.
447 This forces authorization protocols that require per-user
448 authorization data at the introduction point to restrict the number
449 of authorized clients artificially. A possible solution could be to
450 split contents among multiple cells and reassemble them at the
453 2. The current hidden service protocol does not specify cell types to
454 perform interactive authorization between client and introduction
455 point or hidden service. If there should be an authorization
456 protocol that requires interaction, new cell types would have to be
457 defined and integrated into the hidden service protocol.
460 2. Specific authorization protocol instances
462 In the following we present two specific authorization protocols that
463 make use of (parts of) the new authorization infrastructure:
465 1. The first protocol allows a service provider to restrict access
466 to clients with a previously received secret key only, but does not
467 attempt to hide service activity from others.
469 2. The second protocol, albeit being feasible for a limited set of about
470 16 clients, performs client authorization and hides service activity
471 from everyone but the authorized clients.
473 These two protocol instances extend the existing hidden service protocol
474 version 2. Hidden services that perform client authorization may run in
475 parallel to other services running versions 0, 2, or both.
477 2.1. Service with large-scale client authorization
479 The first client authorization protocol aims at performing access control
480 while consuming as few additional resources as possible. A service
481 provider should be able to permit access to a large number of clients
482 while denying access for everyone else. However, the price for
483 scalability is that the service won't be able to hide its activity from
484 unauthorized or formerly authorized clients.
486 The main idea of this protocol is to encrypt the introduction-point part
487 in hidden service descriptors to authorized clients using symmetric keys.
488 This ensures that nobody else but authorized clients can learn which
489 introduction points a service currently uses, nor can someone send a
490 valid INTRODUCE1 message without knowing the introduction key. Therefore,
491 a subsequent authorization at the introduction point is not required.
493 A service provider generates symmetric "descriptor cookies" for his
494 clients and distributes them outside of Tor. The suggested key size is
495 128 bits, so that descriptor cookies can be encoded in 22 base64 chars
496 (which can hold up to 22 * 5 = 132 bits, leaving 4 bits to encode the
497 authorization type (here: "0") and allow a client to distinguish this
498 authorization protocol from others like the one proposed below).
499 Typically, the contact information for a hidden service using this
500 authorization protocol looks like this:
502 v2cbb2l4lsnpio4q.onion Ll3X7Xgz9eHGKCCnlFH0uz
504 When generating a hidden service descriptor, the service encrypts the
505 introduction-point part with a single randomly generated symmetric
506 128-bit session key using AES-CTR as described for v2 hidden service
507 descriptors in rend-spec. Afterwards, the service encrypts the session
508 key to all descriptor cookies using AES. Authorized client should be able
509 to efficiently find the session key that is encrypted for him/her, so
510 that 4 octet long client ID are generated consisting of descriptor cookie
511 and initialization vector. Descriptors always contain a number of
512 encrypted session keys that is a multiple of 16 by adding fake entries.
513 Encrypted session keys are ordered by client IDs in order to conceal
514 addition or removal of authorized clients by the service provider.
516 ATYPE Authorization type: set to 1. [1 octet]
517 ALEN Number of clients := 1 + ((clients - 1) div 16) [1 octet]
518 for each symmetric descriptor cookie:
519 ID Client ID: H(descriptor cookie | IV)[:4] [4 octets]
520 SKEY Session key encrypted with descriptor cookie [16 octets]
521 (end of client-specific part)
522 RND Random data [(15 - ((clients - 1) mod 16)) * 20 octets]
523 IV AES initialization vector [16 octets]
524 IPOS Intro points, encrypted with session key [remaining octets]
526 An authorized client needs to configure Tor to use the descriptor cookie
527 when accessing the hidden service. Therefore, a user adds the contact
528 information that she received from the service provider to her torrc
529 file. Upon downloading a hidden service descriptor, Tor finds the
530 encrypted introduction-point part and attempts to decrypt it using the
531 configured descriptor cookie. (In the rare event of two or more client
532 IDs being equal a client tries to decrypt all of them.)
534 Upon sending the introduction, the client includes her descriptor cookie
535 as auth type "1" in the INTRODUCE2 cell that she sends to the service.
536 The hidden service checks whether the included descriptor cookie is
537 authorized to access the service and either responds to the introduction
540 2.2. Authorization for limited number of clients
542 A second, more sophisticated client authorization protocol goes the extra
543 mile of hiding service activity from unauthorized clients. With all else
544 being equal to the preceding authorization protocol, the second protocol
545 publishes hidden service descriptors for each user separately and gets
546 along with encrypting the introduction-point part of descriptors to a
547 single client. This allows the service to stop publishing descriptors for
548 removed clients. As long as a removed client cannot link descriptors
549 issued for other clients to the service, it cannot derive service
550 activity any more. The downside of this approach is limited scalability.
551 Even though the distributed storage of descriptors (cf. proposal 114)
552 tackles the problem of limited scalability to a certain extent, this
553 protocol should not be used for services with more than 16 clients. (In
554 fact, Tor should refuse to advertise services for more than this number
557 A hidden service generates an asymmetric "client key" and a symmetric
558 "descriptor cookie" for each client. The client key is used as
559 replacement for the service's permanent key, so that the service uses a
560 different identity for each of his clients. The descriptor cookie is used
561 to store descriptors at changing directory nodes that are unpredictable
562 for anyone but service and client, to encrypt the introduction-point
563 part, and to be included in INTRODUCE2 cells. Once the service has
564 created client key and descriptor cookie, he tells them to the client
565 outside of Tor. The contact information string looks similar to the one
566 used by the preceding authorization protocol (with the only difference
567 that it has "1" encoded as auth-type in the remaining 4 of 132 bits
568 instead of "0" as before).
570 When creating a hidden service descriptor for an authorized client, the
571 hidden service uses the client key and descriptor cookie to compute
572 secret ID part and descriptor ID:
574 secret-id-part = H(time-period | descriptor-cookie | replica)
576 descriptor-id = H(client-key[:10] | secret-id-part)
578 The hidden service also replaces permanent-key in the descriptor with
579 client-key and encrypts introduction-points with the descriptor cookie.
581 ATYPE Authorization type: set to 2. [1 octet]
582 IV AES initialization vector [16 octets]
583 IPOS Intro points, encr. with descriptor cookie [remaining octets]
585 When uploading descriptors, the hidden service needs to make sure that
586 descriptors for different clients are not uploaded at the same time (cf.
587 Section 1.1) which is also a limiting factor for the number of clients.
589 When a client is requested to establish a connection to a hidden service
590 it looks up whether it has any authorization data configured for that
591 service. If the user has configured authorization data for authorization
592 protocol "2", the descriptor ID is determined as described in the last
593 paragraph. Upon receiving a descriptor, the client decrypts the
594 introduction-point part using its descriptor cookie. Further, the client
595 includes its descriptor cookie as auth-type "2" in INTRODUCE2 cells that
596 it sends to the service.
598 2.3. Hidden service configuration
600 A hidden service that is meant to perform client authorization adds a
601 new option HiddenServiceAuthorizeClient to its hidden service
602 configuration. This option contains the authorization type which is
603 either "1" for the protocol described in 2.1 or "2" for the protocol in
604 2.2 and a comma-separated list of human-readable client names, so that
605 Tor can create authorization data for these clients:
607 HiddenServiceAuthorizeClient auth-type client-name,client-name,...
609 If this option is configured, HiddenServiceVersion is automatically
610 reconfigured to contain only version numbers of 2 or higher.
612 Tor stores all generated authorization data for the authorization
613 protocols described in Sections 2.1 and 2.2 in a new file using the
614 following file format:
616 "client-name" human-readable client identifier NL
617 "descriptor-cookie" 128-bit key ^= 22 base64 chars NL
619 If the authorization protocol of Section 2.2 is used, Tor also generates
620 and stores the following data:
622 "client-key" NL a public key in PEM format
624 2.4. Client configuration
626 Clients need to make their authorization data known to Tor using another
627 configuration option that contains a service name (mainly for the sake of
628 convenience), the service address, and the descriptor cookie that is
629 required to access a hidden service (the authorization protocol number is
630 encoded in the descriptor cookie):
632 HidServAuth service-name service-address descriptor-cookie
634 Security implications:
636 In the following we want to discuss possible attacks by dishonest
637 entities in the presented infrastructure and specific protocol. These
638 security implications would have to be verified once more when adding
639 another protocol. The dishonest entities (theoretically) include the
640 hidden service itself, the authenticated clients, hidden service directory
641 nodes, introduction points, and rendezvous points. The relays that are
642 part of circuits used during protocol execution, but never learn about
643 the exchanged descriptors or cells by design, are not considered.
644 Obviously, this list makes no claim to be complete. The discussed attacks
645 are sorted by the difficulty to perform them, in ascending order,
646 starting with roles that everyone could attempt to take and ending with
647 partially trusted entities abusing the trust put in them.
649 (1) A hidden service directory could attempt to conclude presence of a
650 service from the existence of a locally stored hidden service descriptor:
651 This passive attack is possible only for a single client-service
652 relation, because descriptors need to contain a publicly visible
653 signature of the service using the client key.
654 A possible protection would be to increase the number of hidden service
655 directories in the network.
657 (2) A hidden service directory could try to break the descriptor cookies
658 of locally stored descriptors: This attack can be performed offline. The
659 only useful countermeasure against it might be using safe passwords that
660 are generated by Tor.
662 [passwords? where did those come in? -RD]
664 (3) An introduction point could try to identify the pseudonym of the
665 hidden service on behalf of which it operates: This is impossible by
666 design, because the service uses a fresh public key for every
667 establishment of an introduction point (see proposal 114) and the
668 introduction point receives a fresh introduction cookie, so that there is
669 no identifiable information about the service that the introduction point
670 could learn. The introduction point cannot even tell if client accesses
671 belong to the same client or not, nor can it know the total number of
672 authorized clients. The only information might be the pattern of
673 anonymous client accesses, but that is hardly enough to reliably identify
676 (4) An introduction point could want to learn the identities of accessing
677 clients: This is also impossible by design, because all clients use the
678 same introduction cookie for authorization at the introduction point.
680 (5) An introduction point could try to replay a correct INTRODUCE1 cell
681 to other introduction points of the same service, e.g. in order to force
682 the service to create a huge number of useless circuits: This attack is
683 not possible by design, because INTRODUCE1 cells are encrypted using a
684 freshly created introduction key that is only known to authorized
687 (6) An introduction point could attempt to replay a correct INTRODUCE2
688 cell to the hidden service, e.g. for the same reason as in the last
689 attack: This attack is stopped by the fact that a service will drop
690 INTRODUCE2 cells containing a DH handshake they have seen recently.
692 (7) An introduction point could block client requests by sending either
693 positive or negative INTRODUCE_ACK cells back to the client, but without
694 forwarding INTRODUCE2 cells to the server: This attack is an annoyance
695 for clients, because they might wait for a timeout to elapse until trying
696 another introduction point. However, this attack is not introduced by
697 performing authorization and it cannot be targeted towards a specific
698 client. A countermeasure might be for the server to periodically perform
699 introduction requests to his own service to see if introduction points
700 are working correctly.
702 (8) The rendezvous point could attempt to identify either server or
703 client: This remains impossible as it was before, because the
704 rendezvous cookie does not contain any identifiable information.
706 (9) An authenticated client could swamp the server with valid INTRODUCE1
707 and INTRODUCE2 cells, e.g. in order to force the service to create
708 useless circuits to rendezvous points; as opposed to an introduction
709 point replaying the same INTRODUCE2 cell, a client could include a new
710 rendezvous cookie for every request: The countermeasure for this attack
711 is the restriction to 10 connection establishments per client per hour.
715 An implementation of this proposal would require changes to hidden
716 services and clients to process authorization data and encode and
717 understand the new formats. However, both services and clients would
718 remain compatible to regular hidden services without authorization.
722 The implementation of this proposal can be divided into a number of
723 changes to hidden service and client side. There are no
724 changes necessary on directory, introduction, or rendezvous nodes. All
725 changes are marked with either [service] or [client] do denote on which
726 side they need to be made.
728 /1/ Configure client authorization [service]
730 - Parse configuration option HiddenServiceAuthorizeClient containing
731 authorized client names.
732 - Load previously created client keys and descriptor cookies.
733 - Generate missing client keys and descriptor cookies, add them to
735 - Rewrite the hostname file.
736 - Keep client keys and descriptor cookies of authorized clients in
738 [- In case of reconfiguration, mark which client authorizations were
739 added and whether any were removed. This can be used later when
740 deciding whether to rebuild introduction points and publish new
741 hidden service descriptors. Not implemented yet.]
743 /2/ Publish hidden service descriptors [service]
745 - Create and upload hidden service descriptors for all authorized
747 [- See /1/ for the case of reconfiguration.]
749 /3/ Configure permission for hidden services [client]
751 - Parse configuration option HidServAuth containing service
752 authorization, store authorization data in memory.
754 /5/ Fetch hidden service descriptors [client]
756 - Look up client authorization upon receiving a hidden service request.
757 - Request hidden service descriptor ID including client key and
758 descriptor cookie. Only request v2 descriptors, no v0.
760 /6/ Process hidden service descriptor [client]
762 - Decrypt introduction points with descriptor cookie.
764 /7/ Create introduction request [client]
766 - Include descriptor cookie in INTRODUCE2 cell to introduction point.
767 - Pass descriptor cookie around between involved connections and
770 /8/ Process introduction request [service]
772 - Read descriptor cookie from INTRODUCE2 cell.
773 - Check whether descriptor cookie is authorized for access, including
774 checking access counters.
775 - Log access for accountability.