Skip to content

Commit 9ac33f7

Browse files
committed
ssh/server: handle repeated SSH authentication service requests
1 parent a4d1237 commit 9ac33f7

File tree

1 file changed

+28
-5
lines changed

1 file changed

+28
-5
lines changed

ssh/server.go

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -310,8 +310,8 @@ func (s *connection) serverHandshake(config *ServerConfig) (*Permissions, error)
310310
s.sessionID = s.transport.getSessionID()
311311
s.algorithms = s.transport.getAlgorithms()
312312

313-
var packet []byte
314-
if packet, err = s.transport.readPacket(); err != nil {
313+
packet, err := s.transport.readPacket()
314+
if err != nil {
315315
return nil, err
316316
}
317317

@@ -546,13 +546,36 @@ userAuthLoop:
546546
return nil, &ServerAuthError{Errors: authErrs}
547547
}
548548

549-
var userAuthReq userAuthRequestMsg
550-
if packet, err := s.transport.readPacket(); err != nil {
549+
packet, err := s.transport.readPacket()
550+
if err != nil {
551551
if err == io.EOF {
552552
return nil, &ServerAuthError{Errors: authErrs}
553553
}
554554
return nil, err
555-
} else if err = Unmarshal(packet, &userAuthReq); err != nil {
555+
}
556+
557+
// Check if this is a service request (re-authentication)
558+
if len(packet) > 0 && packet[0] == msgServiceRequest {
559+
var serviceRequest serviceRequestMsg
560+
if err = Unmarshal(packet, &serviceRequest); err != nil {
561+
return nil, err
562+
}
563+
564+
if serviceRequest.Service == serviceUserAuth {
565+
serviceAccept := serviceAcceptMsg{
566+
Service: serviceUserAuth,
567+
}
568+
if err := s.transport.writePacket(Marshal(&serviceAccept)); err != nil {
569+
return nil, err
570+
}
571+
continue userAuthLoop
572+
} else {
573+
return nil, fmt.Errorf("ssh: unknown service %q", serviceRequest.Service)
574+
}
575+
}
576+
577+
var userAuthReq userAuthRequestMsg
578+
if err = Unmarshal(packet, &userAuthReq); err != nil {
556579
return nil, err
557580
}
558581

0 commit comments

Comments
 (0)