[Twisted-Python] Broker leak in spread server on login failure = denial of service?
David K. Hess
dhess at verscend.com
Fri Sep 9 15:31:28 MDT 2005
I believe I've discovered a broker leak when a checker denies a login
and that it can be used to launch a denial of service attack on a
spread server.
When a checker throws a Failure exception, since requestAvatar in the
realm doesn't get called, the realm (or anything else) doesn't end up
with a reference it can use to disconnect the network connection that
was denied login.
If a malicious (or just buggy as was my case) client tries to login
over and over again and doesn't shutdown each connection from the
client side, the server will continue to leak brokers until (under
Windows) the select() call begins to fail because there are greater
than 512 (with a stock Python build) file descriptors open and being
monitored by the reactor. At this point, your server is dead as the
reactor goes into an infinite loop retrying failing select() calls
when this happens.
What I think might be best is if another method in the realm (say
"loginFailed(self, mind)") was called with the remote reference so
the server could then call mind.broker.transport.loseConnection() on
it. It would be nice too if this was after the Failure had been sent
back across the connection and not before.
clientConnectionMade in PBServerFactory also looks promising but it
doesn't seem possible to figure out which connection is
authenticating from within the checker.
Can anybody offer some advice on how best to handle this?
Thanks!
Dave
More information about the Twisted-Python
mailing list