WireGuard endpoint with system: true on macOS counts the 4-byte utun header as packet data; packets in the last 4 bytes of the MTU are padded to mtu+76 and dropped
Nobody has claimed this yet.
Assessment
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Newbie friendliness
- 76/100
- Issue type
- Bug
- Clarity
- Clearly specified
- Activity status
- Active
- Tech stack
- go, macos
- Domain
- networking
Research direction
Start in transport/wireguard/device_system.go, at systemDevice.Read around the non-batch w.device.Read call; compare the reported PacketOffset behavior in the linked sing-tun Darwin implementation and the upstream wireguard-go Darwin TUN code. Adjust the byte count as described in the issue, then verify that packets near the configured MTU no longer produce oversized WireGuard messages; the issue provides a ping and tcpdump reproduction.
Written by the indexing model from the issue text.
Description
Operating system
macOS
System version
macOS 27.0.1 (26A434), Apple silicon (arm64)
Installation type
Original sing-box Command Line
If you are using a graphical client, please provide the version of the client.
No response
Version
sing-box version 1.14.3
Environment: go1.26.9 darwin/arm64
Tags: with_gvisor,with_quic,with_dhcp,with_wireguard,with_utls,with_acme,with_clash_api,with_tailscale,with_ccm,with_ocm,with_cloudflared,with_naive_outbound,with_usbip,with_openvpn,with_openconnect,badlinkname,tfogo_checklinkname0
CGO: enabled
Description
On macOS, a WireGuard endpoint with system: true treats every packet it reads from the utun device as 4 bytes longer than it really is. The extra 4 bytes are the utun protocol-family header.
Where it happens
systemDevice.Readstores the return value ofw.device.Read(...)directly insizes[0](non-batch branch): transport/wireguard/device_system.go#L132-L145.- On darwin, sing-tun's
NativeTun.Readis a plaintunFile.Read(p), so the count it returns includes the 4-byte header (PacketOffset = 4): tun_darwin.go#L27, #L182-L184. - Upstream wireguard-go's darwin TUN subtracts the header (
sizes[0] = n - 4): tun/tun_darwin.go#L212-L218. - The same code is still present on
testing(e4b7e692f454).
Consequences
- wireguard-go encrypts 4 trailing garbage bytes with every packet. The receiver trims them using the IP total length, so this alone is harmless.
- Padding is computed on the wrong length (device/send.go#L660-L674, called at #L701). When an inner packet is within the last 4 bytes of the MTU (
mtu-3…mtu), the inflated length exceedsmtu:calculatePaddingSizewraps it (lastUnit %= mtu) and pads by up to 15 more bytes.- The plaintext becomes
mtu + 16and the transport messagemtu + 48. - The outer IPv4 packet becomes
mtu + 76, instead of at mostmtu + 60as with any other WireGuard implementation.
Real-world impact
- The path to the peer has an MTU of 1492 (PPPoE).
- With
mtu: 1428, inner packets of 1425–1428 bytes became 1504-byte outer packets. These exceed the 1500-byte physical interface MTU, and the outer socket sets DF, so they were silently dropped on the sender. mtu: 1432behaves the same for 1429–1432.- The kernel does not fragment these packets, because they fit the utun MTU. The result is a 4-byte black hole just below the tunnel MTU, and full-size TCP segments (exactly
mtu) fall into it. ping -Dconfirms it: 1–(mtu−4) bytes pass, (mtu−3)–mtu bytes are lost, and mtu+1 gives "Message too long".- Workaround: choose
mtu ≤ path MTU − 76, which is 1416 here.
Suggested fix (untested)
Subtract tun.PacketOffset in the non-batch branch of systemDevice.Read, as upstream does:
sizes[0], err = w.device.Read(bufs[0][offset-tun.PacketOffset:])
if err == nil {
if sizes[0] < tun.PacketOffset {
return 0, nil
}
sizes[0] -= tun.PacketOffset
count = 1
}
On Linux PacketOffset is 0, so only darwin and other platforms with a non-zero offset are affected.
Reproduction
The reproduction uses two endpoints on the same Mac, connected over 127.0.0.1:
- A uses
system: true, which creates utun121 and shows the bug. - B is a userspace endpoint and serves as the control.
- The keys were generated for this reproduction only.
- No tun inbound or remote server is involved. The only TUN in play is the one the
system: trueendpoint creates by itself, and that is the subject of this report.
a.json:
{
"log": {"level": "debug"},
"endpoints": [
{
"type": "wireguard",
"tag": "wg-a",
"system": true,
"name": "utun121",
"mtu": 1420,
"address": ["10.200.0.1/30"],
"private_key": "EN/DJ1LPZIoRjQh4fuP9bBnliQkjzk5amNUOADoZaVs=",
"listen_port": 51830,
"peers": [
{
"address": "127.0.0.1",
"port": 51831,
"public_key": "am5tSz3SB8IrAK8agc3cv9G0uzl+JFemmpw5xcQ4OmI=",
"allowed_ips": ["10.200.0.2/32"]
}
]
}
]
}
b.json:
{
"log": {"level": "debug"},
"endpoints": [
{
"type": "wireguard",
"tag": "wg-b",
"mtu": 1420,
"address": ["10.200.0.2/30"],
"private_key": "sEQM+elu4HIzcnLC8Ugr8iiHUOw+GRaX+3Z/T6KOGHc=",
"listen_port": 51831,
"peers": [
{
"address": "127.0.0.1",
"port": 51830,
"public_key": "BQVpqo81ZSGSI0JAw7YSiuKhvNSvdL/SDN4vsOUyJk8=",
"allowed_ips": ["10.200.0.1/32"]
}
]
}
]
}
Steps:
sing-box run -c b.json
sudo sing-box run -c a.json
ping -c 2 -b utun121 10.200.0.2 # complete the handshake
sudo tcpdump -i lo0 -n 'udp and (port 51830 or port 51831) and greater 1000'
for n in 1404 1405 1416 1417 1420; do ping -D -c 1 -b utun121 -s $((n-28)) 10.200.0.2; done
Expected WireGuard transport message length (the tcpdump UDP, length) for an inner packet of n bytes is 32 + min(roundup16(n), mtu), so never more than mtu + 32 = 1452. Observed:
| inner packet (bytes) | expected | A → B (system: true) |
B → A (userspace, echo reply of same size) |
|---|---|---|---|
| 1404 | 1440 | 1440 | 1440 |
| 1405 | 1440 | 1452 | 1440 |
| 1416 | 1452 | 1452 | 1452 |
| 1417 | 1452 | 1468 | 1452 |
| 1420 | 1452 | 1468 | 1452 |
How to read the table:
- A is always sized as if the packet were 4 bytes longer.
- For 1417–1420 (
mtu-3…mtu), A's message is 1468 bytes. That means a 1436-byte plaintext, which is larger than the configured MTU of 1420, and a 1496-byte outer IPv4 packet (mtu + 76). - The userspace endpoint B is always correct.
Over loopback the oversized packets still get through, because lo0's MTU is 16384. On a real path they exceed the path MTU, as described above.
Logs
Debug logs of both endpoints during the run above. The gateway IP and MAC in the network environment line are redacted; nothing else is removed.
A (system: true):
INFO[0000] endpoint/wireguard[wg-a]: started at utun121
DEBUG[0000] endpoint/wireguard[wg-a]: uapi: updating private key
DEBUG[0000] endpoint/wireguard[wg-a]: routine: encryption worker 4 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: event worker - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: encryption worker 5 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: handshake worker 7 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: decryption worker 4 - started
DEBUG[0000] endpoint/wireguard[wg-a]: uapi: updating listen port
DEBUG[0000] endpoint/wireguard[wg-a]: routine: encryption worker 3 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: encryption worker 6 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: encryption worker 2 - started
DEBUG[0000] endpoint/wireguard[wg-a]: interface up requested
DEBUG[0000] endpoint/wireguard[wg-a]: routine: handshake worker 3 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: decryption worker 6 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: handshake worker 1 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: decryption worker 5 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: handshake worker 6 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: decryption worker 8 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: decryption worker 2 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: handshake worker 8 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: encryption worker 7 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: encryption worker 1 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: decryption worker 7 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: decryption worker 1 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: handshake worker 2 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: handshake worker 10 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: encryption worker 10 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: decryption worker 10 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: decryption worker 9 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: handshake worker 9 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: decryption worker 3 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: tun reader - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: encryption worker 8 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: handshake worker 4 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: encryption worker 9 - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: handshake worker 5 - started
DEBUG[0000] endpoint/wireguard[wg-a]: peer(am5t…4OmI) - uapi: created
DEBUG[0000] endpoint/wireguard[wg-a]: peer(am5t…4OmI) - uapi: updating endpoint
DEBUG[0000] endpoint/wireguard[wg-a]: peer(am5t…4OmI) - uapi: Adding allowedip
DEBUG[0000] endpoint/wireguard[wg-a]: peer(am5t…4OmI) - starting
DEBUG[0000] endpoint/wireguard[wg-a]: peer(am5t…4OmI) - routine: sequential receiver - started
DEBUG[0000] endpoint/wireguard[wg-a]: peer(am5t…4OmI) - routine: sequential sender - started
DEBUG[0000] endpoint/wireguard[wg-a]: udp bind has been updated
DEBUG[0000] endpoint/wireguard[wg-a]: interface state was Down, requested Up, now Up
DEBUG[0000] endpoint/wireguard[wg-a]: routine: receive incoming makeReceiveMsgX - started
DEBUG[0000] endpoint/wireguard[wg-a]: routine: receive incoming makeReceiveMsgX - started
INFO[0000] network: updated default interface en0, index 13
INFO[0000] sing-box started (0.00s)
INFO[0000] network: updated network environment: gateway [redacted], gateway_mac [redacted]
DEBUG[0002] endpoint/wireguard[wg-a]: peer(am5t…4OmI) - sending handshake initiation
DEBUG[0002] endpoint/wireguard[wg-a]: peer(am5t…4OmI) - received handshake response
DEBUG[0009] endpoint/wireguard[wg-a]: routine: receive incoming makeReceiveMsgX - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: receive incoming makeReceiveMsgX - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: peer(am5t…4OmI) - stopping
DEBUG[0009] endpoint/wireguard[wg-a]: peer(am5t…4OmI) - routine: sequential sender - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: peer(am5t…4OmI) - routine: sequential receiver - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: interface state was Up, requested Down, now Down
DEBUG[0009] endpoint/wireguard[wg-a]: device closing
DEBUG[0009] endpoint/wireguard[wg-a]: routine: event worker - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: tun reader - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: device closed
DEBUG[0009] endpoint/wireguard[wg-a]: routine: handshake worker 3 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: handshake worker 9 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: decryption worker 10 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: handshake worker 7 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: handshake worker 5 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: handshake worker 4 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: decryption worker 1 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: decryption worker 7 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: decryption worker 2 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: decryption worker 8 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: decryption worker 5 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: decryption worker 6 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: decryption worker 4 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: decryption worker 3 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: decryption worker 9 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: handshake worker 8 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: handshake worker 10 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: handshake worker 2 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: handshake worker 6 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: handshake worker 1 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: encryption worker 10 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: encryption worker 1 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: encryption worker 7 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: encryption worker 4 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: encryption worker 9 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: encryption worker 8 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: encryption worker 6 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: encryption worker 3 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: encryption worker 5 - stopped
DEBUG[0009] endpoint/wireguard[wg-a]: routine: encryption worker 2 - stopped
B (userspace):
DEBUG[0000] endpoint/wireguard[wg-b]: uapi: updating private key
DEBUG[0000] endpoint/wireguard[wg-b]: routine: decryption worker 5 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: decryption worker 8 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: decryption worker 1 - started
DEBUG[0000] endpoint/wireguard[wg-b]: uapi: updating listen port
DEBUG[0000] endpoint/wireguard[wg-b]: routine: handshake worker 4 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: encryption worker 1 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: encryption worker 10 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: decryption worker 7 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: handshake worker 5 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: decryption worker 6 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: encryption worker 2 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: decryption worker 4 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: tun reader - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: handshake worker 6 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: encryption worker 3 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: encryption worker 6 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: decryption worker 2 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: handshake worker 8 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: handshake worker 1 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: handshake worker 9 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: decryption worker 3 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: encryption worker 4 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: encryption worker 7 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: handshake worker 3 - started
DEBUG[0000] endpoint/wireguard[wg-b]: peer(BQVp…yJk8) - uapi: created
DEBUG[0000] endpoint/wireguard[wg-b]: peer(BQVp…yJk8) - uapi: updating endpoint
DEBUG[0000] endpoint/wireguard[wg-b]: routine: encryption worker 9 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: encryption worker 8 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: handshake worker 7 - started
DEBUG[0000] endpoint/wireguard[wg-b]: peer(BQVp…yJk8) - uapi: Adding allowedip
DEBUG[0000] endpoint/wireguard[wg-b]: routine: decryption worker 10 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: handshake worker 10 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: encryption worker 5 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: handshake worker 2 - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: event worker - started
DEBUG[0000] endpoint/wireguard[wg-b]: interface up requested
DEBUG[0000] endpoint/wireguard[wg-b]: routine: decryption worker 9 - started
DEBUG[0000] endpoint/wireguard[wg-b]: udp bind has been updated
DEBUG[0000] endpoint/wireguard[wg-b]: peer(BQVp…yJk8) - starting
DEBUG[0000] endpoint/wireguard[wg-b]: interface state was Down, requested Up, now Up
INFO[0000] network: updated default interface en0, index 13
INFO[0000] network: updated network environment: gateway [redacted], gateway_mac [redacted]
DEBUG[0000] endpoint/wireguard[wg-b]: routine: receive incoming makeReceiveMsgX - started
DEBUG[0000] endpoint/wireguard[wg-b]: routine: receive incoming makeReceiveMsgX - started
DEBUG[0000] endpoint/wireguard[wg-b]: peer(BQVp…yJk8) - routine: sequential receiver - started
DEBUG[0000] endpoint/wireguard[wg-b]: peer(BQVp…yJk8) - routine: sequential sender - started
INFO[0000] sing-box started (0.00s)
DEBUG[0002] endpoint/wireguard[wg-b]: peer(BQVp…yJk8) - received handshake initiation
DEBUG[0002] endpoint/wireguard[wg-b]: peer(BQVp…yJk8) - sending handshake response
DEBUG[0009] endpoint/wireguard[wg-b]: routine: receive incoming makeReceiveMsgX - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: receive incoming makeReceiveMsgX - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: peer(BQVp…yJk8) - stopping
DEBUG[0009] endpoint/wireguard[wg-b]: peer(BQVp…yJk8) - routine: sequential sender - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: peer(BQVp…yJk8) - routine: sequential receiver - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: interface state was Up, requested Down, now Down
DEBUG[0009] endpoint/wireguard[wg-b]: device closing
DEBUG[0009] endpoint/wireguard[wg-b]: routine: event worker - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: tun reader - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: device closed
DEBUG[0009] endpoint/wireguard[wg-b]: routine: decryption worker 3 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: handshake worker 5 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: decryption worker 2 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: decryption worker 4 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: decryption worker 6 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: handshake worker 2 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: decryption worker 7 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: decryption worker 1 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: decryption worker 8 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: decryption worker 5 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: decryption worker 9 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: decryption worker 10 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: handshake worker 4 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: handshake worker 9 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: handshake worker 10 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: handshake worker 7 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: handshake worker 3 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: handshake worker 8 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: handshake worker 1 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: handshake worker 6 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: encryption worker 9 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: encryption worker 7 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: encryption worker 4 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: encryption worker 6 - stopped
DEBUG[0009] endpoint/wireguard[wg-b]: routine: encryption worker 3 - stopped
Supporter
- I am a sponsor
Integrity requirements
- I confirm that I have read the documentation, understand the meaning of all the configuration items I wrote, and did not pile up seemingly useful options or default values.
- I confirm that I have provided the server and client configuration files and process that can be reproduced locally, instead of a complicated client configuration file that has been stripped of sensitive data.
- I confirm that I have provided the simplest configuration that can be used to reproduce the error I reported, instead of depending on remote servers, TUN, graphical interface clients, or other closed-source software.
- I confirm that I have provided the complete configuration files and logs, rather than just providing parts I think are useful out of confidence in my own intelligence.
- Dominant language
- Go
- Stars
- 39.1k
- Forks
- 4.8k
- PR merge metrics
- No merged PRs in 30d
Getting set up
- Ships a Dockerfile or Docker Compose file
- No pull request template
- No contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from SagerNet/sing-box
-
Difficulty 1/5 Under an hour Newbie friendliness 66/100
-
Difficulty 2/5 1-3 hours Newbie friendliness 70/100
-
Difficulty 2/5 1-3 hours Newbie friendliness 90/100
-
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
-
Difficulty 1/5 Under an hour Newbie friendliness 88/100
All issues in SagerNet/sing-box
Similar issues
-
pre-migration
Difficulty 1/5 1-3 hours Newbie friendliness 88/100
Maintainers usually reply within 1 day
-
client.HTTPFetcher doesn't close non-200 response bodies, so connections leakPossibly taken @grempe claimed this today. Open
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
transparency-dev/tessera#1245 ·
Maintainers usually reply within 2 days
-
Difficulty 1/5 1-3 hours Newbie friendliness 77/100
Maintainers usually reply within 1 day
-
bug e2e
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
shaiknoorullah/hg-mono#1086 ·
Maintainers usually reply within 1 day
-
native
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
prime-radiant-inc/evener#4839 ·
Maintainers usually reply within 1 day