Skip to content

Commit 964ca81

Browse files
committed
ipn/wg: overwrite rpn reserved header bytes w rand
1 parent 3d9baf3 commit 964ca81

File tree

2 files changed

+34
-6
lines changed

2 files changed

+34
-6
lines changed

intra/ipn/wg/wgconn.go

+22-3
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ type StdNetBind struct {
5353
connect connector
5454
mh *multihost.MH
5555

56+
reserved []byte // overwrite the 3 wg reserved bytes
57+
5658
mu sync.Mutex // protects following fields
5759
ipv4 *net.UDPConn
5860
ipv6 *net.UDPConn
@@ -63,8 +65,9 @@ type StdNetBind struct {
6365
lastSendAddr netip.AddrPort // may be invalid
6466
}
6567

66-
func NewEndpoint(id string, d connector, ep *multihost.MH, f rwlistener) *StdNetBind {
67-
return &StdNetBind{id: id, connect: d, mh: ep, listener: f}
68+
// TODO: get d, ep, f, rb through an Opts bag?
69+
func NewEndpoint(id string, d connector, ep *multihost.MH, f rwlistener, rb [3]byte) *StdNetBind {
70+
return &StdNetBind{id: id, connect: d, mh: ep, listener: f, reserved: rb[:3]}
6871
}
6972

7073
type StdNetEndpoint netip.AddrPort
@@ -308,6 +311,7 @@ func (s *StdNetBind) Send(buf [][]byte, peer conn.Endpoint) (err error) {
308311
}
309312
s.mu.Unlock()
310313

314+
var overwriteReserved = s.overwriteReserved()
311315
var nn int
312316
var errs error
313317
for _, data := range buf {
@@ -322,6 +326,13 @@ func (s *StdNetBind) Send(buf [][]byte, peer conn.Endpoint) (err error) {
322326
return syscall.EAFNOSUPPORT
323327
}
324328

329+
// from: github.com/bepass-org/warp-plus/blob/19ac233cc6/wireguard/device/peer.go#L138
330+
if overwriteReserved {
331+
if len(data) > 3 && data[0] > 0 && data[0] < 5 {
332+
copy(data[1:4], s.reserved)
333+
}
334+
}
335+
325336
s.lastSendAddr = dst
326337

327338
extend(uc, wgtimeout)
@@ -331,10 +342,18 @@ func (s *StdNetBind) Send(buf [][]byte, peer conn.Endpoint) (err error) {
331342
nn += n
332343
}
333344

334-
loge(err, "wg: bind: send: %s addr(%v) parcels(%d) tx(%d); err? %v", s.id, dst, len(buf), nn, errs)
345+
loge(err, "wg: bind: send: %s addr(%v) parcels(%d) tx(%d) overwrite(%t); err? %v",
346+
s.id, dst, len(buf), nn, overwriteReserved, errs)
335347
return err
336348
}
337349

350+
func (s *StdNetBind) overwriteReserved() bool {
351+
return len(s.reserved) == 3 &&
352+
s.reserved[0] != 0 ||
353+
s.reserved[1] != 0 ||
354+
s.reserved[2] != 0
355+
}
356+
338357
func (s *StdNetBind) BatchSize() int {
339358
return 1
340359
}

intra/ipn/wgproxy.go

+12-3
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ package ipn
1818
import (
1919
"bufio"
2020
"context"
21-
"errors"
2221
"fmt"
22+
"math/rand/v2"
2323
"net"
2424
"net/netip"
2525
"os"
@@ -518,12 +518,20 @@ func NewWgProxy(id string, ctl protect.Controller, rev netstack.GConnHandler, cf
518518

519519
id = wgtun.id // has stripped prefix FAST, if any
520520

521+
// github.com/bepass-org/warp-plus/blob/19ac233cc6/wiresocks/config.go#L184
522+
var reservedBytes [3]byte
523+
if isRPN(id) {
524+
reservedBytes[0] = uint8(rand.UintN(0x100))
525+
reservedBytes[1] = uint8(rand.UintN(0x100))
526+
reservedBytes[2] = uint8(rand.UintN(0x100))
527+
}
528+
521529
var wgep wgconn
522530
if wgtun.preferOffload {
523531
// todo: use wgtun.serve fn instead of ctl
524532
wgep = wg.NewEndpoint2(id, ctl, endpointh, wgtun.listener)
525533
} else {
526-
wgep = wg.NewEndpoint(id, wgtun.serve, endpointh, wgtun.listener)
534+
wgep = wg.NewEndpoint(id, wgtun.serve, endpointh, wgtun.listener, reservedBytes)
527535
}
528536

529537
wgdev := device.NewDevice(wgtun, wgep, wglogger(id))
@@ -551,7 +559,8 @@ func NewWgProxy(id string, ctl protect.Controller, rev netstack.GConnHandler, cf
551559
wgep, // endpoint
552560
}
553561

554-
log.D("proxy: wg: new %s; addrs(%v) mtu(%d/%d) peers(%d) / v4(%t) v6(%t)", id, ifaddrs, mtu, calcTunMtu(mtu), len(peers), wgtun.hasV4, wgtun.hasV6)
562+
log.D("proxy: wg: new %s; addrs(%v) mtu(%d/%d) peers(%d) / v4(%t) v6(%t)",
563+
id, ifaddrs, mtu, calcTunMtu(mtu), len(peers), wgtun.hasV4, wgtun.hasV6)
555564

556565
return w, nil
557566
}

0 commit comments

Comments
 (0)