[tor-dev] Exposing onion service errors to Tor Browser
George Kadianakis
desnacked at riseup.net
Mon Sep 30 12:15:45 UTC 2019
Hello list,
we've recently been thinking about how to expose onion-service-related
errors to Tor Browser so that we can give more useful error pages to
users. We currently return "Unable to connect" error pages for any kind
of onion service error, and I think we can do better.
This is a thread to think about the errors we want to expose, how that
should look like, and what options we should give to the users when it
happens. Relevant master tickets are #30022, #30025 and #30000.
We decided (in #14389) that Tor will export these errors through the
SOCKS port, and the relevant spec is proposal 304 [0].
As part of #30090 antonela started making a table of potential
errors. I'm gonna use that in this thread and also add a few more.
Let's go:
= Client-level errors =
These are errors on the user side of things:
=== 1) Typo error on address ===
This can be detected by Tor using the checksum or if the address is
too big or too small.
TODO: We will need to add a new error code to prop304. Not sure if
the error code should distinguish between checksum fail or length fail.
There is no recovery here since the address is busted. The user
needs to find the right one.
=== 2) Missing Client Authorization ===
This is prop304's 'F4' error (see #30382), and it means that we
can't decrypt the descriptor because it requires client auth, but we
don't have it configured.
The recovery here is the whole point of #30237 where we make a
dialog for the user to insert their client auth credentials.
=== 3) Wrong Client Authorization ===
This is prop304's 'F5' error, and it means that there client auth
credentials configured for this onion are wrong.
The user recovery here is unclear but it might be that they need to
change their client auth credentials. IMO, we should not try to make
the perfect UX here, and we should just go with something super
simple.
= Service-level errors =
These are errors on the onion service side:
=== 4) Service Descriptor Can Not be Found ===
This is prop304's 'F0' error, and it means that we could not find
the descriptor of the service on the directory servers. This means
that the service is not up right now (or, more unlikely, that some
bug has happened somewhere).
The user recovery here is unclear. The user can try to reconnect in
case the service got up in the meanwhile, but this is not so likely
in a small period of time.
Perhaps we can give the user the option to reconnect every 10
seconds or so? Does this make sense from a UX PoV?
Again this equivalent to a "Remote host is down" error and we should
use it as such.
= Network-level errors =
These are errors caused by the network (directory servers, intro points,
rendezvous points) or even the service itself. It's kinda unclear given
all the hops involved.
=== 5) Onion Service Descriptor Is Invalid ===
This is prop304's 'F1' error and it means that we got a descriptor
back from the directory but it's corrupted.
This is very unlikely to happen since directory servers do not keep
corrupted descriptors, so it usually means that some bug happened
somewhere (or that the directory is bad or confused).
In terms of recovery and error page, this is kinda an
"Oops. Internal error." situation where this is rare and weird and
hence we don't know what's the best recovery option. We can give the
option to reconnect but it's likely not gonna help much.
Again this should never really appear, so let's not stress too much
over it.
=== 6) Onion Service Introduction Failed ===
This is prop304's 'F2' error and it means that for some reason the
introduction did not complete. This could be because the onion
service is not up anymore, or it could be because the network is
screwed in some way (e.g. the service is DoSed).
The recovery here might be some 'reconnect' button which could be
helpful in case of a DoS situation, but it would not help much if
the service is not up anymore.
=== 7) Onion Service Rendezvous Failed ===
This is prop304's 'F3' error and it means that the rendezvous did
not complete. This usually means that the service is having a bad
time, and is either DoSed or it generally cannot cope.
The recovery again here is some 'reconnect' button, since if we did
the introduction successfuly, the service is up, and reconnecting
might work at some point.
This one and (6) are very related and perhaps they can be handlded
identically, since exposing terms like "intro" and "rend" to users
will not be nice. Still we might want to expose a technical error
value somewhere for debugging purposes when users come to us.
=======================================================================
I think the above set of errors will satisfy all our needs. In
particular:
- #30022 (typos ticket) needs error (1) from above.
- #30025 (client errors ticket) needs errors (4), (5), (6), (7) from above.
- #30000 (client auth) needs errors (2) and (3) from above.
In terms of error page, I'm not sure how it should look like. Perhaps
along with the error description and the recovery path, we should
provide some education about onion services to the users?
In terms of unsafe paths, I don't see any of these errors being
dangerous in terms of causing security issues if you attempt to
reconnect or anything. The Tor protocol takes care of this in the layer
below. The worst thing you can do is slightly damage the network from
too many reconnects, but I think that's OK since people who use the TB
are legitimate users and not DoS attackers.
===
Hope this was useful!
[0]:
https://github.com/torproject/torspec/blob/master/proposals/304-socks5-extending-hs-error-codes.txt
More information about the tor-dev
mailing list