quic.go 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375
  1. package sniff
  2. import (
  3. "bytes"
  4. "context"
  5. "crypto"
  6. "crypto/aes"
  7. "crypto/tls"
  8. "encoding/binary"
  9. "io"
  10. "os"
  11. "github.com/sagernet/sing-box/adapter"
  12. "github.com/sagernet/sing-box/common/ja3"
  13. "github.com/sagernet/sing-box/common/sniff/internal/qtls"
  14. C "github.com/sagernet/sing-box/constant"
  15. "github.com/sagernet/sing/common/buf"
  16. E "github.com/sagernet/sing/common/exceptions"
  17. "golang.org/x/crypto/hkdf"
  18. )
  19. func QUICClientHello(ctx context.Context, metadata *adapter.InboundContext, packet []byte) error {
  20. reader := bytes.NewReader(packet)
  21. typeByte, err := reader.ReadByte()
  22. if err != nil {
  23. return err
  24. }
  25. if typeByte&0x40 == 0 {
  26. return E.New("bad type byte")
  27. }
  28. var versionNumber uint32
  29. err = binary.Read(reader, binary.BigEndian, &versionNumber)
  30. if err != nil {
  31. return err
  32. }
  33. if versionNumber != qtls.VersionDraft29 && versionNumber != qtls.Version1 && versionNumber != qtls.Version2 {
  34. return E.New("bad version")
  35. }
  36. packetType := (typeByte & 0x30) >> 4
  37. if packetType == 0 && versionNumber == qtls.Version2 || packetType == 2 && versionNumber != qtls.Version2 || packetType > 2 {
  38. return E.New("bad packet type")
  39. }
  40. destConnIDLen, err := reader.ReadByte()
  41. if err != nil {
  42. return err
  43. }
  44. if destConnIDLen == 0 || destConnIDLen > 20 {
  45. return E.New("bad destination connection id length")
  46. }
  47. destConnID := make([]byte, destConnIDLen)
  48. _, err = io.ReadFull(reader, destConnID)
  49. if err != nil {
  50. return err
  51. }
  52. srcConnIDLen, err := reader.ReadByte()
  53. if err != nil {
  54. return err
  55. }
  56. _, err = io.CopyN(io.Discard, reader, int64(srcConnIDLen))
  57. if err != nil {
  58. return err
  59. }
  60. tokenLen, err := qtls.ReadUvarint(reader)
  61. if err != nil {
  62. return err
  63. }
  64. _, err = io.CopyN(io.Discard, reader, int64(tokenLen))
  65. if err != nil {
  66. return err
  67. }
  68. packetLen, err := qtls.ReadUvarint(reader)
  69. if err != nil {
  70. return err
  71. }
  72. hdrLen := int(reader.Size()) - reader.Len()
  73. if hdrLen+int(packetLen) > len(packet) {
  74. return os.ErrInvalid
  75. }
  76. _, err = io.CopyN(io.Discard, reader, 4)
  77. if err != nil {
  78. return err
  79. }
  80. pnBytes := make([]byte, aes.BlockSize)
  81. _, err = io.ReadFull(reader, pnBytes)
  82. if err != nil {
  83. return err
  84. }
  85. var salt []byte
  86. switch versionNumber {
  87. case qtls.Version1:
  88. salt = qtls.SaltV1
  89. case qtls.Version2:
  90. salt = qtls.SaltV2
  91. default:
  92. salt = qtls.SaltOld
  93. }
  94. var hkdfHeaderProtectionLabel string
  95. switch versionNumber {
  96. case qtls.Version2:
  97. hkdfHeaderProtectionLabel = qtls.HKDFLabelHeaderProtectionV2
  98. default:
  99. hkdfHeaderProtectionLabel = qtls.HKDFLabelHeaderProtectionV1
  100. }
  101. initialSecret := hkdf.Extract(crypto.SHA256.New, destConnID, salt)
  102. secret := qtls.HKDFExpandLabel(crypto.SHA256, initialSecret, []byte{}, "client in", crypto.SHA256.Size())
  103. hpKey := qtls.HKDFExpandLabel(crypto.SHA256, secret, []byte{}, hkdfHeaderProtectionLabel, 16)
  104. block, err := aes.NewCipher(hpKey)
  105. if err != nil {
  106. return err
  107. }
  108. mask := make([]byte, aes.BlockSize)
  109. block.Encrypt(mask, pnBytes)
  110. newPacket := make([]byte, len(packet))
  111. copy(newPacket, packet)
  112. newPacket[0] ^= mask[0] & 0xf
  113. for i := range newPacket[hdrLen : hdrLen+4] {
  114. newPacket[hdrLen+i] ^= mask[i+1]
  115. }
  116. packetNumberLength := newPacket[0]&0x3 + 1
  117. if hdrLen+int(packetNumberLength) > int(packetLen)+hdrLen {
  118. return os.ErrInvalid
  119. }
  120. var packetNumber uint32
  121. switch packetNumberLength {
  122. case 1:
  123. packetNumber = uint32(newPacket[hdrLen])
  124. case 2:
  125. packetNumber = uint32(binary.BigEndian.Uint16(newPacket[hdrLen:]))
  126. case 3:
  127. packetNumber = uint32(newPacket[hdrLen+2]) | uint32(newPacket[hdrLen+1])<<8 | uint32(newPacket[hdrLen])<<16
  128. case 4:
  129. packetNumber = binary.BigEndian.Uint32(newPacket[hdrLen:])
  130. default:
  131. return E.New("bad packet number length")
  132. }
  133. extHdrLen := hdrLen + int(packetNumberLength)
  134. copy(newPacket[extHdrLen:hdrLen+4], packet[extHdrLen:])
  135. data := newPacket[extHdrLen : int(packetLen)+hdrLen]
  136. var keyLabel string
  137. var ivLabel string
  138. switch versionNumber {
  139. case qtls.Version2:
  140. keyLabel = qtls.HKDFLabelKeyV2
  141. ivLabel = qtls.HKDFLabelIVV2
  142. default:
  143. keyLabel = qtls.HKDFLabelKeyV1
  144. ivLabel = qtls.HKDFLabelIVV1
  145. }
  146. key := qtls.HKDFExpandLabel(crypto.SHA256, secret, []byte{}, keyLabel, 16)
  147. iv := qtls.HKDFExpandLabel(crypto.SHA256, secret, []byte{}, ivLabel, 12)
  148. cipher := qtls.AEADAESGCMTLS13(key, iv)
  149. nonce := make([]byte, int32(cipher.NonceSize()))
  150. binary.BigEndian.PutUint64(nonce[len(nonce)-8:], uint64(packetNumber))
  151. decrypted, err := cipher.Open(newPacket[extHdrLen:extHdrLen], nonce, data, newPacket[:extHdrLen])
  152. if err != nil {
  153. return err
  154. }
  155. var frameType byte
  156. var fragments []qCryptoFragment
  157. decryptedReader := bytes.NewReader(decrypted)
  158. const (
  159. frameTypePadding = 0x00
  160. frameTypePing = 0x01
  161. frameTypeAck = 0x02
  162. frameTypeAck2 = 0x03
  163. frameTypeCrypto = 0x06
  164. frameTypeConnectionClose = 0x1c
  165. )
  166. var frameTypeList []uint8
  167. for {
  168. frameType, err = decryptedReader.ReadByte()
  169. if err == io.EOF {
  170. break
  171. }
  172. frameTypeList = append(frameTypeList, frameType)
  173. switch frameType {
  174. case frameTypePadding:
  175. continue
  176. case frameTypePing:
  177. continue
  178. case frameTypeAck, frameTypeAck2:
  179. _, err = qtls.ReadUvarint(decryptedReader) // Largest Acknowledged
  180. if err != nil {
  181. return err
  182. }
  183. _, err = qtls.ReadUvarint(decryptedReader) // ACK Delay
  184. if err != nil {
  185. return err
  186. }
  187. ackRangeCount, err := qtls.ReadUvarint(decryptedReader) // ACK Range Count
  188. if err != nil {
  189. return err
  190. }
  191. _, err = qtls.ReadUvarint(decryptedReader) // First ACK Range
  192. if err != nil {
  193. return err
  194. }
  195. for i := 0; i < int(ackRangeCount); i++ {
  196. _, err = qtls.ReadUvarint(decryptedReader) // Gap
  197. if err != nil {
  198. return err
  199. }
  200. _, err = qtls.ReadUvarint(decryptedReader) // ACK Range Length
  201. if err != nil {
  202. return err
  203. }
  204. }
  205. if frameType == 0x03 {
  206. _, err = qtls.ReadUvarint(decryptedReader) // ECT0 Count
  207. if err != nil {
  208. return err
  209. }
  210. _, err = qtls.ReadUvarint(decryptedReader) // ECT1 Count
  211. if err != nil {
  212. return err
  213. }
  214. _, err = qtls.ReadUvarint(decryptedReader) // ECN-CE Count
  215. if err != nil {
  216. return err
  217. }
  218. }
  219. case frameTypeCrypto:
  220. var offset uint64
  221. offset, err = qtls.ReadUvarint(decryptedReader)
  222. if err != nil {
  223. return err
  224. }
  225. var length uint64
  226. length, err = qtls.ReadUvarint(decryptedReader)
  227. if err != nil {
  228. return err
  229. }
  230. index := len(decrypted) - decryptedReader.Len()
  231. fragments = append(fragments, qCryptoFragment{offset, length, decrypted[index : index+int(length)]})
  232. _, err = decryptedReader.Seek(int64(length), io.SeekCurrent)
  233. if err != nil {
  234. return err
  235. }
  236. case frameTypeConnectionClose:
  237. _, err = qtls.ReadUvarint(decryptedReader) // Error Code
  238. if err != nil {
  239. return err
  240. }
  241. _, err = qtls.ReadUvarint(decryptedReader) // Frame Type
  242. if err != nil {
  243. return err
  244. }
  245. var length uint64
  246. length, err = qtls.ReadUvarint(decryptedReader) // Reason Phrase Length
  247. if err != nil {
  248. return err
  249. }
  250. _, err = decryptedReader.Seek(int64(length), io.SeekCurrent) // Reason Phrase
  251. if err != nil {
  252. return err
  253. }
  254. default:
  255. return os.ErrInvalid
  256. }
  257. }
  258. if metadata.SniffContext != nil {
  259. fragments = append(fragments, metadata.SniffContext.([]qCryptoFragment)...)
  260. metadata.SniffContext = nil
  261. }
  262. var frameLen uint64
  263. for _, fragment := range fragments {
  264. frameLen += fragment.length
  265. }
  266. buffer := buf.NewSize(5 + int(frameLen))
  267. defer buffer.Release()
  268. buffer.WriteByte(0x16)
  269. binary.Write(buffer, binary.BigEndian, uint16(0x0303))
  270. binary.Write(buffer, binary.BigEndian, uint16(frameLen))
  271. var index uint64
  272. var length int
  273. find:
  274. for {
  275. for _, fragment := range fragments {
  276. if fragment.offset == index {
  277. buffer.Write(fragment.payload)
  278. index = fragment.offset + fragment.length
  279. length++
  280. continue find
  281. }
  282. }
  283. break
  284. }
  285. metadata.Protocol = C.ProtocolQUIC
  286. fingerprint, err := ja3.Compute(buffer.Bytes())
  287. if err != nil {
  288. metadata.Protocol = C.ProtocolQUIC
  289. metadata.Client = C.ClientChromium
  290. metadata.SniffContext = fragments
  291. return E.Cause1(ErrNeedMoreData, err)
  292. }
  293. metadata.Domain = fingerprint.ServerName
  294. for metadata.Client == "" {
  295. if len(frameTypeList) == 1 {
  296. metadata.Client = C.ClientFirefox
  297. break
  298. }
  299. if frameTypeList[0] == frameTypeCrypto && isZero(frameTypeList[1:]) {
  300. if len(fingerprint.Versions) == 2 && fingerprint.Versions[0]&ja3.GreaseBitmask == 0x0A0A &&
  301. len(fingerprint.EllipticCurves) == 5 && fingerprint.EllipticCurves[0]&ja3.GreaseBitmask == 0x0A0A {
  302. metadata.Client = C.ClientSafari
  303. break
  304. }
  305. if len(fingerprint.CipherSuites) == 1 && fingerprint.CipherSuites[0] == tls.TLS_AES_256_GCM_SHA384 &&
  306. len(fingerprint.EllipticCurves) == 1 && fingerprint.EllipticCurves[0] == uint16(tls.X25519) &&
  307. len(fingerprint.SignatureAlgorithms) == 1 && fingerprint.SignatureAlgorithms[0] == uint16(tls.ECDSAWithP256AndSHA256) {
  308. metadata.Client = C.ClientSafari
  309. break
  310. }
  311. }
  312. if frameTypeList[len(frameTypeList)-1] == frameTypeCrypto && isZero(frameTypeList[:len(frameTypeList)-1]) {
  313. metadata.Client = C.ClientQUICGo
  314. break
  315. }
  316. if count(frameTypeList, frameTypeCrypto) > 1 || count(frameTypeList, frameTypePing) > 0 {
  317. if maybeUQUIC(fingerprint) {
  318. metadata.Client = C.ClientQUICGo
  319. } else {
  320. metadata.Client = C.ClientChromium
  321. }
  322. break
  323. }
  324. metadata.Client = C.ClientUnknown
  325. //nolint:staticcheck
  326. break
  327. }
  328. return nil
  329. }
  330. func isZero(slices []uint8) bool {
  331. for _, slice := range slices {
  332. if slice != 0 {
  333. return false
  334. }
  335. }
  336. return true
  337. }
  338. func count(slices []uint8, value uint8) int {
  339. var times int
  340. for _, slice := range slices {
  341. if slice == value {
  342. times++
  343. }
  344. }
  345. return times
  346. }
  347. type qCryptoFragment struct {
  348. offset uint64
  349. length uint64
  350. payload []byte
  351. }