diff --git a/README.md b/README.md index 9680871..7c54601 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # [glider](https://github.com/nadoo/glider) -[![Go Report Card](https://goreportcard.com/badge/github.com/nadoo/glider)](https://goreportcard.com/report/github.com/nadoo/glider) -[![GitHub release](https://img.shields.io/github/v/release/nadoo/glider.svg?include_prereleases)](https://github.com/nadoo/glider/releases) -[![Actions Status](https://github.com/nadoo/glider/workflows/Build/badge.svg)](https://github.com/nadoo/glider/actions) +[![Go Report Card](https://goreportcard.com/badge/github.com/nadoo/glider?style=flat-square)](https://goreportcard.com/report/github.com/nadoo/glider) +[![GitHub release](https://img.shields.io/github/v/release/nadoo/glider.svg?style=flat-square&include_prereleases)](https://github.com/nadoo/glider/releases) +[![Actions Status](https://img.shields.io/github/workflow/status/nadoo/glider/Build?style=flat-square)](https://github.com/nadoo/glider/actions) glider is a forward proxy with multiple protocols support, and also a dns forwarding server with ipset management features(like dnsmasq). diff --git a/common/socks/socks.go b/common/socks/socks.go index d5a5ec1..2aa5165 100644 --- a/common/socks/socks.go +++ b/common/socks/socks.go @@ -27,8 +27,12 @@ const ( ATypIP6 = 4 ) -// MaxAddrLen is the maximum size of SOCKS address in bytes. -const MaxAddrLen = 1 + 1 + 255 + 2 +const ( + // maximum size of SOCKS address in bytes. + MaxAddrLen = 1 + 1 + 255 + 2 + // minimum size of SOCKS address in bytes. + MinAddrLen = 5 +) // Errors are socks5 errors var Errors = []error{ @@ -129,7 +133,6 @@ func SplitAddr(b []byte) Addr { addrLen = 1 + net.IPv6len + 2 default: return nil - } if len(b) < addrLen { diff --git a/go.mod b/go.mod index 106d990..53b75a9 100644 --- a/go.mod +++ b/go.mod @@ -9,10 +9,10 @@ require ( github.com/nadoo/go-shadowsocks2 v0.1.2 github.com/pkg/errors v0.9.1 // indirect github.com/tjfoc/gmsm v1.3.0 // indirect - github.com/xtaci/kcp-go/v5 v5.5.11 + github.com/xtaci/kcp-go/v5 v5.5.12 golang.org/x/crypto v0.0.0-20200406173513-056763e48d71 golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e // indirect - golang.org/x/sys v0.0.0-20200406155108-e3b113bbe6a4 // indirect + golang.org/x/sys v0.0.0-20200409092240-59c9f1ba88fa // indirect ) // Replace dependency modules with local developing copy diff --git a/go.sum b/go.sum index 4f80fe9..783d8b0 100644 --- a/go.sum +++ b/go.sum @@ -39,17 +39,15 @@ github.com/templexxx/cpu v0.0.1 h1:hY4WdLOgKdc8y13EYklu9OUTXik80BkxHoWvTO6MQQY= github.com/templexxx/cpu v0.0.1/go.mod h1:w7Tb+7qgcAlIyX4NhLuDKt78AHA5SzPmq0Wj6HiEnnk= github.com/templexxx/cpufeat v0.0.0-20180724012125-cef66df7f161/go.mod h1:wM7WEvslTq+iOEAMDLSzhVuOt5BRZ05WirO+b09GHQU= github.com/templexxx/xor v0.0.0-20181023030647-4e92f724b73b/go.mod h1:5XA7W9S6mni3h5uvOC75dA3m9CCCaS83lltmc0ukdi4= -github.com/templexxx/xor v0.0.0-20191217153810-f85b25db303b/go.mod h1:5XA7W9S6mni3h5uvOC75dA3m9CCCaS83lltmc0ukdi4= github.com/templexxx/xorsimd v0.4.1 h1:iUZcywbOYDRAZUasAs2eSCUW8eobuZDy0I9FJiORkVg= github.com/templexxx/xorsimd v0.4.1/go.mod h1:W+ffZz8jJMH2SXwuKu9WhygqBMbFnp14G2fqEr8qaNo= github.com/tjfoc/gmsm v1.0.1/go.mod h1:XxO4hdhhrzAd+G4CjDqaOkd0hUzmtPR/d3EiBBMn/wc= github.com/tjfoc/gmsm v1.3.0 h1:i7c6Za/IlgBvnGxYpfD7L3TGuaS+v6oGcgq+J9/ecEA= github.com/tjfoc/gmsm v1.3.0/go.mod h1:HaUcFuY0auTiaHB9MHFGCPx5IaLhTUd2atbCFBQXn9w= +github.com/xtaci/kcp-go v5.4.11+incompatible h1:tJbtarpmOoOD74cZ41uvvF5Hyt1nvctHQCOxZ6ot5xw= github.com/xtaci/kcp-go v5.4.11+incompatible/go.mod h1:bN6vIwHQbfHaHtFpEssmWsN45a+AZwO7eyRCmEIbtvE= -github.com/xtaci/kcp-go v5.4.20+incompatible h1:TN1uey3Raw0sTz0Fg8GkfM0uH3YwzhnZWQ1bABv5xAg= -github.com/xtaci/kcp-go v5.4.20+incompatible/go.mod h1:bN6vIwHQbfHaHtFpEssmWsN45a+AZwO7eyRCmEIbtvE= -github.com/xtaci/kcp-go/v5 v5.5.11 h1:wYvoREAp6bG3sYwtxhY1QelbB/1fNggCtkt2DwqFj2M= -github.com/xtaci/kcp-go/v5 v5.5.11/go.mod h1:Oyw+zrBrO58urX1AaWV+2RynthEKcs+qrRAh0Q8YpdU= +github.com/xtaci/kcp-go/v5 v5.5.12 h1:iALGyvti/oBbl1TbVoUpHEUHCorDEb3tEKl1CPY3KXM= +github.com/xtaci/kcp-go/v5 v5.5.12/go.mod h1:H0T/EJ+lPNytnFYsKLH0JHUtiwZjG3KXlTM6c+Q4YUo= github.com/xtaci/lossyconn v0.0.0-20190602105132-8df528c0c9ae h1:J0GxkO96kL4WF+AIT3M4mfUVinOCPgf2uUWYFUzN0sM= github.com/xtaci/lossyconn v0.0.0-20190602105132-8df528c0c9ae/go.mod h1:gXtu8J62kEgmN++bm9BVICuT/e8yiLI2KFobd/TRFsE= gitlab.com/yawning/chacha20.git v0.0.0-20190903091407-6d1cb28dc72c h1:yrfrd1u7MWIwWIulet2TZPEkeNQhQ/GcPLdPXgiEEr0= @@ -75,8 +73,8 @@ golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191020212454-3e7259c5e7c2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200406155108-e3b113bbe6a4 h1:c1Sgqkh8v6ZxafNGG64r8C8UisIW2TKMJN8P86tKjr0= -golang.org/x/sys v0.0.0-20200406155108-e3b113bbe6a4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200409092240-59c9f1ba88fa h1:mQTN3ECqfsViCNBgq+A40vdwhkGykrrQlYe3mPj6BoU= +golang.org/x/sys v0.0.0-20200409092240-59c9f1ba88fa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/proxy/socks5/packet.go b/proxy/socks5/packet.go index 0a28601..5e6db45 100644 --- a/proxy/socks5/packet.go +++ b/proxy/socks5/packet.go @@ -1,6 +1,7 @@ package socks5 import ( + "errors" "net" "github.com/nadoo/glider/common/log" @@ -57,6 +58,10 @@ func (pc *PktConn) ReadFrom(b []byte) (int, net.Addr, error) { return n, raddr, err } + if n < socks.MinAddrLen { + return n, raddr, errors.New("not enough size to get addr") + } + // https://tools.ietf.org/html/rfc1928#section-7 // +----+------+------+----------+----------+----------+ // |RSV | FRAG | ATYP | DST.ADDR | DST.PORT | DATA | @@ -64,6 +69,9 @@ func (pc *PktConn) ReadFrom(b []byte) (int, net.Addr, error) { // | 2 | 1 | 1 | Variable | 2 | Variable | // +----+------+------+----------+----------+----------+ tgtAddr := socks.SplitAddr(buf[3:]) + if tgtAddr == nil { + return n, raddr, errors.New("can not get addr") + } copy(b, buf[3+len(tgtAddr):]) //test diff --git a/proxy/ss/packet.go b/proxy/ss/packet.go index 91edf60..dae5a11 100644 --- a/proxy/ss/packet.go +++ b/proxy/ss/packet.go @@ -1,6 +1,7 @@ package ss import ( + "errors" "net" "github.com/nadoo/glider/common/socks" @@ -38,7 +39,14 @@ func (pc *PktConn) ReadFrom(b []byte) (int, net.Addr, error) { return n, raddr, err } + if n < socks.MinAddrLen { + return n, raddr, errors.New("not enough size to get addr") + } + tgtAddr := socks.SplitAddr(buf) + if tgtAddr == nil { + return n, raddr, errors.New("can not get addr") + } copy(b, buf[len(tgtAddr):]) //test diff --git a/proxy/trojan/trojan.go b/proxy/trojan/trojan.go index aba9a0a..1f52a41 100644 --- a/proxy/trojan/trojan.go +++ b/proxy/trojan/trojan.go @@ -128,7 +128,7 @@ func (s *Trojan) Dial(network, addr string) (net.Conn, error) { var buf bytes.Buffer buf.Write(s.pass[:]) buf.WriteString("\r\n") - buf.WriteByte(1) + buf.WriteByte(socks.CmdConnect) buf.Write(socks.ParseAddr(addr)) buf.WriteString("\r\n") _, err = tlsConn.Write(buf.Bytes())