mirror of
https://github.com/torproject/torspec.git
synced 2024-11-23 09:49:45 +00:00
fa7eb1610c
It's under discussion on tor-dev.
221 lines
9.2 KiB
Plaintext
221 lines
9.2 KiB
Plaintext
Filename: 317-secure-dns-name-resolution.txt
|
||
Title: Improve security aspects of DNS name resolution
|
||
Author: Christian Hofer
|
||
Created: 21-Mar-2020
|
||
Status: Needs-Revision
|
||
|
||
Overview:
|
||
|
||
This document proposes a solution for handling DNS name resolution within
|
||
Tor in a secure manner. In order to achieve this the responsibility for
|
||
name resolution is moved from the exit relays to the clients. Therefore a
|
||
security aware DNS resolver is required that is able to operate using Tor.
|
||
|
||
The advantages are:
|
||
|
||
* Users have no longer to trust exit relays but can choose trusted
|
||
nameservers.
|
||
* DNS requests are kept confidential from exit relays in case the
|
||
nameservers are running behind onion services.
|
||
* The authenticity and integrity of DNS records is verified by means of
|
||
DNSSEC.
|
||
|
||
Motivation:
|
||
|
||
The way how Tor resolves DNS names has always been a hot topic within
|
||
the Tor community and it seems that the discussion is not over yet.
|
||
|
||
One example is this recent blog posting that addresses the importance of
|
||
avoiding public DNS resolvers in order to mitigate analysis attacks.
|
||
|
||
https://blog.torproject.org/new-low-cost-traffic-analysis-attacks-mitigations
|
||
|
||
Then there is the paper "The Effect of DNS on Tor’s Anonymity" that
|
||
discusses how to use DNS traffic for correlation attacks and what
|
||
countermeasures should be taken. Based on this, there is this interesting
|
||
medium article evaluating the situation two years after it was published.
|
||
|
||
https://medium.com/@nusenu/who-controls-tors-dns-traffic-a74a7632e8ca
|
||
|
||
Furthermore, there was already a proposal to improve the way how DNS
|
||
resolution is done within Tor. Unfortunately, it seems that it has been
|
||
abandoned, so this proposal picked up the presented ideas.
|
||
|
||
https://gitweb.torproject.org/torspec.git/tree/proposals/219-expanded-dns.txt
|
||
|
||
Design:
|
||
|
||
The key aspect is the introduction of a DNS resolver module on the client
|
||
side. It has to comply with the well known DNS standards as described in a
|
||
series of RFCs. Additional requirements are the ability to communicate
|
||
through the Tor network for ensuring confidentiality and the implementation
|
||
of DNS security extensions (DNSSEC) for verifying the authenticity and
|
||
integrity. Furthermore it has to cover two distinct scenarios, which are
|
||
described in subsequent sections.
|
||
|
||
The resolution scenario, the most common scenario for a DNS resolvers, is
|
||
applicable for connections handled by the SocksPort. After successful socks
|
||
handshakes the target address is resolved before attaching the connection.
|
||
|
||
The proxy scenario is a more unusual use case, however it is required for
|
||
connections handled by the DNSPort. In this case requests are forwarded as
|
||
they are received without employing any resolution or verification means.
|
||
|
||
In both scenarios the most noticeable change in terms of interactions
|
||
between the resolver and the rest of Tor concerns the entry and exit points
|
||
for passing connections forth and back. Additionally, the entry_connection
|
||
needs to be extended so that it is capable of holding related state
|
||
information.
|
||
|
||
Security implications:
|
||
|
||
This improves the security aspects of DNS name resolution by reducing the
|
||
significance of exit relays. In particular:
|
||
|
||
* Operating nameservers behind onion services allows end-to-end encryption
|
||
for DNS lookups.
|
||
* Employing DNSSEC verification prevents tampering with DNS records.
|
||
* Configuring trusted nameservers on the client side reduces the number of
|
||
entities that must be trusted.
|
||
|
||
Specification:
|
||
|
||
DNS resolver general implementation:
|
||
|
||
The security aware DNS resolver module has to comply with existing DNS
|
||
and DNSSEC specifications. A list of related RFCs:
|
||
|
||
RFC883, RFC973, RFC1035, RFC1183, RFC1876, RFC1996, RFC2065, RFC2136,
|
||
RFC2230, RFC2308, RFC2535, RFC2536, RFC2539, RFC2782, RFC2845, RFC2874,
|
||
RFC2930, RFC3110, RFC3123, RFC3403, RFC3425, RFC3596, RFC3658, RFC3755,
|
||
RFC3757, RFC3986, RFC4025, RFC4033, RFC4034, RFC4035, RFC4255, RFC4398,
|
||
RFC4431,RFC4509, RFC4635, RFC4701, RFC5011, RFC5155, RFC5702, RFC5933,
|
||
RFC6605, RFC6672, RFC6698, RFC6725, RFC6840, RFC6844, RFC6891, RFC7129,
|
||
RFC7344, RFC7505, RFC7553, RFC7929, RFC8005, RFC8078, RFC8080, RFC8162.
|
||
|
||
DNS resolver configuration settings:
|
||
|
||
DNSResolver: If True use DNS resolver module for name resolution,
|
||
otherwise Tor's behavior should be unchanged.
|
||
|
||
DNSResolverIPv4: If True names should be resolved to IPv4 addresses.
|
||
|
||
DNSResolverIPv6: If True names should be resolved to IPv6 addresses. In
|
||
case IPv4 and IPv6 are enabled prefer IPv6 and use IPv4 as fallback.
|
||
|
||
DNSResolverRandomizeCase: If True apply 0x20 hack to DNS names for
|
||
outgoing requests.
|
||
|
||
DNSResolverNameservers: A list of comma separated nameservers, can be an
|
||
IPv4, an IPv6, or an onion address. Should allow means to configure the
|
||
port and supported zones.
|
||
|
||
DNSResolverHiddenServiceZones: A list of comma separated hidden service
|
||
zones.
|
||
|
||
DNSResolverDNSSECMode: Should support at least four modes.
|
||
Off: No validation is done. The DO bit is not set in the header of
|
||
outgoing requests.
|
||
Trust: Trust validation of DNS recursor. The CD and DO bits are not set
|
||
in the header of outgoing requests.
|
||
Porcess: Employ DNSSEC validation but ignore the result.
|
||
Validate: Employ DNSSEC validation and reject insecure data.
|
||
|
||
DNSResolverTrustAnchors: A list of comma separated trust anchors in DS
|
||
record format. https://www.iana.org/dnssec/files
|
||
|
||
DNSResolverMaxCacheEntries: Specifies the maximum number of cache
|
||
entries.
|
||
|
||
DNSResolverMaxCacheTTL: Specifies the maximum age of cache entries in
|
||
seconds.
|
||
|
||
DNS resolver state (dns_lookup_st.h):
|
||
|
||
action: Defines the active action. Available actions are: forward,
|
||
resolve, validate.
|
||
|
||
qname: Specifies the name that should be resolved or forwarded.
|
||
|
||
qtype: Specifies the type that should be resolved or forwarded.
|
||
|
||
start_time: Holds the initiation time.
|
||
|
||
nameserver: Specifies the chosen nameserver.
|
||
|
||
validation: Holds the DNSSEC validation state only applicable for the
|
||
validate action.
|
||
|
||
server_request: The original DNSPort request required for delivering
|
||
responses in the proxy scenario.
|
||
|
||
ap_conn: The original SocksPort entry_connection required for delivering
|
||
responses in the resolution scenario.
|
||
|
||
SocksPort related changes (resolution scenario):
|
||
|
||
The entry point is directly after a successful socks handshake in
|
||
connection_ap_handshake_process_socks (connetion_edge.c). Based on the
|
||
target address type the entry_connection is either passed to the DNS
|
||
resolver (hostname) or handled as usual (IPv4, IPv6, onion).
|
||
|
||
In the former case the DNS resolver creates a new DNS lookup connection
|
||
and attaches it instead of the given entry_connection. This connection is
|
||
responsible for resolving the hostname of the entry_connection and
|
||
verifying the response.
|
||
|
||
Once the result is verified and the hostname is resolved, the DNS
|
||
resolver replaces the target address in the entry_connection with the
|
||
resolved address and attaches it. From this point on the entry_connection
|
||
is processed as usual.
|
||
|
||
DNSPort related changes (proxy scenario):
|
||
|
||
The entry point is in evdns_server_callback (dnsserv.c). Instead of
|
||
creating a dummy connection the received server_request is passed to the
|
||
DNS resolver. It creates a DNS lookup connection with the action type
|
||
forward and applies the name and type from the server_request. When the
|
||
DNS resolver receives the answer from the nameserver it resolvers the
|
||
server_request by adding all received resource records.
|
||
|
||
Compatibility:
|
||
|
||
Compatibility issues are not expected since there are no changes to the Tor
|
||
protocol. The significant part takes place on the client side before
|
||
attaching connections.
|
||
|
||
Implementation:
|
||
|
||
A complete implementation of this proposal can be found here:
|
||
https://github.com/torproject/tor/pull/1869
|
||
|
||
The following steps should suffice to test the implementation:
|
||
|
||
* check out the branch
|
||
* build Tor as usual
|
||
* enable the DNS resolver module by adding `DNSResolver 1` to torrc
|
||
|
||
Useful services for verifying DNSSEC validation:
|
||
|
||
* http://www.dnssec-or-not.com/
|
||
* https://enabled.dnssec.hkirc.hk/
|
||
* https://www.cloudflare.com/ssl/encrypted-sni/
|
||
|
||
Dig is useful for testing the DNSPort related changes:
|
||
|
||
dig -p9053 torproject.org
|
||
|
||
Performance and scalability:
|
||
|
||
Since there are no direct changes to the protocol and this is an alternative
|
||
approach for an already existing requirement, there are no performance
|
||
issues expected. Additionally, the encoding and decoding of DNS message
|
||
handling as well as the verification takes place on the client side.
|
||
|
||
In terms of scalability the availability of nameservers might be one of the
|
||
key concerns. However, this is the same issue as for nameservers on the
|
||
clearweb. If it turns out that it is not feasible to operate nameservers as
|
||
onion service in a performant manner it is always possible to fallback to
|
||
clearweb nameservers by changing a configuration setting.
|
||
|