Skip to content

Conversation

@mingyech
Copy link
Member

There is a fingerprint mismatch with Chrome when using GREASE ECH, having to do with ciphersuite selection. When Chrome selects the preferred ciphersuite in the outer ClientHello and the ciphersuite for ECH, it does so consistently based on hardware support. That means, for example, if it prefers AES for the outer ciphersuite, it would also use AES for ECH. The Chrome parrot in utls hardcodes AES preference for outer ciphersuites but selects the ECH ciphersuite randomly between AES and ChaCha20. So there is a 50% chance of selecting ChaCha20 for ECH while using AES for the outer ciphersuite, which is impossible in Chrome.

This commit makes the Chrome parrot use AES only for GREASE ECH, consistent with the currrent AES outer ciphersuite preference.

I think this is only a problem in GREASE ECH, since in real ECH Chrome selects the first valid ciphersuite when AES is preferred, which is the same in utls. So no change is done there.

Thanks to the original reporter for reporting this issue.

There is a fingerprint mismatch with Chrome when using GREASE ECH,
having to do with ciphersuite selection. When Chrome selects the
preferred ciphersuite in the outer ClientHello and the ciphersuite for
ECH, it does so consistently based on hardware support. That means, for
example, if it prefers AES for the outer ciphersuite, it would also use
AES for ECH. The Chrome parrot in utls hardcodes AES preference for
outer ciphersuites but selects the ECH ciphersuite randomly between
AES and ChaCha20. So there is a 50% chance of selecting ChaCha20 for
ECH while using AES for the outer ciphersuite, which is impossible in
Chrome.

This commit makes the Chrome parrot use AES only for GREASE ECH,
consistent with the currrent AES outer ciphersuite preference.

I think this is only a problem in GREASE ECH, since in real ECH Chrome
selects the first valid ciphersuite when AES is preferred, which is the
same in utls. So no change is done there.

Thanks to the original reporter for reporting this issue.
@mingyech mingyech merged commit 24bd1e0 into master Oct 14, 2025
@mingyech mingyech deleted the chrome-ech-fix branch October 14, 2025 00:55
phuslu added a commit to phuslu/liner that referenced this pull request Oct 14, 2025
@Demonsdevil
Copy link

There is a fingerprint mismatch with Chrome when using GREASE ECH, having to do with ciphersuite selection. When Chrome selects the preferred ciphersuite in the outer ClientHello and the ciphersuite for ECH, it does so consistently based on hardware support. That means, for example, if it prefers AES for the outer ciphersuite, it would also use AES for ECH. The Chrome parrot in utls hardcodes AES preference for outer ciphersuites but selects the ECH ciphersuite randomly between AES and ChaCha20. So there is a 50% chance of selecting ChaCha20 for ECH while using AES for the outer ciphersuite, which is impossible in Chrome.

This commit makes the Chrome parrot use AES only for GREASE ECH, consistent with the currrent AES outer ciphersuite preference.

I think this is only a problem in GREASE ECH, since in real ECH Chrome selects the first valid ciphersuite when AES is preferred, which is the same in utls. So no change is done there.

Thanks to the original reporter for reporting this issue.

HideinOSS pushed a commit to HideinOSS/sing-box-configuration-examples that referenced this pull request Oct 23, 2025
如果你的sing-box客户端版本小于1.12.10 or 1.13.0-alpha.22,那么需要修改你本地配置文件中 fingerprint 为使用非GREASE ECH方式的指纹,例如 "firefox"、"ios"。否则可能你会被检测到使用模拟 Chrome 指纹,这是一种安全风险,uTLS v1.8.1已经修复。详见:refraction-networking/utls#375
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.

3 participants