[sr-dev] git:sr_3.0: modules_k/nathelper: handle_uri_alias() alias handling fix
Klaus Darilion
klaus.mailinglists at pernau.at
Wed Dec 30 15:55:26 CET 2009
Hi Juha!
One more suggestion: I think a note should be added to README like:
Note: If you are using add_contact_alias() and handle_ruri_alias() this
means that you are routing based on the alias parameter. Thus, make sure
that an attacker can not spoof this paramter, e.g. screen the contact
header and RURI for existing 'alias' parameters. Especially for initial
requests make sure to route only on alias paramters which were added by
your system.
Maybe add_contact_alias() should overwrite existing alias parameters?
regards
klaus
Juha Heinanen schrieb:
> Module: sip-router
> Branch: sr_3.0
> Commit: 9d98ca32bb131c0fb190e012ed0bff3f9a26557a
> URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=9d98ca32bb131c0fb190e012ed0bff3f9a26557a
>
> Author: Juha Heinanen <jh at tutpro.com>
> Committer: Juha Heinanen <jh at tutpro.com>
> Date: Wed Dec 30 12:19:03 2009 +0200
>
> modules_k/nathelper: handle_uri_alias() alias handling fix
> - handle_uri_alias() now finds ;alias r-uri param even if it is not
> the first param.
>
> ---
>
> modules_k/nathelper/nathelper.c | 53 ++++++++++++++++++++++++--------------
> 1 files changed, 33 insertions(+), 20 deletions(-)
>
> diff --git a/modules_k/nathelper/nathelper.c b/modules_k/nathelper/nathelper.c
> index fadc93f..27ef349 100644
> --- a/modules_k/nathelper/nathelper.c
> +++ b/modules_k/nathelper/nathelper.c
> @@ -1501,41 +1501,54 @@ add_contact_alias_f(struct sip_msg* msg, char* str1, char* str2)
> static int
> handle_ruri_alias_f(struct sip_msg* msg, char* str1, char* str2)
> {
> - str params, uri, proto;
> - char buf[MAX_URI_SIZE], *val, *sep, *trans, *at, *next, *cur_uri;
> - unsigned int len, plen, alias_len, proto_type, cur_uri_len;
> + str uri, proto;
> + char buf[MAX_URI_SIZE], *val, *sep, *trans, *at, *next, *cur_uri, *rest;
> + unsigned int len, rest_len, val_len, alias_len, proto_type, cur_uri_len,
> + ip_port_len;
>
> if ((msg->parsed_uri_ok == 0) && (parse_sip_msg_uri(msg) < 0)) {
> LM_ERR("while parsing Request-URI\n");
> return -1;
> }
> - params = msg->parsed_uri.params;
> - if (params.len == 0) {
> + rest = msg->parsed_uri.params.s;
> + rest_len = msg->parsed_uri.params.len;
> + if (rest_len == 0) {
> LM_DBG("no params\n");
> return 2;
> }
> - if ((params.len < ALIAS_LEN) ||
> - (strncmp(params.s, ALIAS, ALIAS_LEN) != 0)) {
> + while (rest_len >= ALIAS_LEN) {
> + if (strncmp(rest, ALIAS, ALIAS_LEN) == 0) break;
> + sep = memchr(rest, 59 /* ; */, rest_len);
> + if (sep == NULL) {
> + LM_DBG("no alias param\n");
> + return 2;
> + } else {
> + rest_len = rest_len - (sep - rest + 1);
> + rest = sep + 1;
> + }
> + }
> +
> + if (rest_len < ALIAS_LEN) {
> LM_DBG("no alias param\n");
> return 2;
> }
>
> /* set dst uri based on alias param value */
> - val = params.s + ALIAS_LEN;
> - plen = params.len - ALIAS_LEN;
> - sep = memchr(val, 116 /* t */, plen);
> + val = rest + ALIAS_LEN;
> + val_len = rest_len - ALIAS_LEN;
> + sep = memchr(val, 116 /* t */, val_len);
> if (sep == NULL) {
> - LM_ERR("no 't' in alias param\n");
> + LM_ERR("no 't' in alias param value\n");
> return -1;
> }
> at = &(buf[0]);
> append_str(at, "sip:", 4);
> - len = sep - val;
> - alias_len = SALIAS_LEN + len + 2 /* tn */;
> - memcpy(at, val, len);
> - at = at + len;
> + ip_port_len = sep - val;
> + alias_len = SALIAS_LEN + ip_port_len + 2 /* tn */;
> + memcpy(at, val, ip_port_len);
> + at = at + ip_port_len;
> trans = sep + 1;
> - if ((len + 2 > plen) || (*trans == ';') || (*trans == '?')) {
> + if ((ip_port_len + 2 > val_len) || (*trans == ';') || (*trans == '?')) {
> LM_ERR("no proto in alias param\n");
> return -1;
> }
> @@ -1543,7 +1556,7 @@ handle_ruri_alias_f(struct sip_msg* msg, char* str1, char* str2)
> if (proto_type != PROTO_UDP) {
> proto_type_to_str(proto_type, &proto);
> if (proto.len == 0) {
> - LM_ERR("unkown proto in alias param\n");
> + LM_ERR("unknown proto in alias param\n");
> return -1;
> }
> append_str(at, ";transport=", 11);
> @@ -1551,7 +1564,7 @@ handle_ruri_alias_f(struct sip_msg* msg, char* str1, char* str2)
> at = at + proto.len;
> }
> next = trans + 1;
> - if ((len + 2 < plen) && (*next != ';') && (*next != '?')) {
> + if ((ip_port_len + 2 < val_len) && (*next != ';') && (*next != '?')) {
> LM_ERR("invalid alias param value\n");
> return -1;
> }
> @@ -1572,11 +1585,11 @@ handle_ruri_alias_f(struct sip_msg* msg, char* str1, char* str2)
> cur_uri_len = msg->first_line.u.request.uri.len;
> }
> at = &(buf[0]);
> - len = params.s - 1 /* ; */ - cur_uri;
> + len = rest - 1 /* ; */ - cur_uri;
> memcpy(at, cur_uri, len);
> at = at + len;
> len = cur_uri_len - alias_len - len;
> - memcpy(at, params.s + alias_len - 1, len);
> + memcpy(at, rest + alias_len - 1, len);
> uri.s = &(buf[0]);
> uri.len = cur_uri_len - alias_len;
> LM_DBG("rewriting r-uri to <%.*s>\n", uri.len, uri.s);
>
>
> _______________________________________________
> sr-dev mailing list
> sr-dev at lists.sip-router.org
> http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev
More information about the sr-dev
mailing list