<p>One more thing that just came to mind;<br>
Shouldn&#39;t alwaysauthreject be considered to be enabled by default for the same reason?</p>
<p>My apologies if that is already the case.</p>
<p>Regards,<br>
Örn</p>
<div class="gmail_quote">On Oct 21, 2011 11:24 PM, &quot;Örn Arnarson&quot; &lt;<a href="mailto:orn@arnarson.net">orn@arnarson.net</a>&gt; wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hello,<br>
<br>
I don&#39;t really have anything to add except from superficially -- just<br>
wanted to toss in my vote for which option to deal with this problem<br>
sounds the most appealing.<br>
<br>
In my opinion, option #3 sounds like a clear winner. From what I can<br>
tell from the historical background you wrote (which was a very<br>
interesting read, by the way), it seems like it should&#39;ve been made<br>
the default behavior a long time ago anyway.<br>
<br>
Option #1 sounds like a really hard sell. Using UDP for SIP is such a<br>
norm that I can&#39;t remember encountering anyone who uses TCP apart from<br>
Microsoft Lync/OCS. Not to say that it&#39;s a bad idea at all, but once<br>
something has become a de-facto industry standard, it&#39;s hard to shift.<br>
I think this option would probably lead to most people ignoring the<br>
security issue.<br>
<br>
Option #2 also sounds like a hard one. If we assume that there will be<br>
some devices where this change will break their interoperability over<br>
certain NAT scenarios, it would be a cause of significant problems for<br>
people who I&#39;m sure would much rather solve their security issues via<br>
firewalling or just ignoring them altogether. Additional security<br>
measures can be taken by most admins. Changing the code and<br>
re-compiling, or even getting the UA fixed by the manufacturer is a<br>
much harder task (or it may seem so to the person who has to perform<br>
it at least).<br>
<br>
Having the option to disable nat, and perhaps explaining the<br>
ramifications with comments above the sample entry, seems like the way<br>
to go to me. More versatility and more freedom for the user. Assuming<br>
that he knows what he&#39;s doing isn&#39;t such a bad thing, I think.<br>
Additionally,  I think having to disable something rather than enable<br>
is more likely to make you think about what it is you&#39;re disabling as<br>
well, so maybe it&#39;s enough. Especially if you do it in [general].<br>
Maybe that&#39;s just me though.<br>
<br>
Now, as to whether or nat=yes is always set on *my* definitions, then<br>
the answer is no. Why? Because I never bothered to actually check<br>
whether what nat=yes did was something that was desireable for all<br>
clients or not. All I knew was that if I had problems with NATed<br>
clients, this would usually fix it. I assumed nat=yes meant breaking<br>
some RFC behavior to try to satisfy shitty ALGs. Furthermore, as it<br>
isn&#39;t enabled by default I thought it could possibly have some<br>
detrimental effect on non-NATed UAs. I think maybe the name is a bit<br>
misleading.<br>
<br>
Anyway, sorry if this isn&#39;t helpful or relevant at all, but it seemed<br>
like you were basically asking for feedback from anyone with an<br>
opinion in the matter.<br>
<br>
Regards,<br>
Örn Arnarson<br>
<br>
On Fri, Oct 21, 2011 at 10:52 PM, Kevin P. Fleming &lt;<a href="mailto:kpfleming@digium.com">kpfleming@digium.com</a>&gt; wrote:<br>
&gt; Sorry in advance for the length of this message... I&#39;ve intentionally<br>
&gt; included quite a lot of background information so that we can hopefully be<br>
&gt; able to discuss this issue rapidly and reach consensus.<br>
&gt;<br>
&gt; Recently, a potential security issue was brought to our attention: it has<br>
&gt; existed in (probably) every version of Asterisk that included chan_sip. It&#39;s<br>
&gt; not something we&#39;d classify as &#39;critical&#39; or even &#39;major&#39;, but it is a<br>
&gt; concern we want to address. Terry Wilson has spent some time investigating<br>
&gt; it, and then he and I spent some time over the last couple of days thinking<br>
&gt; about how (or if) it can be addressed.<br>
&gt;<br>
&gt; The essence of the problem is this: it is possible under some circumstances<br>
&gt; for an attacker to be able to enumerate (discover) the names of SIP peers<br>
&gt; (and possibly users) defined on an Asterisk system. If they can discover the<br>
&gt; valid peer names, they can then focus password-guessing attacks on those<br>
&gt; names, which increases their chances of being able to gain access to the<br>
&gt; system. Generally speaking we&#39;ve tried to make changes to Asterisk to remove<br>
&gt; this type of &#39;information disclosure&#39; vulnerability, in order to help<br>
&gt; Asterisk users keep their systems as secure as possible.<br>
&gt;<br>
&gt; Unfortunately in this case, we can&#39;t solve the problem without removing a<br>
&gt; useful feature of chan_sip. Here&#39;s why:<br>
&gt;<br>
&gt; According to RFC 3261, when Asterisk (acting as UAS) receives a SIP request<br>
&gt; from another SIP entity (acting as UAC), any responses that Asterisk<br>
&gt; generates must be sent back to the IP address that the request was received<br>
&gt; from, but to the *port number* specified in the top-most Via header included<br>
&gt; in the request (this is important: they are *NOT* sent back to the port<br>
&gt; number the request was received from).<br>
&gt;<br>
&gt; For most SIP clients, who are not sending their SIP requests across NAT<br>
&gt; devices, this is not a problem; they&#39;ll send their requests from port 5060,<br>
&gt; and expect responses on port 5060 (and they&#39;ll either explicitly specify<br>
&gt; port 5060 in that top-most Via header, or they&#39;ll leave it out and let the<br>
&gt; RFC-specified default take effect). There could be some SIP clients out<br>
&gt; there who send their requests from one port (port A), but want to receive<br>
&gt; responses on a different port (port B). In this case, the top-most Via<br>
&gt; header will include port B, not port A. In our experience, this is extremely<br>
&gt; uncommon, but it is RFC compliant behavior.<br>
&gt;<br>
&gt; When NAT devices enter the picture, though, things get more complicated (as<br>
&gt; they always do). Going back to the &#39;normal&#39; SIP clients, that send requests<br>
&gt; from, and expect responses on, the same port... now they have a problem. If<br>
&gt; they send their request from port 5060, and expect responses on 5060, their<br>
&gt; top-most Via header will reflect that. However, when the request crosses the<br>
&gt; NAT on its way to the UAS, it will appear to have been sent from a different<br>
&gt; IP address and port number than the UAC sent it from (by definition...<br>
&gt; network address translation). Asterisk (the UAS) will respond back to the IP<br>
&gt; address that the NAT used to send the request, but it will *NOT* respond to<br>
&gt; the port number the NAT assigned; it will respond to the port number in the<br>
&gt; top-most Via header. Unless the NAT device just happened to assign the same<br>
&gt; port number (and some NAT devices will attempt to do that), or if the NAT<br>
&gt; administrator has setup a static mapping for that port number, the response<br>
&gt; will be lost... it will arrive at the NAT device, it won&#39;t match the port<br>
&gt; mapping established when the request passed through, and the NAT device<br>
&gt; won&#39;t forward it.<br>
&gt;<br>
&gt; This dilemma was identified long ago (over 8 years), and an additional RFC<br>
&gt; was published: RFC 3581. This RFC allows the &#39;rport&#39; parameter to be added<br>
&gt; to Via headers; this allows UACs who are aware that their requests may be<br>
&gt; crossing a NAT device (or even if they aren&#39;t aware, but just want to be as<br>
&gt; safe as possible) to indicate to the UAS that receives their request that<br>
&gt; the UAS should respond to the port that the request was received from, *NOT*<br>
&gt; the port listed in the top-most Via header. Some people would say that this<br>
&gt; is how SIP should have worked from the beginning, and that the extraction of<br>
&gt; *only* the port from the top-most Via header never made any sense at all (I<br>
&gt; would personally agree with those people), but history is what it is. In<br>
&gt; addition to this behavior change, the &#39;rport&#39; parameter also indicates that<br>
&gt; the UAS should report back to the UAC the &#39;perceived&#39; port number; this is<br>
&gt; useful, but is not part of the problem being discussed here.<br>
&gt;<br>
&gt; Asterisk supports RFC 3581, and if a UAC includes &#39;rport&#39; in its top-most<br>
&gt; Via header, Asterisk will indeed respond to both the IP address *and* port<br>
&gt; number that the request was received from.<br>
&gt;<br>
&gt; However (and here&#39;s where we run into trouble), there are some (maybe many)<br>
&gt; SIP UAs out there that cannot (or just do not) include &#39;rport&#39; in the<br>
&gt; top-most Via headers of their requests. Because of this, these UAs can be<br>
&gt; difficult to use behind a NAT device (unless the NAT is configured specially<br>
&gt; as outlined above), because Asterisk can&#39;t deliver responses to the UA (port<br>
&gt; number mismatch). In order to make these devices &#39;work&#39;, Asterisk gained a<br>
&gt; &#39;nat&#39; configuration option many, many years ago that, if set to &#39;yes&#39; (it<br>
&gt; defaults to &#39;no&#39;) tells chan_sip to act *AS IF* the UAC had included &#39;rport&#39;<br>
&gt; in its top-most Via header, even if it didn&#39;t. This does in fact solve the<br>
&gt; problem; responses can now be delivered to the UAC, and the fact that<br>
&gt; Asterisk adds &#39;rport&#39; to the Via header in the response is not harmful...<br>
&gt; the UAC just ignores it.<br>
&gt;<br>
&gt; In later versions of Asterisk this configuration option gained some<br>
&gt; additional behavior (enabling &#39;connection-oriented media&#39; mode), but again,<br>
&gt; that&#39;s not part of this issue. In recent versions, the value of this option<br>
&gt; can even be specified as &#39;force_rport&#39; to more clearly indicate the desired<br>
&gt; behavior.<br>
&gt;<br>
&gt; Now we get to the crux of the problem: this &#39;nat&#39; option can be set both at<br>
&gt; the &#39;[general]&#39; level in sip.conf, and also for peers. This means, of<br>
&gt; course, that they values can differ (and frequently they will, but not<br>
&gt; because the administrator intended for them to differ). This means there are<br>
&gt; four possible combinations, with possible different behaviors. For the<br>
&gt; purposes of this discussion, let&#39;s assume that a UAC is sending a request<br>
&gt; (the request type does not matter) that does *NOT* include &#39;rport&#39; in its<br>
&gt; top-most Via header. In addition, the UAC is purposely sending its request<br>
&gt; from port A, but specifying port B in the top-most Via header. Let&#39;s also<br>
&gt; assume there is a peer called &#39;alice&#39; defined in sip.conf.<br>
&gt;<br>
&gt; Scenario 1: [general] nat=no, [alice] nat=no<br>
&gt;<br>
&gt; No problem here; the behavior of Asterisk will be the same regardless of<br>
&gt; whether the request matches the &#39;alice&#39; peer or not.<br>
&gt;<br>
&gt; Scenario 2: [general] nat=yes, [alice] nat=yes<br>
&gt;<br>
&gt; No problem here; the behavior of Asterisk will be the same regardless of<br>
&gt; whether the request matches the &#39;alice&#39; peer or not.<br>
&gt;<br>
&gt; Scenario 3: [general] nat=no, [alice] nat=yes<br>
&gt;<br>
&gt; Problem here; if the request matches &#39;alice&#39;, Asterisk will respond to port<br>
&gt; A. If the request does not match &#39;alice&#39;, Asterisk will respond to port B.<br>
&gt;<br>
&gt; Scenario 4: [general] nat=yes, [alice] nat=no<br>
&gt;<br>
&gt; Problem here; if the request matches &#39;alice&#39;, Asterisk will respond to port<br>
&gt; B. If the request does not match &#39;alice&#39;, Asterisk will respond to port A.<br>
&gt;<br>
&gt; As you can see, in both scenarios 3 and 4, if the attacker happens across a<br>
&gt; peer name (or source IP address) that happens to match a peer defined in<br>
&gt; sip.conf, and that peer&#39;s &#39;nat&#39; setting differs from the general NAT<br>
&gt; setting, the attacker will be able to notice the difference in response<br>
&gt; pattern from when the request did not match any peer.<br>
&gt;<br>
&gt; So now we know what the problem is, and what causes it. I&#39;ll offer up some<br>
&gt; possible solutions below, and ask for you all to think about this situation<br>
&gt; and help us decide on the right course of action. The eventual goal here is<br>
&gt; to produce a security advisory document telling users about the situation<br>
&gt; and what they can/should do to try to mitigate it; we don&#39;t expect that<br>
&gt; there is any solution that will solve the problem for all users.<br>
&gt;<br>
&gt; Option 1:<br>
&gt;<br>
&gt; Recommend that all users to switch to TCP (or TLS) for SIP communications.<br>
&gt; If they have a version of Asterisk that supports TCP, and devices that also<br>
&gt; support it, they can disable UDP support and avoid this problem entirely<br>
&gt; (since TCP does not have these NAT traversal issues to deal with).<br>
&gt;<br>
&gt; Option 2:<br>
&gt;<br>
&gt; Change Asterisk to always act in &#39;force_rport&#39; mode, period<br>
&gt; (non-configurable). It is possible that there may be some SIP UAs that would<br>
&gt; break if Asterisk did not respond to the port listed in the top-most Via<br>
&gt; header, but it seems rather unlikely at this point. Such UAs would almost<br>
&gt; never be able to be used successfully behind a NAT device. In addition, it<br>
&gt; is remotely possible that there are some SIP UAs that will break if they see<br>
&gt; &#39;rport=&lt;xxxx&gt;&#39; in the Via header returned by Asterisk in its responses.<br>
&gt;<br>
&gt; Option 3:<br>
&gt;<br>
&gt; Allow &#39;force_rport&#39; mode to be disabled, but change the default to enable<br>
&gt; it, in all currently maintained branches (1.4, 1.6.2, 1.8, 10 and trunk).<br>
&gt; This has the same caveats as Option 2, but at least if a user *does* have<br>
&gt; one of these bizarre SIP UAs to deal with, they can set &#39;nat=no&#39; for that<br>
&gt; device after carefully considering the ramifications of the change.<br>
&gt;<br>
&gt; There may be other options to consider, but Terry and I were unable to come<br>
&gt; up with any.<br>
&gt;<br>
&gt; So, questions for the assembled audience here:<br>
&gt;<br>
&gt; Do you have any other options for us to consider?<br>
&gt;<br>
&gt; Are you aware of any SIP UAs that actually *REQUIRE* &quot;nat=no&quot; to<br>
&gt; interoperate with Asterisk?<br>
&gt;<br>
&gt; Do you *always* set &quot;nat=yes&quot; on your SIP peer definitions? Do you also set<br>
&gt; &quot;nat=yes&quot; in the &#39;[general]&#39; section? If not, why not?<br>
&gt;<br>
&gt; --<br>
&gt; Kevin P. Fleming<br>
&gt; Digium, Inc. | Director of Software Technologies<br>
&gt; Jabber: <a href="mailto:kfleming@digium.com">kfleming@digium.com</a> | SIP: <a href="mailto:kpfleming@digium.com">kpfleming@digium.com</a> | Skype: kpfleming<br>
&gt; 445 Jan Davis Drive NW - Huntsville, AL 35806 - USA<br>
&gt; Check us out at <a href="http://www.digium.com" target="_blank">www.digium.com</a> &amp; <a href="http://www.asterisk.org" target="_blank">www.asterisk.org</a><br>
&gt;<br>
&gt; --<br>
&gt; _____________________________________________________________________<br>
&gt; -- Bandwidth and Colocation Provided by <a href="http://www.api-digital.com" target="_blank">http://www.api-digital.com</a> --<br>
&gt;<br>
&gt; asterisk-dev mailing list<br>
&gt; To UNSUBSCRIBE or update options visit:<br>
&gt;  <a href="http://lists.digium.com/mailman/listinfo/asterisk-dev" target="_blank">http://lists.digium.com/mailman/listinfo/asterisk-dev</a><br>
&gt;<br>
</blockquote></div>