Skip to content
This repository was archived by the owner on Jun 12, 2022. It is now read-only.

Commit 77f47ee

Browse files
committed
🫦 The stored server session ID must not reuse packet buffer
1 parent 10fbb63 commit 77f47ee

File tree

3 files changed

+26
-6
lines changed

3 files changed

+26
-6
lines changed

client/client.go

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"github.com/Shadowsocks-NET/outline-ss-server/slicepool"
1919
"github.com/Shadowsocks-NET/outline-ss-server/socks"
2020
"github.com/database64128/tfo-go"
21+
"go.uber.org/zap"
2122
wgreplay "golang.zx2c4.com/wireguard/replay"
2223
)
2324

@@ -507,16 +508,25 @@ func (c *packetConn) unpackAndValidatePacket(dst, src []byte) (socksAddrStart in
507508
return
508509
}
509510
sessionStatus = newServerSession
510-
ssid = dst[:8]
511+
ssid = make([]byte, 8)
512+
copy(ssid, dst[:8])
511513
saead, err = c.cipher.NewAEAD(ssid)
512514
if err != nil {
513515
return
514516
}
515517
// Delay sfilter creation after validation to avoid a possibly unnecessary allocation.
516518
}
517519

520+
logger.Debug("Checked server session ID",
521+
zap.Int("sessionStatus", sessionStatus),
522+
zap.Binary("dst[:8]", dst[:8]),
523+
zap.Binary("serverSessionID", ssid),
524+
zap.Binary("currentServerSessionID", c.cssid),
525+
zap.Binary("oldServerSessionID", c.ossid),
526+
)
527+
518528
// Unpack
519-
buf, err = ss.UnpackAesWithSeparateHeader(dst, src, nil, c.cipher, saead)
529+
buf, err = ss.UnpackAesWithSeparateHeader(dst, src, nil, saead)
520530
if err != nil {
521531
return
522532
}
@@ -543,10 +553,19 @@ func (c *packetConn) unpackAndValidatePacket(dst, src []byte) (socksAddrStart in
543553
return
544554
}
545555
sessionStatus = newServerSession
546-
ssid = buf[:8]
556+
ssid = make([]byte, 8)
557+
copy(ssid, buf[:8])
547558
// Delay sfilter creation after validation to avoid a possibly unnecessary allocation.
548559
}
549560

561+
logger.Debug("Checked server session ID",
562+
zap.Int("sessionStatus", sessionStatus),
563+
zap.Binary("buf[:8]", buf[:8]),
564+
zap.Binary("serverSessionID", ssid),
565+
zap.Binary("currentServerSessionID", c.cssid),
566+
zap.Binary("oldServerSessionID", c.ossid),
567+
)
568+
550569
default:
551570
plaintextStart, buf, err = ss.Unpack(dst, src, c.cipher)
552571
if err != nil {

service/udp.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ func decryptAndGetOrCreateSession(id string, c *ss.Cipher, clientAddr *net.UDPAd
339339
ses = newSession(separateHeader[:8], ssid, caead, saead, clientAddr)
340340
}
341341

342-
buf, err = ss.UnpackAesWithSeparateHeader(dst, src, separateHeader, c, ses.caead)
342+
buf, err = ss.UnpackAesWithSeparateHeader(dst, src, separateHeader, ses.caead)
343343
if err != nil {
344344
onetErr = onet.NewConnectionError("ERR_CIPHER", "Failed to unpack", err)
345345
return

shadowsocks/packet.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,9 +117,10 @@ func Unpack(dst, pkt []byte, cipher *Cipher) (plaintextStart int, plaintext []by
117117
}
118118

119119
// Unpack function for 2022-blake3-aes-256-gcm.
120-
// If separateHeader is nil, DecryptHeaderInPlace MUST be called before passing the ciphertext.
120+
// If separateHeader is nil, DecryptSeparateheader MUST be called to decrypte the separate header in-place
121+
// before passing the ciphertext.
121122
// The returned buffer includes the separate header.
122-
func UnpackAesWithSeparateHeader(dst, pkt, separateHeader []byte, cipher *Cipher, unpackAEAD cipher.AEAD) ([]byte, error) {
123+
func UnpackAesWithSeparateHeader(dst, pkt, separateHeader []byte, unpackAEAD cipher.AEAD) ([]byte, error) {
123124
if len(pkt) <= 16+unpackAEAD.Overhead() {
124125
return nil, ErrShortPacket
125126
}

0 commit comments

Comments
 (0)