commit | 63e273ad4bb6ebb253f556e6bb7482cb07ebd56b | [log] [tgz] |
---|---|---|
author | Victor Boivie <boivie@webrtc.org> | Thu Dec 07 10:52:11 2023 |
committer | WebRTC LUCI CQ <webrtc-scoped@luci-project-accounts.iam.gserviceaccount.com> | Fri Dec 08 10:54:42 2023 |
tree | c927c79d19dd4344c58495bc5d1b59ed425bd011 | |
parent | a88ea8a36f3c66b33990ebaa8f7fbb8b75090943 [diff] |
dcsctp: Persist all state in state cookie In the example below, the association is being established between peer A and Z, and A is the initiating party. Before this CL, when an association was about to be established, Z would after having received the INIT chunk, persist state in the socket about which verification tag and initial TSN that was picked. These would be re-generated on every incoming INIT (that's fine), but when A had extracted the cookie from INIT_ACK and sent a reply (COOKIE_ECHO) with the state cookie, that could fail validation when it's received by Z, if the sent cookie was not the most recent one or if the COOKIE_ECHO had a verification tag coming not from the most recent INIT_ACK, because Z had replaced the state in the socket with the one generated when the second INIT_ACK chunk was generated - state it used for validation of future received data. In other words: A -> INIT 1 <timeout> A -> INIT 2 (retransmission of INIT 1) INIT 1 -> Z - sends INIT_ACK 1 with verification_tag=1, initial_tsn=1, cookie 1 (and records these to socket state) INIT 2 -> Z - sends INIT_ACK 2 with verification_tag=2, initial_tsn=2, cookie 2 (replaces socket state with the new data) INIT_ACK 1 -> A -> sends COOKIE_ECHO with verification_tag=1, cookie 1 COOKIE_ECHO (cookie 1) -> Z <FAILS, as the state isn't as expected>. The solution is really to do what RFC4960 says, to not maintain any state as the receiving peer until COOKIE_ECHO has been received. This was initially not done because the underlying reason why this is important in SCTP is to avoid denial of service, and this is why SCTP has the four-way handshake. But for Data Channels - SCTP over DTLS - this attack vector isn't available. So the implementation was "simplified" by keeping socket state instead of encoding it in the state cookie, but that obviously had downsides. So with this CL, the non-initiating peer in connection establishment doesn't keep any socket state, and puts all that state in the state cookie instead. This allows any COOKIE_ECHO to be received by Z. Bug: webrtc:15712 Change-Id: I596c7330ce27292612d3c9f86b21c712f6f4e408 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/330440 Commit-Queue: Victor Boivie <boivie@webrtc.org> Reviewed-by: Harald Alvestrand <hta@webrtc.org> Cr-Commit-Position: refs/heads/main@{#41340}
WebRTC is a free, open software project that provides browsers and mobile applications with Real-Time Communications (RTC) capabilities via simple APIs. The WebRTC components have been optimized to best serve this purpose.
Our mission: To enable rich, high-quality RTC applications to be developed for the browser, mobile platforms, and IoT devices, and allow them all to communicate via a common set of protocols.
The WebRTC initiative is a project supported by Google, Mozilla and Opera, amongst others.
See here for instructions on how to get started developing with the native code.
Authoritative list of directories that contain the native API header files.