All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC] protect against denial-of-service on a 4.0 mount
@ 2018-05-22 20:03 Olga Kornievskaia
  2018-05-22 20:08 ` Chuck Lever
  0 siblings, 1 reply; 20+ messages in thread
From: Olga Kornievskaia @ 2018-05-22 20:03 UTC (permalink / raw)
  To: linux-nfs

I'm looking for comments on the approach to deal with the following
denial-of-service issue.

Currently, during the nfs4.0 mount, the code takes the content
supplied by the user in the mount command for "clientaddr" and that
becomes part of the content of the SETCLIENTID client id. There are no
verifications that the supplied address belongs to the client
initiating the mount.

A denial of services comes from where there are 2 clients with IP A
and IP B (bad one). Client IP A mounts and has "IP A" in the
SETCLIENTID. Client IP B does a mount and specified "clientaddr=IP A".
This causes the server to invalidate the lease for the legitimate
client IP A.

My suggested approach to fixing it, is to have nfs-utils do a sanity
checking that will check if the clientaddr that's suppose matches the
IP of the machine. Then currently, if it doesn't then it will ignore
the supplied value and use the IP of the machine. Whether this is
desirable vs say failing the mount and forcing the user to specify the
correct value is up for debate. Also, I'm not sure if the check for
the value of clientaddr should be done in the kernel itself instead of
the nfs-utils.

Below is the rough fix to the nfs-utils. Please comment.

diff --git a/utils/mount/stropts.c b/utils/mount/stropts.c
index 1217823..982927e 100644
--- a/utils/mount/stropts.c
+++ b/utils/mount/stropts.c
@@ -242,11 +242,21 @@ static int nfs_append_clientaddr_option(const
struct sockaddr *sap,
  struct sockaddr *my_addr = &address.sa;
  socklen_t my_len = sizeof(address);

- if (po_contains(options, "clientaddr") == PO_FOUND)
- return 1;
-
  nfs_callback_address(sap, salen, my_addr, &my_len);

+ if (po_contains(options, "clientaddr") == PO_FOUND) {
+ char *addr = po_get(options, "clientaddr");
+         char address[NI_MAXHOST];
+
+         if (!nfs_present_sockaddr(my_addr, my_len, address,
+ sizeof(address)))
+                 goto out;
+
+ if (strcmp(addr, address))
+ goto out;
+ return 1;
+ }
+out:
  return nfs_append_generic_address_option(my_addr, my_len,
  "clientaddr", options);
 }

^ permalink raw reply related	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2018-05-29 20:52 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-05-22 20:03 [RFC] protect against denial-of-service on a 4.0 mount Olga Kornievskaia
2018-05-22 20:08 ` Chuck Lever
2018-05-22 20:17   ` Olga Kornievskaia
2018-05-22 20:22     ` Chuck Lever
2018-05-22 20:38       ` Olga Kornievskaia
2018-05-22 21:02         ` Chuck Lever
2018-05-22 21:21           ` Olga Kornievskaia
2018-05-22 21:44             ` Chuck Lever
2018-05-22 22:11               ` Olga Kornievskaia
2018-05-22 22:36                 ` Chuck Lever
2018-05-23 15:27                   ` Olga Kornievskaia
2018-05-23 16:05                     ` Chuck Lever
2018-05-23 18:20                       ` Olga Kornievskaia
2018-05-29 19:56                   ` J. Bruce Fields
2018-05-29 20:03                     ` Chuck Lever
2018-05-29 20:35                       ` Bruce Fields
2018-05-29 20:14                     ` Olga Kornievskaia
2018-05-29 20:36                       ` J. Bruce Fields
2018-05-29 20:51                         ` Olga Kornievskaia
2018-05-29 20:52                         ` Olga Kornievskaia

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.