Re: TOPOS module routing loop with rogue Route headers

David Tek via sr-users <[email protected]>
Newsgroups gmane.comp.voip.ser
Message-ID <CAE1ziPtYgMh+_81A_7gswv3nuGoOvBWv_aB9QVu1rNvsPBOTcA@mail.gmail.com>
Hello,

I went back to trying to strip the Route header during the pre-topos event
routes and landed on this fix, unfortunately it doesn't check for TLS like
I wanted, but it gives me a fix that I can use:

event_route[topos:msg-receiving] { # Rogue Route headers from Aastra if (
search_hf("Route", "offensivedomain.example.com", "a") ) {
remove_hf("Route"); } }

In my main request handling, I do other security checks so this is just
about fixing the compatibility issue I had with the device.

Thanks!


David

This is not an xkcd-979 scenario https://xkcd.com/979/



On Tue, Jul 15, 2025 at 5:25 PM David Tek <[email protected]> wrote:

> Hello,
>
> Setup:
>
> I activated the TOPOS module in my setup that looks something like this:
>
> SIP Device ---> Proxy1(w/ topos) ---> Proxy2(no topos) ---> ??? --->
> Freeswitch.
>
> I am using Kamailio 6.0.1 (or 6.0.2, not sure).
>
> Both my proxies and the other nodes I don't control in ??? part all add
> Record-Route/Route headers for in-dialog requests.
> So an INVITE coming from the SIP Device will go through these proxies, on
> the 200 OK there are 3+ Record-Route headers which are consumed by TOPOS on
> Proxy1.
>
> With my baresip and Yealink phones, the phones send a 200 OK with NO Route
> headers and the Route headers are readded by the TOPOS module before it
> hits the routes in kamailio.
>
>
> Problem:
>
> Some SIP devices(I used an older Aastra device to reproduce the issue)
> like to add a Route header with the target proxy, and so Kamailio receives
> something like this(some headers stripped for brevity):
>
> ACK sip:[email protected] SIP/2.0
> Via: SIP/2.0/UDP 192.168.34.122:5060;branch=z9hG4bKe3a6fe355f721ae5b
> Route: <sip:banana.mydomain.tld;lr>
> From: "12015550000" <sip:[email protected]>;tag=ba05cb9826
> To: <sip:[email protected]
> :5060;user=phone>;tag=1SvNyXFeQjUaN
> Call-ID: 149a3a344dda2a1c
> CSeq: 12259 ACK
>
> With this, Kamailio receives the packet, internally somewhere runs the
> myself check and sees banana.mydomain.tld isn't a local domain. So it
> routes to that domain, which happens to resolve to this same Kamailio. So
> Kamailio routes the packet to itself until Max-Forwards hits 0 and fails.
>
>
> Solutions I tried:
>
> So I thought maybe alias_subdomains would help here:
>
> loadmodule "corex.so"
> modparam("corex", "alias_subdomains", "mydomain.tld")
>
> I ran this and found that it fixed the routing loop on the ACK, but then I
> got a routing loop on the BYE instead.
>
> So then I thought, maybe I can squeeze this out earlier:
>
> event_route[topos:msg-incoming] {
>
>   if ( proto != TLS || !$tls_peer_verified || $Rp != "5061" ) {
>
> xlog("L_NOTICE", "=======> User packet this one $rm\n");
> remove_hf("Route");
> }
> else{
>         xlog("L_NOTICE", "=======> Server packet this one $rm\n");
> }
>
> This didn't work, it only ever is invoked for SIP OPTIONS.
>
> So I tried with event_route[topos:msg-receiving] and saw messages like
> this:
> 16(1347) CRITICAL: <core> [core/ip_addr.c:234]: ip_addr2sbuf(): unknown
> address family 0
>
> I guess $Rp isn't available in this event route. and $proto is always null.
>
> If I disable TOPOS completely, the Aastra phone will load the ACK with the
> Route headers defined by the Record-Route headers in the 200 OK and the
> call completes normally.
>
> I added this to the top of my request_route:
>
> xlog("L_NOTICE","$si - $rm - $hfl(Route) $hfl(Via)\n");
>
> and the only route header that appeared for the ACK packet was the single
> route header.
>
> It would seem TOPOS can be 'defeated' by a rogue Route header.
>
>
> I started reading through the source code on this but could not pinpoint
> any code that would 'not restore TOPOS stripped headers when a rogue Route
> header appears because the Route header doesn't match the myself condition
> of Kamailio'.
>
> I even tried adding to topos:msg-sending:
>
> append_hf("Route: <sip:invalid.tld>\r\n");
>
> To trick the phone into something that is predictable so I can strip it
> before TOPOS parses the headers.
>
> I'm not sure what to do next, I don't want to go back to TOPOH because I
> need the packet size savings(some users have issues with big packets ).
> I've seen other user-agents in the wild beyond these Aastras add Route
> headers in unexpected places, so this is not a single issue.
>
> I even went so far as to ask AI some help, but it just hallucinated the
> entire time. (AI says this should say 'I also explored AI assistance but
> didn't find relevant solutions for this specific scenario.' ).
>
> Any suggestions on what to do next ?
>
> Thanks,
>
> David
>

__________________________________________________________
Kamailio - Users Mailing List - Non Commercial Discussions -- [email protected]
To unsubscribe send an email to [email protected]
Important: keep the mailing list in the recipients, do not reply only to the sender!
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.