On Wed, Aug 07, 2024 at 12:43:30PM -0500, Eric Blake wrote: > A client that opens a socket but does not negotiate is merely hogging > qemu's resources (an open fd and a small amount of memory); and a > malicious client that can access the port where NBD is listening can > attempt a denial of service attack by intentionally opening and > abandoning lots of unfinished connections. The previous patch put a > default bound on the number of such ongoing connections, but once that > limit is hit, no more clients can connect (including legitimate ones). > The solution is to insist that clients complete handshake within a > reasonable time limit, defaulting to 10 seconds. A client that has > not successfully completed NBD_OPT_GO by then (including the case of > where the client didn't know TLS credentials to even reach the point > of NBD_OPT_GO) is wasting our time and does not deserve to stay > connected. Later patches will allow fine-tuning the limit away from > the default value (including disabling it for doing integration > testing of the handshake process itself). > > Note that this patch in isolation actually makes it more likely to see > qemu SEGV after nbd-server-stop, as any client socket still connected > when the server shuts down will now be closed after 10 seconds rather > than at the client's whims. That will be addressed in the next patch. > > For a demo of this patch in action: > $ qemu-nbd -f raw -r -t -e 10 file & > $ nbdsh --opt-mode -c ' > H = list() > for i in range(20): > print(i) > H.insert(i, nbd.NBD()) > H[i].set_opt_mode(True) > H[i].connect_uri("nbd://localhost") > ' > > where later connections get to start progressing once earlier ones are > forcefully dropped for taking too long, rather than hanging. > > Suggested-by: Daniel P. Berrangé <berra...@redhat.com> > Signed-off-by: Eric Blake <ebl...@redhat.com> > --- > nbd/server.c | 31 ++++++++++++++++++++++++++++++- > nbd/trace-events | 1 + > 2 files changed, 31 insertions(+), 1 deletion(-)
Reviewed-by: Daniel P. Berrangé <berra...@redhat.com> With regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|