From: Chuck Lever <chuck.lever@oracle.com>
To: linux-nfs@vger.kernel.org
Cc: chris.mason@oracle.com
Subject: [PATCH 25/26] statd: retain CAP_NET_BIND when dropping privileges
Date: Tue, 13 Oct 2009 10:58:30 -0400 [thread overview]
Message-ID: <20091013145829.2424.46708.stgit@matisse.1015granger.net> (raw)
In-Reply-To: <20091013142257.2424.76946.stgit-RytpoXr2tKZ9HhUboXbp9zCvJB+x5qRC@public.gmane.org>
I'm about to switch the order of listener creation and dropping root
privileges. rpc.statd will drop privileges first, then create its
listeners. The reason for the new ordering is explained in a
subsequent patch.
However, for non-TI-RPC builds, rpc_init() needs to use a privileged
port to do pmap registrations. For both TI-RPC and non-TI-RPC builds,
CAP_NET_BIND is required in case the user requested a privileged
listener port.
So that these requirements are met, nsm_drop_privileges() will now
retain CAP_NET_BIND while dropping root.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
aclocal/libcap.m4 | 15 +++++++++++++++
configure.ac | 3 +++
support/nsm/file.c | 44 +++++++++++++++++++++++++++++++++++++++++++-
utils/statd/Makefile.am | 4 ++--
4 files changed, 63 insertions(+), 3 deletions(-)
create mode 100644 aclocal/libcap.m4
diff --git a/aclocal/libcap.m4 b/aclocal/libcap.m4
new file mode 100644
index 0000000..eabe507
--- /dev/null
+++ b/aclocal/libcap.m4
@@ -0,0 +1,15 @@
+dnl Checks for libcap.so
+dnl
+AC_DEFUN([AC_LIBCAP], [
+
+ dnl look for prctl
+ AC_CHECK_FUNC([prctl], , )
+
+ dnl look for the library; do not add to LIBS if found
+ AC_CHECK_LIB([cap], [cap_get_proc], [LIBCAP=-lcap], ,)
+ AC_SUBST(LIBCAP)
+
+ AC_CHECK_HEADERS([sys/capability.h], ,
+ [AC_MSG_ERROR([libcap headers not found.])])
+
+])dnl
diff --git a/configure.ac b/configure.ac
index 2b02d3b..d8ba6b3 100644
--- a/configure.ac
+++ b/configure.ac
@@ -164,6 +164,9 @@ fi
dnl Check for TI-RPC library and headers
AC_LIBTIRPC
+dnl Check for -lcap
+AC_LIBCAP
+
# Check whether user wants TCP wrappers support
AC_TCP_WRAPPERS
diff --git a/support/nsm/file.c b/support/nsm/file.c
index 83680f9..36cddd7 100644
--- a/support/nsm/file.c
+++ b/support/nsm/file.c
@@ -67,6 +67,8 @@
#endif
#include <sys/types.h>
+#include <sys/capability.h>
+#include <sys/prctl.h>
#include <sys/stat.h>
#include <ctype.h>
@@ -241,6 +243,37 @@ nsm_is_default_parentdir(void)
return strcmp(nsm_base_dirname, NSM_DEFAULT_STATEDIR) == 0;
}
+/*
+ * Clear all capabilities but CAP_NET_BIND_SERVICE. This permits
+ * callers to acquire privileged source ports, but all other root
+ * capabilities are disallowed.
+ */
+static int
+statd_clear_capabilities(void)
+{
+ bool_t result;
+ cap_t caps;
+
+ result = 0;
+
+ caps = cap_from_text("cap_net_bind_service=ep");
+ if (caps == NULL) {
+ xlog(L_ERROR, "Failed to allocate working storage: %m");
+ return result;
+ }
+
+ if (cap_set_proc(caps) == -1) {
+ xlog(L_ERROR, "Failed to set capability flags: %m");
+ goto out_free;
+ }
+
+ result = 1;
+
+out_free:
+ (void)cap_free(caps);
+ return result;
+}
+
/**
* nsm_drop_privileges - drop root privileges
* @pidfd: file descriptor of a pid file
@@ -288,6 +321,14 @@ nsm_drop_privileges(const int pidfd)
if (fchown(pidfd, st.st_uid, st.st_gid) == -1)
xlog_warn("Failed to change owner of pidfile: %m");
+ /*
+ * Don't clear capabilities when dropping root.
+ */
+ if (prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0) == -1) {
+ xlog(L_ERROR, "prctl(PR_SET_KEEPCAPS) failed: %m");
+ return 0;
+ }
+
if (setgroups(0, NULL) == -1) {
xlog(L_ERROR, "Failed to drop supplementary groups: %m");
return 0;
@@ -305,7 +346,8 @@ nsm_drop_privileges(const int pidfd)
}
xlog(D_CALL, "Effective UID, GID: %u, %u", st.st_uid, st.st_gid);
- return 1;
+
+ return statd_clear_capabilities();
}
/**
diff --git a/utils/statd/Makefile.am b/utils/statd/Makefile.am
index a94c012..1744791 100644
--- a/utils/statd/Makefile.am
+++ b/utils/statd/Makefile.am
@@ -15,10 +15,10 @@ BUILT_SOURCES = $(GENFILES)
statd_LDADD = ../../support/nsm/libnsm.a \
../../support/nfs/libnfs.a \
../../support/misc/libmisc.a \
- $(LIBWRAP) $(LIBNSL)
+ $(LIBWRAP) $(LIBNSL) $(LIBCAP)
sm_notify_LDADD = ../../support/nsm/libnsm.a \
../../support/nfs/libnfs.a \
- $(LIBNSL)
+ $(LIBNSL) $(LIBCAP)
EXTRA_DIST = sim_sm_inter.x $(man8_MANS) COPYRIGHT simulate.c
next prev parent reply other threads:[~2009-10-13 14:59 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-10-13 14:54 [PATCH 00/26] Basic IPv6 support in statd (take++) Chuck Lever
[not found] ` <20091013142257.2424.76946.stgit-RytpoXr2tKZ9HhUboXbp9zCvJB+x5qRC@public.gmane.org>
2009-10-13 14:54 ` [PATCH 01/26] statd: Replace note() with xlog() in rpc.statd Chuck Lever
[not found] ` <20091013145416.2424.12787.stgit-RytpoXr2tKZ9HhUboXbp9zCvJB+x5qRC@public.gmane.org>
2009-10-14 16:57 ` J. Bruce Fields
2009-10-15 14:58 ` Chuck Lever
2009-10-13 14:54 ` [PATCH 02/26] statd: Replace nsm_log() with xlog() in sm-notify command Chuck Lever
2009-10-13 14:54 ` [PATCH 03/26] statd: replace smn_{get, set}_port() with the shared equivalents Chuck Lever
2009-10-13 14:54 ` [PATCH 04/26] statd: fix address copy in sm-notify.c Chuck Lever
2009-10-13 14:54 ` [PATCH 05/26] statd: Move the sm_inter XDR pieces to libnsm.a Chuck Lever
2009-10-13 14:55 ` [PATCH 06/26] statd: Introduce common routines to handle persistent storage Chuck Lever
[not found] ` <20091013145506.2424.10505.stgit-RytpoXr2tKZ9HhUboXbp9zCvJB+x5qRC@public.gmane.org>
2009-10-16 14:05 ` Jeff Layton
[not found] ` <20091016100544.25f686c4-9yPaYZwiELC+kQycOl6kW4xkIHaj4LzF@public.gmane.org>
2009-10-16 22:46 ` Chuck Lever
2009-10-16 23:27 ` Jeff Layton
2009-10-13 14:55 ` [PATCH 07/26] statd: Use the new nsm_ file.c calls in sm_notify Chuck Lever
2009-10-13 14:55 ` [PATCH 08/26] statd: Use the new nsm_ file.c calls in rpc.statd Chuck Lever
2009-10-13 14:55 ` [PATCH 09/26] libnsm: Add RPC construction helper functions Chuck Lever
[not found] ` <20091013145546.2424.83816.stgit-RytpoXr2tKZ9HhUboXbp9zCvJB+x5qRC@public.gmane.org>
2009-10-14 17:21 ` J. Bruce Fields
2009-10-15 15:21 ` Chuck Lever
2009-10-13 14:55 ` [PATCH 10/26] statd: Support sending SM_NOTIFY requests to IPv6 remotes Chuck Lever
2009-10-13 14:56 ` [PATCH 11/26] statd: Update rmtcall.c Chuck Lever
2009-10-13 14:56 ` [PATCH 12/26] statd: factor socket creation out of notify() Chuck Lever
2009-10-13 14:56 ` [PATCH 13/26] statd: Support creating a PF_INET6 socket in smn_create_socket() Chuck Lever
2009-10-13 14:56 ` [PATCH 14/26] statd: IPv6 support in reserved port binding " Chuck Lever
2009-10-13 14:56 ` [PATCH 15/26] statd: Use getaddrinfo(3) to generate bind address " Chuck Lever
2009-10-13 14:56 ` [PATCH 16/26] statd: Support IPv6 DNS lookups in smn_lookup Chuck Lever
2009-10-13 14:57 ` [PATCH 17/26] statd: squelch compiler warning in sm-notify.c Chuck Lever
2009-10-13 14:57 ` [PATCH 18/26] statd: Introduce statd version of matchhostname() Chuck Lever
2009-10-13 14:57 ` [PATCH 19/26] libnsm.a: add nsm_present_address() API Chuck Lever
2009-10-13 14:57 ` [PATCH 20/26] statd: add IPv6 support in sm_notify_1_svc() Chuck Lever
2009-10-13 14:57 ` [PATCH 21/26] statd: Support IPv6 is caller_is_localhost() Chuck Lever
2009-10-13 14:58 ` [PATCH 22/26] statd: Support IPv6 in sm_simu_crash_1_svc Chuck Lever
2009-10-13 14:58 ` [PATCH 23/26] statd: Support IPv6 in sm_mon_1_svc() Chuck Lever
2009-10-13 14:58 ` [PATCH 24/26] statd: Support IPv6 in sm_stat_1_svc() Chuck Lever
2009-10-13 14:58 ` Chuck Lever [this message]
2009-10-13 14:58 ` [PATCH 26/26] statd: Support TI-RPC statd listener Chuck Lever
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=20091013145829.2424.46708.stgit@matisse.1015granger.net \
--to=chuck.lever@oracle.com \
--cc=chris.mason@oracle.com \
--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