Skip to content

test(sip): M7 CP5 — origination signalling-scope analysis + regression (M6 MINOR-1)#161

Merged
ryanmurf merged 1 commit into
masterfrom
feat/m7-cp5-ancillary-signaling-scope
Jul 17, 2026
Merged

test(sip): M7 CP5 — origination signalling-scope analysis + regression (M6 MINOR-1)#161
ryanmurf merged 1 commit into
masterfrom
feat/m7-cp5-ancillary-signaling-scope

Conversation

@ryanmurf

Copy link
Copy Markdown
Owner

M7 CP5 — origination signalling-scope: analysis + regression (M6 routing MINOR-1)

Folds the M6 routing MINOR-1 finding (ancillary paths still emit the raw internal
bind) into an M7-scoped answer: which ancillary signalling paths does a Chime
origination actually exercise?

Finding: none

Path On the Chime origination path?
outbound REGISTER (+ keepalive OPTIONS) No — Chime VC termination is IP-authenticated (NOREG); CP1's carrier auth is a digest challenge on the INVITE, not a REGISTER
REFER (transfer) No — no transfer on the origination path
NOTIFY No — no subscription dialog
MESSAGE No — unrelated
outbound UPDATE (session-timer refresh) No — rustisk is the refresher=uac responder, never originates a refresh

The core INVITE (M6 CP2) and the in-dialog ACK/BYE/CANCEL (M7 CP1) already route
through signaling_hostport(), so the whole origination signalling path is
NAT-scoped. Scoping the genuinely ancillary paths is a real latent leak but
off the M7 origination path — documented + deferred (see README).

Receiver-side regression that locks the scoping in

tests/cp5-origination-signaling-scope/run.sh — with external_signaling_address = signaling.example.net and the carrier outside local_net:

INVITE advertises external:  1
ACK    advertises external:  1
BYE    advertises external:  1
raw-bind (0.0.0.0) leaks:    none
result:                      PASS
INVITE via_host=signaling.example.net:15060 from_host=signaling.example.net:15060 contact_host=signaling.example.net:15060
ACK    via_host=signaling.example.net:15060 from_host=signaling.example.net:15060
BYE    via_host=signaling.example.net:15060 from_host=signaling.example.net:15060

Captured RED (CP5_MODE=red-noext)

Drop external_signaling_address → every request leaks the raw bind:

INVITE via_host=0.0.0.0:15060 from_host=0.0.0.0:15060 contact_host=0.0.0.0:15060
ACK    via_host=0.0.0.0:15060 ...
BYE    via_host=0.0.0.0:15060 ...
result: FAIL  (assertion RED)

No Rust changes; cargo test/clippy unaffected. Isolated Docker only.

…n (M6 MINOR-1)

Folds the M6 routing MINOR-1 ancillary-signalling-leak finding into an M7-scoped
answer: which ancillary paths does a Chime origination actually exercise?

Finding (README): NONE. AWS Chime Voice Connector termination is IP-authenticated
(no outbound REGISTER); the origination path implements no transfer (no REFER),
no subscription (no NOTIFY), no MESSAGE, and rustisk is the session-timer
RESPONDER not refresher (no outbound UPDATE). The core INVITE (M6 CP2) and the
in-dialog ACK/BYE/CANCEL (M7 CP1) already route through
signaling_hostport()/advertised_signaling_hostport(), so the whole origination
signalling path is already NAT-scoped. Scoping the genuinely ancillary paths
(refer.rs/notify*.rs/messaging.rs/outbound_registration.rs/update.rs) is a real
latent leak but OFF the M7 origination path — documented and deferred.

Delivers a receiver-side regression (tests/cp5-origination-signaling-scope) that
locks the origination scoping in: with external_signaling_address configured and
the carrier outside local_net, the offline carrier asserts INVITE + ACK + BYE all
advertise the external host and none leaks the raw 0.0.0.0 bind. Captured RED
(CP5_MODE=red-noext): dropping external_signaling_address makes every request
leak 0.0.0.0 -> assertion RED. No Rust changes.
@ryanmurf
ryanmurf merged commit 4e1c017 into master Jul 17, 2026
3 checks passed
@ryanmurf
ryanmurf deleted the feat/m7-cp5-ancillary-signaling-scope branch July 17, 2026 13:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant