Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

[SFTP] Race Condition during Rekeying: "Message type 93 is not valid" or Connection Drop

未关闭
#1,764 6 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

评估

难度
4/5
预计耗时
3-5 天
新手友好度
42/100
Issue 类型
缺陷
描述清晰度
基本清楚
活跃度
活跃
技术栈
csharp
领域
networking

调研方向

从 Session.WaitOnHandle、Channel.SendData 和 SftpSession.RequestWrite 开始,然后跟踪 rekeying 期间同步和异步的 UploadFile 路径。将服务器的 RekeyLimit 设置为 500M 0,并以高吞吐量执行大文件上传来复现。上传过程保持连接并在没有 Message type 93 或 Client not connected 错误的情况下完成,即表示完成。

由索引模型根据 Issue 内容生成。

描述

Description
We are encountering critical connection failures during SFTP uploads under high network throughput. The issue appears to be a race condition during the SSH Rekeying phase.

When the server triggers a Key Rotation (due to RekeyLimit), the client fails to pause the data stream immediately. Consequently, the client sends a SSH_MSG_CHANNEL_DATA packet while the server has entered the Key Exchange state and expects SSH_MSG_KEXINIT, leading to a protocol violation.

Exceptions & Stack Traces
We observe two different exceptions depending on the server software/configuration:

Variant 1: Protocol Violation (Server sends Disconnect message)

Renci.SshNet.Common.SshConnectionException: Message type 93 is not valid.
   at Renci.SshNet.Session.WaitOnHandle(WaitHandle waitHandle, TimeSpan timeout)
   at Renci.SshNet.Session.WaitOnHandle(WaitHandle waitHandle)
   at Renci.SshNet.Channels.Channel.SendData(Byte[] data)
   at Renci.SshNet.Channels.Channel.SendMessage(Message message)
   at Renci.SshNet.Channels.Channel.SendData(Byte[] buffer, Int32 offset, Int32 size)
   at Renci.SshNet.Sftp.SftpSession.RequestWrite(Byte[] handle, UInt64 serverOffset, Byte[] data, Int32 offset, Int32 length, Action`1 writeStatusCallback)

Variant 2: Connection Drop (Server resets TCP connection)

Renci.SshNet.Common.SshConnectionException: Client not connected.
   at Renci.SshNet.Common.AsyncResult.EndInvoke()
   at Renci.SshNet.SftpClient.EndUploadFile(IAsyncResult asyncResult)
   at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)
   --- End of stack trace from previous location ---
   at FtpUtils.FtpUtils.SftpTransferFileAsync(...)

Steps to Reproduce
Configure an SFTP server with a low RekeyLimit (e.g., RekeyLimit 500M 0).

Establish a high-speed connection (e.g., > 500 Mbps).

Upload a file significantly larger than the limit.

Result: Connection crashes exactly when the limit is reached.

Analysis
The library seems unable to handle the state transition to KeyExchange fast enough when the outgoing socket buffer is saturated with file data. Confirmed Workaround: The issue is resolved only by setting RekeyLimit none on the server side, which confirms the issue is isolated to the rekeying phase.

Additional Info

  • Reproducible on the latest revision 2025.1.0 as well as older versions.
  • Reproducible with both synchronous UploadFile and asynchronous UploadFileAsync / BeginUploadFile implementations.

Question
Is there any client-side configuration or internal buffer setting that could mitigate this race condition without changing the server config? Or any other trick. Thanks!

主要语言
C#
星标
4.4k
派生
993
平均合并
9 天 21 小时
30 天内合并 PR
1

贡献指南

打开贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

sshnet/SSH.NET 的其他 Issue

查看 sshnet/SSH.NET 的全部 Issue

相似的 Issue

更多 C# Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。