[2:46:20 pm] <blocked> Signature used by ru to block snowflake: \x16\xFE[\xFD\xFF] offset:0 \x00\x1D\x00\x17\x00\x18 offset:0x6e[2:59:08 pm] <+ggus> cohosh: shelikhoo: ^
[3:30:38 pm] <shelikhoo> blocked: is there any context about this signature, like which ISP/network environment this kind block is observed?[3:37:11 pm] <+armadev> (blocked left the channel) [3:47:16 pm] <+armadev> cohosh: and dcf even commented on the ticket just now[3:47:26 pm] <+armadev> (looks like the same signature as 5 months ago, he says)
Russian DPI check supported_groups extension in ServerHello payload (byte 0x5a in udp packet). It looks for DTLS packet header "magic" 16 FE FD and then looks for 1D 00 17 00 18 at 0x5a offset.
0x001d, 0x0017, 0x0018 are x25519, secp256r1, secp384r1.
The snowflake-client in any recent version of Tor Browser should not have this signature. Maybe there are command-line proxies that have not upgraded, and are still sending supported_groups in Server Hello, and that is what the IRC commenter is referring to?
The difference between offset 0x6e and offset 0x5a is 20 bytes. Maybe the IRC commenter was counting from the beginning of the IPv4 header in one case.
I failed to request additional context information about the tip in the irc. The commenter left before I was given the chance to ask.....
[3:30:38 pm] <shelikhoo> blocked: is there any context about this signature, like which ISP/network environment this kind block is observed?[3:37:11 pm] <+armadev> (blocked left the channel) ```
The thing that interests me is about the way this information is generated. Do we have an automated tool to bisect which part of the packet triggers the censorship?
Okay, this may be something new. These packet dissections are for Client Hello, whereas the previous detection rule was for presence of supported_groups in Server Hello. The supported_groups extension is expected in Client Hello (whereas it was out of place in Server Hello), but a detection rule could be triggering on the offset of the extension.
The two fingerprints above are quite different: it looks like the first (non-working) is from Pion, and the second (working) is probably from a browser. They both include supported_groups with identical contents (the byte pattern \x00\x1D\x00\x17\x00\x18), but at different offsets:
Extension: supported_groups (len=8) Type: supported_groups (10) Length: 8 Supported Groups List Length: 6 Supported Groups (3 groups) Supported Group: x25519 (0x001d) Supported Group: secp256r1 (0x0017) Supported Group: secp384r1 (0x0018)
It would be good to have more information about where this detection rule is being enforced—evidently it's not everywhere in Russia.
We may be able to break this specific detection rule by doing anything to disturb the offsets before the supported_groups extension appears. Adding or removing a ciphersuite would do it, for example.
The filter is applied for both DTLS v1.0 in record (16 fe ff), which is used by both Chrome and Firefox in ClientHello, and DTLS v1.2 in record (16 fe fd), which is used at least by Jitsi Meet, all at offset 0. Then, 1D 00 17 00 18 at 0x6f offset is checked. This is indeed different than the previous offset 0x5a (which is also blocked).
So, in the end, as for 19 May 2022, the filter is applied to:
I found another ClientHello pattern which is getting filtered, which is presumably corresponding to the older Chrome versions (91 and earlier).
The filter is applied for both DTLS v1.0 in record (16 fe ff) and DTLS v1.2 in record (16 fe fd).
UDP packets matching the pattern ^\x16\xfe[\xfd\xff].{X}\x00\x1d\x00\x17\x00\x18 are getting blocked, where X is a small number of enumerated byte offsets, and \x00\x1d\x00\x17\x00\x18 is the supported_groups extension. One of the offsets happens to match where pion/dtls places the extension in its Client Hello.
Concise description of the current situation: snowflake connections are blocked when either peer in the connection is Pion-based (e.g. snowflake-client or proxy-go) and takes the role of the DTLS client.
Put another way, the connection is ok if: the proxy is a browser proxy (not proxy-go) and snowflake-client operates as a DTLS server, not client
So does altering the offset of supported_groups without changing other aspects of the fingerprint
One idea is to make a patch or fork of pion/dtls with either pull request https://github.com/pion/dtls/pull/474 or some other change that alters the offset, then ask people to test it
Just my 2 cents. I tested various transports across different ASs in Russia and here's a table of what I found.
Sorry for the screenshot, but my formatting really doesn't lend itself well to be converted into Markdown tables. I will add stuff to this table in the future.