Skip to content

Commit 42e7b2b

Browse files
committed
Close all remote forwards on loss of server connection
1 parent 952cd28 commit 42e7b2b

File tree

3 files changed

+19
-7
lines changed

3 files changed

+19
-7
lines changed

internal/client/client.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -580,6 +580,7 @@ func Run(addr, fingerprint, proxyAddr, sni string, winauth bool) {
580580
})
581581

582582
sshConn.Close()
583+
handlers.StopAllRemoteForwards()
583584

584585
if err != nil {
585586
log.Printf("Server disconnected unexpectedly: %s\n", err)

internal/client/handlers/remoteforward.go

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,17 @@ func GetServerRemoteForwards() (out []string) {
3636
return out
3737
}
3838

39+
func StopAllRemoteForwards() {
40+
currentRemoteForwardsLck.Lock()
41+
defer currentRemoteForwardsLck.Unlock()
42+
43+
for _, forward := range currentRemoteForwards {
44+
go forward.Listener.Close()
45+
}
46+
47+
clear(currentRemoteForwards)
48+
}
49+
3950
func StopRemoteForward(rf internal.RemoteForwardRequest) error {
4051
currentRemoteForwardsLck.Lock()
4152
defer currentRemoteForwardsLck.Unlock()
@@ -132,27 +143,27 @@ func handleData(rf internal.RemoteForwardRequest, proxyCon net.Conn, sshConn ssh
132143

133144
b := ssh.Marshal(&drtMsg)
134145

135-
destination, reqs, err := sshConn.OpenChannel("forwarded-tcpip", b)
146+
source, reqs, err := sshConn.OpenChannel("forwarded-tcpip", b)
136147
if err != nil {
137148
log.Println("Opening forwarded-tcpip channel to server failed: ", err)
138149

139150
return err
140151
}
141-
defer destination.Close()
152+
defer source.Close()
142153

143154
go ssh.DiscardRequests(reqs)
144155

145156
log.Println("Forwarded-tcpip channel request sent and accepted")
146157

147158
go func() {
148-
defer destination.Close()
159+
defer source.Close()
149160
defer proxyCon.Close()
150-
io.Copy(destination, proxyCon)
161+
io.Copy(source, proxyCon)
151162

152163
}()
153164

154165
defer proxyCon.Close()
155-
_, err = io.Copy(proxyCon, destination)
166+
_, err = io.Copy(proxyCon, source)
156167

157168
return err
158169
}

internal/server/sshd.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ func StartSSHServer(sshListener net.Listener, privateKey ssh.Signer, insecure, o
272272
if err != ErrKeyNotInList {
273273
err = fmt.Errorf("admin with supplied username (%s) denied login: %s", strconv.QuoteToGraphic(conn.User()), err)
274274
if isUntrustWorthy {
275-
err = fmt.Errorf("admin (%s) denied login: %s: cannot connect admins via pivoted server port (may result in allow list bypass)", strconv.QuoteToGraphic(conn.User()), err)
275+
err = fmt.Errorf("admin (%s) denied login: cannot connect admins via pivoted server port (may result in allow list bypass)", strconv.QuoteToGraphic(conn.User()))
276276
}
277277
return nil, err
278278
}
@@ -290,7 +290,7 @@ func StartSSHServer(sshListener net.Listener, privateKey ssh.Signer, insecure, o
290290
if err != ErrKeyNotInList {
291291
err = fmt.Errorf("user (%s) denied login: %s", strconv.QuoteToGraphic(conn.User()), err)
292292
if isUntrustWorthy {
293-
err = fmt.Errorf("user (%s) denied login: %s: cannot connect users via pivoted server port (may result in allow list bypass)", strconv.QuoteToGraphic(conn.User()), err)
293+
err = fmt.Errorf("user (%s) denied login: cannot connect users via pivoted server port (may result in allow list bypass)", strconv.QuoteToGraphic(conn.User()))
294294
}
295295

296296
return nil, err

0 commit comments

Comments
 (0)