snmp_portscan.nes lockups

Brian Costello <[email protected]>
Newsgroups gmane.comp.security.nessus.devel
Message-ID <[email protected]>
Hello,

Ever since 2.0.7, I've seen some snmp_portscan lockups on other people's
networks.  I've never had this happen to my network (despite vigerous
attempts to reproduce the problem) but I can't imagine what situation would
cause the module to lockup like that.  Here are the details surrounding this
[potential] issue...

- snmpwalk isn't running when I look at the ps output - but there will
always be at least a couple nessusd processes that specified that it was
running snmp_portscan.nes

- The timeout seems to have been activated after 60 seconds (according to
nessusd.messages), which - from what I can tell - is the proper timeout
(it's hardcoded into the module).  However, while that MIGHT be killing
snmpwalk (although most likely not, keep reading), it's not killing the
snmp_portscan.nes plugin.

- snmpwalk is installed in /usr/bin.  There are definitely no other copies
of snmpwalk on the system.

- kill -9-ing the nessusd process with the snmp_portscan.nes message allows
the scan to continue normally.

- snmpwalk has been 5.0.1 (redhat build, where the version ID is interpreted
as the old-style commandline args, but in fact uses the new commandline
argument style, which causes the plugin to create an invalid commandline),
5.1.0 and 5.1.1 (the last two being fedora RPMs).  I should point out again
that I've never had snmpwalk or snmp_portscan hang on any scan I'VE kicked
off for any reason - it always seems to timeout properly.

- The hangs have occurred on the FreeBSD 4.8, FreeBSD 4.9 and Linux 2.6
kernels, each time during a single scan, but with max_checks set to 5,
max_hosts set to 20, for a total of 100 nessusd scanning processes.  Memory
definitely didnt appear to be an issue - at least not when I checked.  The
systems in question that have had this problem all have at least 1GB of RAM,
so running out of memory seems unlikely, but I guess it's possible.

- Lockups do NOT happen each time - they SEEM random - they can happen
during heavy activity times, as well as times of no activity

- The systems where the lockups are occurring have no development
applications, so I can't run gdb, strace, truss, etc to figure out exactly
what nessusd or snmp_portscan.nes are hanging on.

That being said, I looked through the source code, and I noticed something
that SEEMS wrong - I can't say for sure if it is actually a bug, since I
haven't had time to work out if nessusd is doing some things that I'm not
noticing ...

The wrong-seeming thing is that only the first nessus_popen (used by the
version detection routine) saves the process ID in snmpwalk_process.  That
means that when the timeout occurs, and SIGTERM is sent to
snmp_portscan.nes, it will - at best - kill the version detection.  However,
from there, it appears like it will just keep running.

To verify my theory, I created a binary called snmpwalk that would return a
valid snmpwalk version string when called with -V, but would sleep for 30
minutes in all other cases.  As I'd predicted, SIGTERM was called, but
nothing was killed, because snmp_portscan.nes was trying to kill the pid
from the version scan.

Next, I started saving the pid for each nessus_popen (in the current version
of the plugins that I have (2.0.10a), this is normally given a NULL
parameter.  I changed the NULL to &snmpwalk_process, and sure enough, the
FIRST snmpwalk process is killed, but then snmp_portscan will run the next
snmpwalk process, and so on.

So, I added some additional code at the end of the sigterm_handler code to
kill -9 getpid(), and THAT seemed to do what I was looking for.

Obviously, my version of snmpwalk isn't a perfect test - I've never had
snmpwalk lock up on me, or fail to timeout, regardless of the network
condition (routes down, dead host, packet filtering, etc) - even when the
nessusd server's load is well over 100, and the local network is nearly
saturated... therefore I am ASSUMING the problem isn't related to snmpwalk
being frozen, but more likely is some sort of blocking / deadlock related to
some code in the plugin.

So after that lengthy explanation, I have the following questions:

- Is snmp_portscan missing functionality, or am I misunderstanding how the
timeout process works?  That is, should it really ONLY be trying to kill a
pid that has most likely exited?  I would think a timeout routine would want
to exit from the module as soon as the signal is caught - but none of the
other plugins seem to do this either, making me wonder whether all plugins
are at the 

- Is anyone else having these hangs?  Does anyone know how to reproduce
this?  When researching this problem, I found a reference to this in the
archives, but it was regarding 2.0.7 or earlier, IIRC.  I would think this
would cause problems for more people than me.

- On another note, is it possible that the version detection routines are
incorrect?  It SEEMS like the commandline arguments changed at version 5,
not > 5.0.5, like the version detection routines say.  However, knowing
Redhat, they might've back-ported some 5.0.5+ functionality into the 5.0.1
version, then left the version # alone.

- On yet another note, is it a good idea to hardcode a timeout value?  Yes,
its a good idea to make sure the timeout is never too low (60 seconds is
usually enough time) - BUT if someone has changed the snmpwalk timeout to
something like 30 seconds, the plugin will timeout prior to kicking off all
of the snmpwalk processes (again, assuming I understand what the timeout is
doing).

I would really appreciate any help anyone could give me - there are a few
blocking functions that could theoretically cause the deadlocks these people
are having - assuming that there's some sort of race condition /
timing-related ossue.  At the same time, I don't see how the existing
timeout code could possibly remedy a lockup / deadlock with the
snmp_portscan plugin.  I should also say that other than this lockup, nessus
v2.0.10a has been extremely stable and reliable.

Let me know if I can do anything to help resolve this issue - I can send you
the nessus.conf config file that was used for the scan.  I can also try to
get any other log file from the problematic nessus server - just ask and I'd
be more than happy to try to get at it.

Thank you for your time,

Brian Costello
[email protected]
_______________________________________________
Nessus-devel mailing list
[email protected]
http://mail.nessus.org/mailman/listinfo/nessus-devel
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.