[AC_HELP_STRING([--enable-secure-statd],
[Only lockd can use statd (security)])],
test "$enableval" = "yes" && secure_statd=yes,
- secure_statd=no)
+ secure_statd=yes)
if test "$secure_statd" = yes; then
AC_DEFINE(RESTRICTED_STATD, 1, [Define this if you want to enable various security checks in statd. These checks basically keep anyone but lockd from using this service.])
fi
notify_list *clnt;
struct in_addr my_addr;
#ifdef RESTRICTED_STATD
- struct in_addr mon_addr, caller;
+ struct in_addr caller;
#else
struct hostent *hostinfo = NULL;
#endif
goto failure;
}
+#if 0
+ This is not usable anymore. Linux-kernel can be configured to use
+ host names with NSM so that multi-homed hosts are handled properly.
+ NeilBrown 15mar2007
+
/* 3. mon_name must be an address in dotted quad.
* Again, specific to the linux kernel lockd.
*/
mon_name);
goto failure;
}
-#else
+#endif
+#endif
/*
* Check hostnames. If I can't look them up, I won't monitor. This
* might not be legal, but it adds a little bit of safety and sanity.
*/
/* must check for /'s in hostname! See CERT's CA-96.09 for details. */
- if (strchr(mon_name, '/')) {
- note(N_CRIT, "SM_MON request for hostname containing '/': %s",
- mon_name);
+ if (strchr(mon_name, '/') || mon_name[0] == '.') {
+ note(N_CRIT, "SM_MON request for hostname containing '/' "
+ "or starting '.': %s", mon_name);
note(N_CRIT, "POSSIBLE SPOOF/ATTACK ATTEMPT!");
goto failure;
} else if (gethostbyname(mon_name) == NULL) {
note(N_WARNING, "gethostbyname error for %s", mon_name);
goto failure;
- } else if (!(hostinfo = gethostbyname(my_name))) {
+ }
+#ifndef RESTRICTED_STATD
+ if (!(hostinfo = gethostbyname(my_name))) {
note(N_WARNING, "gethostbyname error for %s", my_name);
goto failure;
} else
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
+#include <arpa/inet.h>
#include "statd.h"
#include "notlist.h"
{
static char *result = NULL;
+#ifdef RESTRICTED_STATD
+ struct in_addr caller;
+
+ /* 1. Reject anyone not calling from 127.0.0.1.
+ * Ignore the my_name specified by the caller, and
+ * use "127.0.0.1" instead.
+ */
+ caller = svc_getcaller(rqstp->rq_xprt)->sin_addr;
+ if (caller.s_addr != htonl(INADDR_LOOPBACK)) {
+ note(N_WARNING,
+ "Call to statd from non-local host %s",
+ inet_ntoa(caller));
+ goto failure;
+ }
+ if (ntohs(svc_getcaller(rqstp->rq_xprt)->sin_port) >= 1024) {
+ note(N_WARNING,
+ "Call to statd-simu-crash from unprivileged port\n");
+ goto failure;
+ }
+#endif
note (N_WARNING, "*** SIMULATING CRASH! ***");
my_svc_exit ();
if (rtnl)
nlist_kill (&rtnl);
+#ifdef RESTRICTED_STATD
+ failure:
+#endif
return ((void *)&result);
}