J. Ferguson Intrusion Analyst NNSA Information Assurance Response Center fergusonj@xxxxxxxxxx -----Original Message----- From: Ferguson, Justin (IARC) Sent: Wednesday, September 14, 2005 6:50 AM To: 'Martin Roesch'; Ferguson, Justin (IARC) Cc: 'snort-devel@xxxxxxxxxxxxxxxxxxxxx'; 'snort-users@xxxxxxxxxxxxxxxxxxxxx'; 'bugtraq@xxxxxxxxxxxxxxxxx' Subject: RE: [Snort-devel] Re: [Snort-users] Snort DoS Fallacies Martin, et al, Most of what you've said in this last email I agree with and thus will just edit out in my reply, but before I get to that something that was brought to my attention last night that is somewhat concerning is that this bug was first disclosed in Dec 2004 by a group called 'milw0rm', a quick google search will bring up the exploit and quotes from irc of you talking about the exact same bug. It would appear that somewhere this bug was remerged into snort, which makes me wonder 1) what other bugs and such have made it back into the current versions? And 2) did this DoS affect sourcefire as well, or only the free version? With that said, comments inline. >Ok, I'll put aside all assumptions about your motives and just lay it >out as straight as I'm able. I appreciate the candor, and I assure you I have no political motivations in my bringing this up. If that was my goal there are many other, more effective ways to do this.. Such as posting the findings of a source audit I was commissioned to do not long ago. My one and only motivation in bringing this up was simply that people were misinformed and my concern was that someone who may not be able to upgrade for any number of reasons (outside the realm of snort itself), may say to themselves 'well I don't use verbose/-v and therefore am fine' when in fact because of any other circumstantial reasons they may in fact be vulnerable. As a vendor, I, and many people see it as your responsibility to fully disclose the details-- at least in regards to who is affected by a bug. In fact, the only reason I found this was I was writing a patch for an undisclosed 3rd party client who is one of those people who cannot upgrade and wasn't affected by the vulnerability as it was disclosed, and I just happened to grep out of habit after the patch was done. >If you can't execute a code path that could result in an execution >fault then it's not a bug. For example, we don't validate that the >Packet pointer that gets passed into the decoder is valid because the >design of the program. Anyway... I agree with you, however if you are so sure of this, why even add the other if ()'s? >It becomes your job when you speak up, pundits add no value to open >source projects and when you stepped up to "set the record straight" >with incorrect or incomplete data you don't get to get off the hook >by saying "it's not my job". Agreed, and I will not say I did all of my homework on this particular part. I did not check under what conditions data->packet_flag was set, and made the apparently incorrect assumption that -A fast allowed the execution path. I say apparently, because I still have no confirmed in the code that you are correct, I'm just taking your word (and code snippets) on it. >Case closed on that one, don't use the "packet" option if you're >using "output alert_fast" in snort.conf and otherwise you're set at >the command line with "-A fast". Agreed, and to be pedantic, this was only my point that it *could* happen, not that many or even anyone was actually doing it-- just to mention it in case someone was, I was just incorrect on the exact details. >If you run with ASCII logging you can be DoS'd at any time (fairly >trivially) and that code will not be fixed because it works as >designed. This problem pales in comparison IMO. Yes and no, some people have ungodly amounts of disk space (and thus lots of inodes), and some people set their logs to eat themselves or rotate them out (yes, I am aware of why you shouldn't do that, comments not needed)- in which case this would be a more effective DoS. Additionally, if I can generate enough traffic, I can DoS you by just causing enough alerts and making you run out of disk space-- yes someone should be watching to prevent this from ever happening, but its kind of the same deal. Again, the point was not to argue the semantics of whether one should or should not be running ASCII logging, but rather that if you are one of those people doing that, you are vulnerable to this DoS even if you are not using -v, despite what the advisor{y,ies) state. >I pointed out that developers use the DEBUG statements because you >didn't seem to be familiar with how that code is used and why it's >there. If you really dig into it you'll see that not only do you >have to --enable-debug when you run ./configure but you also have to >set an environment variable (export SNORT_DEBUG=131072) even if debug >mode is enabled. Working with the presumption that the code you were looking at didn't have the #ifdef/if()PrintIPPkt() #endif PrintIPPkt() part, then yes I can see how you might misunderstand my statement. I was just simply stating that in that instance, with the code I was looking at, it made 0 sense to even have the #ifdef's as the result was the same either way. >Regardless, that's not the way the code is in 2.4.0 or CVS nor in any >of the initial development versions from when I wrote it. I don't >know where you got that code from but it looks like a bad CVS merge >on your end. Download 2.4.0 or CVS on the SNORT_2_4 branch to see >the actual code (I did). That's all fine and well, but I didn't actually check the code out of CVS, I pulled down the snapshots-2.4 from snort.org/pub-bin/snapshots.cgi yesterday and that's where the code existed, and I found it also in previous versions of snort. I just pulled it down again and found it still exists in there/has the same md5sum: 3050 #ifdef DEBUG_FRAG3 3051 /* 3052 * Note, that this won't print out the IP Options or any other 3053 * data this is established when the packet is decoded. 3054 */ 3055 if (DEBUG_FRAG & GetDebugLevel()) 3056 { 3057 ClearDumpBuf(); 3058 printf("++++++++++++++++++Frag3 DEFRAG'd PACKET++++++++++++++\n"); 3059 PrintIPPkt(stdout, defrag_pkt->iph->ip_proto, defrag_pkt); 3060 printf("++++++++++++++++++Frag3 DEFRAG'd PACKET++++++++++++++\n"); 3061 ClearDumpBuf(); 3062 } 3063 #endif 3064 ClearDumpBuf(); 3065 printf("++++++++++++++++++Frag3 DEFRAG'd PACKET++++++++++++++\n"); 3066 PrintIPPkt(stdout, defrag_pkt->iph->ip_proto, defrag_pkt); 3067 printf("++++++++++++++++++Frag3 DEFRAG'd PACKET++++++++++++++\n"); 3068 ClearDumpBuf(); I think you should double check the code. As this DEBUG is pointless, and this DoS is vuln in the frag3 preprocessor if its enabled. $ md5sum snort-snapshots-2.4.tar.gz b96672bd923e130250a3099317572f66 snort-snapshots-2.4.tar.gz $ ls -alh snort-snapshots-2.4.tar.gz -rw-r--r-- 1 jferguson jferguson 1.9M Sep 14 13:03 snort-snapshots-2.4.tar.gz The source is also attached. >For giggles >I rigged the POC to try every possible value of TCP option and length >with a variety of option sizes, it didn't cause any problems so I'd >say that the code is conclusively not vulnerable to this issue >outside of the SACK option in TCP option processing. We both know that fuzzing/black boxing of this sort proves very little, if you were that confident that the points could never be NULL then the other if (...)'s wouldn't have been added, but it's a moot point and really not worth the argument. >I was merely pointing out the real actual issue as I saw it, you >didn't make the point when in fact it was the most serious one. Which shows how easily this mistake that was made on your teams part can be made. I grepped for PrintIPPkt() and not PrintTCPHeader() or whatever it was. >The >DEBUG code is only called if you manually enable debug mode at >compile time and set an appropriate environment variable so that's a >complete non-issue as far as this is concerned. In the stream4 preprocessor yes, in frag3, depending on which code you have, having the debugging enabled just stops the DoS from happening twice, which is an impossibility anyways. >Saving face has nothing to do with it. You made claims to be >pointing out other issues that were incorrect or required >expansion. The only things I've said that was incorrect was my assumption that -A fast triggered the one in fast, and that arguably, that the other pointers could possibly be NULL. Everything else was correct. >The one real issue that people were likely to run into >with the default configuration of a relatively commonly used option >was missed. You also made several assumptions without testing them >and proposed to broaden the scope of the vulnerability to different >inputs without any proof or, ultimately, merit. And your team, the vendor missed all of the above on your first *two* passes through, once in Dec 2004, and once in Aug/Sep 2005, does this mean what you've said and/or done is without merit as well? You guy's obviously didn't do much testing either. Furthermore, you have useless #ifdef's that you don't even know exist, is this supposed to inspire confidence in you or your team and make us want to buy your product? >1) The DoS effects "-A fast" - this was wrong, it only effects the >output directive with a little used optional argument But it still affects those few people, which would not have known this by going by whats on the snort news/advisories. >2) ASCII logging also has the problem - right, but if you run with >ASCII logging you're subject to other DoS's as well that are endemic >to the configuration The other DoS's are a known issue, this was a non-known issue that in quite a big quieter, and again was not referenced and still not referenced in your bug report. >3) Other TCP options can cause the same DoS - this was wrong I have no proof otherwise, so I won't argue. >4) The DoS effects frag3 and stream4 - this was wrong, there's no >practical configuration that will result in a DoS with frag3/stream4 You are incorrect, as I showed above. Frag3 has the problem without debugging. And either way, here is another possible avenue, regardless of whether its plausible or not, its still possible.. You'd think as a security vendor you would want people to know this, but it appears that you are more concerned with saying 'these issues are a non-issue, you are only vuln if you use -v' than correcting the mistake and saying, 'if in the unlikely event you are using one of these non-recommended configurations, then you are also subject to this problems, but you shouldn't be doing that anyways'. >We payed attention to the initial data from the original reporter and >said "yep, -v is a problem" and left it at that. Did you not at least get dejavu from 2004? >Once you pointed >out that there are some other paths in there it spurred me to take a >look (we haven't really done much with that code in years, it really >should not be used for production as I've said) and the full analysis >is as I described in this email and the last. Minus the mistake(s) I've pointed out in this email, namely the frag3 thing. >The fixes in CVS fix >all the problems just like the fix the original problem, so if you >absolutely must have a fix today then do as I said and grab log.c >from CVS and recompile. You do not find it odd at all, that you say 'no one should be doing xyz on production sensors anyways', and then you suggest that they run CVS code on production sensors? Which one do you think will result in problems first? >It doesn't appear that there's anything more to say on this topic >unless you have some more observations you'd like to make. I'm attaching a patch that may/may not cleanly patch against all previous versions of snort, it's been tested with 2.3.3. Regardless someone who cannot upgrade to CVS and needs ASCII/frag3/-A full/-A fast + conf options/to sleep well at night not wondering if there is another execution path that we both missed can simply look at the patch and hand merge the changes into log.c, they are fairly trivial and the patch is quite straight forward. Best Regards, J. Ferguson Intrusion Analyst NNSA Information Assurance Response Center (IARC) fergusonj@xxxxxxxxxx