diff options
author | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-01-06 21:46:02 +0000 |
---|---|---|
committer | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-01-06 21:46:02 +0000 |
commit | 175360903a03247d46203bdf5a3d53d28aa4696e (patch) | |
tree | 09362786785b0e51476b19addf9538f4f3d4cf03 | |
parent | 5ac4bbbd64da845c9614aa5009ec31dd993d9db0 (diff) |
Add security fix
git-svn-id: http://svn.digium.com/svn/asterisk/tags/1.6.0.3@167315 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r-- | .version | 2 | ||||
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | channels/chan_iax2.c | 20 |
3 files changed, 23 insertions, 5 deletions
@@ -1 +1 @@ -1.6.0.3-rc1 +1.6.0.3 @@ -1,3 +1,9 @@ +2009-01-06 Tilghman Lesher <tlesher@digium.com> + + * Released 1.6.0.3 + + * channels/chan_iax2.c: Security fix AST-2009-001 + 2008-12-03 Tilghman Lesher <tlesher@digium.com> * Released 1.6.0.3-rc1 diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index 107df395b..0a7260752 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -161,6 +161,7 @@ static int trunkmaxsize = MAX_TRUNKDATA; static int authdebug = 1; static int autokill = 0; static int iaxcompat = 0; +static int last_authmethod = 0; static int iaxdefaultdpcache=10 * 60; /* Cache dialplan entries for 10 minutes by default */ @@ -7078,23 +7079,34 @@ static int registry_authrequest(int callno) char challenge[10]; const char *peer_name; int res = -1; + int sentauthmethod; peer_name = ast_strdupa(iaxs[callno]->peer); /* SLD: third call to find_peer in registration */ ast_mutex_unlock(&iaxsl[callno]); - p = find_peer(peer_name, 1); + if (p = find_peer(peer_name, 1)) { + last_authmethod = p->authmethods; + } + ast_mutex_lock(&iaxsl[callno]); if (!iaxs[callno]) goto return_unref; - if (!p) { + if (!p && !delayreject) { ast_log(LOG_WARNING, "No such peer '%s'\n", peer_name); goto return_unref; } memset(&ied, 0, sizeof(ied)); - iax_ie_append_short(&ied, IAX_IE_AUTHMETHODS, p->authmethods); - if (p->authmethods & (IAX_AUTH_RSA | IAX_AUTH_MD5)) { + /* The selection of which delayed reject is sent may leak information, + * if it sets a static response. For example, if a host is known to only + * use MD5 authentication, then an RSA response would indicate that the + * peer does not exist, and vice-versa. + * Therefore, we use whatever the last peer used (which may vary over the + * course of a server, which should leak minimal information). */ + sentauthmethod = p ? p->authmethods : last_authmethod ? last_authmethod : (IAX_AUTH_MD5 | IAX_AUTH_PLAINTEXT); + iax_ie_append_short(&ied, IAX_IE_AUTHMETHODS, sentauthmethod); + if (sentauthmethod & (IAX_AUTH_RSA | IAX_AUTH_MD5)) { /* Build the challenge */ snprintf(challenge, sizeof(challenge), "%d", (int)ast_random()); ast_string_field_set(iaxs[callno], challenge, challenge); |