为什么每按一次键SSH就发送 100 个数据包
在作者开发的一款基于SSH的高性能终端游戏(使用 Bubble Tea + Wish 构建)中,即使没有实际游戏画面更新(仅返回“屏幕太小”提示),服务器仍产生大量网络流量和 CPU 开销,单次按键触发约 270 个 TCP 数据包,其中 179 个是 36 字节的“神秘消息”。
通过ssh -vvv定位到,原因是OpenSSH 自 2023 年起引入的Keystroke Timing Obfuscation特性,此功能旨在防止攻击者通过分析用户打字节奏推断输入内容(如密码、敏感命令)。在真实按键前后,客户端主动发送大量 “chaff”(诱饵)数据包,这些包内容为空或填充,但格式合法,模拟真实交互默认持续约 2 秒,每 20ms 一次,总计可发送 ~100 个包。
该功能针对人类用户手动操作的安全加固,但对于机器对机器(bot ↔ server)的高频率、低延迟通信是完全没必要的。这个功能完全由客户端决定是否启用,但是客户端(9.6 或更高版本)只有在服务端声明支持 "[email protected]" 扩展时,才会启用混淆。而 OpenSSH 服务端(sshd)默认会广告这个扩展,因此,虽然服务端“不主动开启混淆”,但它的默认行为间接使客户端启用了混淆。
https://eieio.games/blog/ssh-sends-100-packets-per-keystroke/
在作者开发的一款基于SSH的高性能终端游戏(使用 Bubble Tea + Wish 构建)中,即使没有实际游戏画面更新(仅返回“屏幕太小”提示),服务器仍产生大量网络流量和 CPU 开销,单次按键触发约 270 个 TCP 数据包,其中 179 个是 36 字节的“神秘消息”。
通过ssh -vvv定位到,原因是OpenSSH 自 2023 年起引入的Keystroke Timing Obfuscation特性,此功能旨在防止攻击者通过分析用户打字节奏推断输入内容(如密码、敏感命令)。在真实按键前后,客户端主动发送大量 “chaff”(诱饵)数据包,这些包内容为空或填充,但格式合法,模拟真实交互默认持续约 2 秒,每 20ms 一次,总计可发送 ~100 个包。
该功能针对人类用户手动操作的安全加固,但对于机器对机器(bot ↔ server)的高频率、低延迟通信是完全没必要的。这个功能完全由客户端决定是否启用,但是客户端(9.6 或更高版本)只有在服务端声明支持 "[email protected]" 扩展时,才会启用混淆。而 OpenSSH 服务端(sshd)默认会广告这个扩展,因此,虽然服务端“不主动开启混淆”,但它的默认行为间接使客户端启用了混淆。
https://eieio.games/blog/ssh-sends-100-packets-per-keystroke/