From: Chuck Lever <chuck.lever@oracle.com>
To: linux-nfs@vger.kernel.org, libtirpc-devel@lists.sourceforge.net
Subject: [PATCH RFC 3/3] Avoid choosing reserved ports in clnt_tli_create(3)
Date: Thu, 15 Feb 2018 15:22:25 -0500 [thread overview]
Message-ID: <20180215202225.16924.80494.stgit@klimt.1015granger.net> (raw)
In-Reply-To: <20180215201832.16924.28659.stgit@klimt.1015granger.net>
Callers of clnt_tli_create(3) can specify that an arbitrary port
number be dynamically assigned for the client socket being
created. clnt_tli_create(3) tries bindresvport(3) first in this
case. bindresvport(3) chooses a reserved port if the caller has
CAP_NET_ADMIN_BIND privilege. If this fails, bind(2) is used to
assign a port number from the range above 1024.
This approach becomes a problem whenever bindresvport(3) happens to
choose the port number of a well-known service. If the caller is a
long-running service (like rpc.statd), it indefinitely prevents the
IANA-assigned well-known service from starting.
When using the AUTH_SYS authentication flavor, RPC services can use
the remote client's port number to determine whether the client is
privileged, and thus the UID and GID numbers in the RPC are
trustworthy. However, it's pretty easy for a man-in-the-middle to
replace these while the RPC is in flight anyway. The port number
provides no actual security.
Therefore, remove the bindresvport step to prevent svc_tli_create(3)
from choosing a port number that interferes with well-known services
assigned to a privileged port.
clnt_tli_create(3) will now never assign a privileged port
dynamically. If needed, a caller may still bind to a dynamically-
assigned reserved port by invoking bindresvport(3) directly and
passing the already-bound file descriptor to clnt_tli_create(3).
But that should be a special case. It is no longer the default
behavior.
BugLink: https://bugzilla.linux-nfs.org/show_bug.cgi?id=320
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
src/clnt_generic.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/clnt_generic.c b/src/clnt_generic.c
index 3f3dabf..e5a314f 100644
--- a/src/clnt_generic.c
+++ b/src/clnt_generic.c
@@ -47,6 +47,7 @@
extern bool_t __rpc_is_local_host(const char *);
int __rpc_raise_fd(int);
+extern int __binddynport(int fd);
#ifndef NETIDLEN
#define NETIDLEN 32
@@ -340,7 +341,8 @@ clnt_tli_create(int fd, const struct netconfig *nconf,
servtype = nconf->nc_semantics;
if (!__rpc_fd2sockinfo(fd, &si))
goto err;
- bindresvport(fd, NULL);
+ if (__binddynport(fd) == -1)
+ goto err;
} else {
if (!__rpc_fd2sockinfo(fd, &si))
goto err;
prev parent reply other threads:[~2018-02-15 20:22 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-02-15 20:21 [PATCH RFC 0/3] Avoid well-known port numbers Chuck Lever
2018-02-15 20:22 ` [PATCH RFC 1/3] Add an internal helper for binding to a dynamically-assigned port Chuck Lever
2018-02-15 20:22 ` [PATCH RFC 2/3] Avoid choosing reserved ports in svc_tli_create(3) Chuck Lever
2018-02-15 21:11 ` Chuck Lever
2018-02-15 20:22 ` Chuck Lever [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180215202225.16924.80494.stgit@klimt.1015granger.net \
--to=chuck.lever@oracle.com \
--cc=libtirpc-devel@lists.sourceforge.net \
--cc=linux-nfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).