-
Notifications
You must be signed in to change notification settings - Fork 18k
x/crypto/ssh: race in ListenUnix() causes forwarded socket to be rejected after client requests it #64094
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
@spikecurtis, want to send a fix? (And is it feasible to write a regression test that triggers this race at some nonzero rate?) |
(attn @drakkan; CC @FiloSottile @rolandshoemaker per https://dev.golang.org/owners) |
@spikecurtis thanks for this report. |
Change https://go.dev/cl/553315 mentions this issue: |
I can reproduce the problem locally using a test application. The above CL has no test cases (there is no test case for remote forwarding in general) and so probably can't be merged as is but it solves the problem for me locally for both sockets and TCP connections, @spikecurtis a confirmation that it works in your case too would be much appreciated. Thank you |
Unix changes look good, but in the TCP case it only closes the race when |
We're also experiencing this issue (with TCP forwarding). Any updates would be appreciated. Thanks! |
Hello, can you please confirm that the linked CL fixes the issue? This would help. Thanks! |
@drakkan Thank you for the reply! I’ve just tried it, and yes, it fixes the issue. |
What version of Go are you using (
go version
)?Not applicable. Affects x/crypto version v0.15.0
Does this issue reproduce with the latest release?
Yes
What operating system and processor architecture are you using (
go env
)?Not applicable
What did you do?
In ListenUnix():
https://github.com/golang/crypto/blob/1cf1811d7195fe9bb436a00e335567575fac9b07/ssh/streamlocal.go#L40
it sends the message to request remote forwarding of Unix domain sockets before it is prepared to receive forwards, which it sets later: https://github.com/golang/crypto/blob/1cf1811d7195fe9bb436a00e335567575fac9b07/ssh/streamlocal.go#L47
This sets up a race between the server forwarding a connection and the client being prepared to receive it. The client should set itself to receive the forward before sending the request (and if the request fails, clean up) to avoid a race condition. I see this in unit testing where a test SSH server can very quickly respond to a request to forward sockets, but in principal it could happen in a live system too.
A similar issue affects TCP sockets.
What did you expect to see?
What did you see instead?
The text was updated successfully, but these errors were encountered: