hostip: refuse to resolve the .onion TLD

RFC 7686 states that:

> Applications that do not implement the Tor
> protocol SHOULD generate an error upon the use of .onion and
> SHOULD NOT perform a DNS lookup.

Let's do that.

https://www.rfc-editor.org/rfc/rfc7686#section-2

Add test 1471 and 1472 to verify

Fixes #543
Closes #10705
This commit is contained in:
Matt Jolly 2023-03-08 02:16:45 +11:00 committed by Daniel Stenberg
parent 67546aea90
commit 0ae0abbe72
No known key found for this signature in database
GPG key ID: 5CC908FDB71E12C2
5 changed files with 88 additions and 11 deletions

View file

@ -80,7 +80,6 @@ problems may have been fixed or changed somewhat since this was written.
10.3 FTPS over SOCKS
11. Internals
11.1 Curl leaks .onion hostnames in DNS
11.2 error buffer not set if connection to multiple addresses fails
11.4 HTTP test server 'connection-monitor' problems
11.5 Connection information when using TCP Fast Open
@ -525,14 +524,6 @@ problems may have been fixed or changed somewhat since this was written.
11. Internals
11.1 Curl leaks .onion hostnames in DNS
Curl sends DNS requests for hostnames with a .onion TLD. This leaks
information about what the user is attempting to access, and violates this
requirement of RFC7686: https://datatracker.ietf.org/doc/html/rfc7686
Issue: https://github.com/curl/curl/issues/543
11.2 error buffer not set if connection to multiple addresses fails
If you ask libcurl to resolve a hostname like example.com to IPv6 addresses

View file

@ -652,6 +652,14 @@ enum resolve_t Curl_resolv(struct Curl_easy *data,
CURLcode result;
enum resolve_t rc = CURLRESOLV_ERROR; /* default to failure */
struct connectdata *conn = data->conn;
/* We should intentionally error and not resolve .onion TLDs */
size_t hostname_len = strlen(hostname);
if(hostname_len >= 7 &&
(curl_strequal(&hostname[hostname_len - 6], ".onion") ||
curl_strequal(&hostname[hostname_len - 7], ".onion."))) {
failf(data, "Not resolving .onion address (RFC 7686)");
return CURLRESOLV_ERROR;
}
*entry = NULL;
#ifndef CURL_DISABLE_DOH
conn->bits.doh = FALSE; /* default is not */

View file

@ -186,8 +186,8 @@ test1432 test1433 test1434 test1435 test1436 test1437 test1438 test1439 \
test1440 test1441 test1442 test1443 test1444 test1445 test1446 test1447 \
test1448 test1449 test1450 test1451 test1452 test1453 test1454 test1455 \
test1456 test1457 test1458 test1459 test1460 test1461 test1462 test1463 \
test1464 test1465 test1466 test1467 test1468 test1469 test1470 \
\
test1464 test1465 test1466 test1467 test1468 test1469 test1470 test1471 \
test1472 \
test1500 test1501 test1502 test1503 test1504 test1505 test1506 test1507 \
test1508 test1509 test1510 test1511 test1512 test1513 test1514 test1515 \
test1516 test1517 test1518 test1519 test1520 test1521 test1522 test1523 \

39
tests/data/test1471 Normal file
View file

@ -0,0 +1,39 @@
<testcase>
<info>
<keywords>
Onion
Tor
FAILURE
</keywords>
</info>
#
# Server-side
<reply>
</reply>
#
# Client-side
<client>
<server>
none
</server>
<name>
Fail to resolve .onion TLD
</name>
<command>
red.onion
</command>
</client>
#
# Verify data after the test has been "shot"
<verify>
# Couldn't resolve host name
<errorcode>
6
</errorcode>
<stderr mode="text">
curl: (6) Not resolving .onion address (RFC 7686)
</stderr>
</verify>
</testcase>

39
tests/data/test1472 Normal file
View file

@ -0,0 +1,39 @@
<testcase>
<info>
<keywords>
Onion
Tor
FAILURE
</keywords>
</info>
#
# Server-side
<reply>
</reply>
#
# Client-side
<client>
<server>
none
</server>
<name>
Fail to resolve .onion. TLD
</name>
<command>
tasty.onion.
</command>
</client>
#
# Verify data after the test has been "shot"
<verify>
# Couldn't resolve host name
<errorcode>
6
</errorcode>
<stderr mode="text">
curl: (6) Not resolving .onion address (RFC 7686)
</stderr>
</verify>
</testcase>