1
0
mirror of https://github.com/v2fly/v2ray-core.git synced 2025-01-05 00:47:51 -05:00

Fix unsafe math rand usage

This commit is contained in:
Shelikhoo 2024-03-13 19:23:06 +00:00 committed by Xiaokang Wang (Shelikhoo)
parent 94fa391dfe
commit 04275b6991
3 changed files with 18 additions and 3 deletions

View File

@ -3,6 +3,10 @@
package dice package dice
import ( import (
crand "crypto/rand"
"github.com/v2fly/v2ray-core/v5/common"
"io"
"math/big"
"math/rand" "math/rand"
"time" "time"
) )
@ -15,6 +19,17 @@ func Roll(n int) int {
return rand.Intn(n) return rand.Intn(n)
} }
// RollWith returns a non-negative number between 0 (inclusive) and n (exclusive).
// Use random as the random source, if read fails, it panics.
func RollWith(n int, random io.Reader) int {
if n == 1 {
return 0
}
mrand, err := crand.Int(random, big.NewInt(int64(n)))
common.Must(err)
return int(mrand.Int64())
}
// Roll returns a non-negative number between 0 (inclusive) and n (exclusive). // Roll returns a non-negative number between 0 (inclusive) and n (exclusive).
func RollDeterministic(n int, seed int64) int { func RollDeterministic(n int, seed int64) int {
if n == 1 { if n == 1 {

View File

@ -5,8 +5,8 @@ import (
"crypto/cipher" "crypto/cipher"
cryptoRand "crypto/rand" cryptoRand "crypto/rand"
"encoding/binary" "encoding/binary"
"github.com/v2fly/v2ray-core/v5/common/dice"
"io" "io"
"math/rand"
"time" "time"
"github.com/v2fly/v2ray-core/v5/common" "github.com/v2fly/v2ray-core/v5/common"
@ -62,7 +62,7 @@ func (t *TCPRequest) EncodeTCPRequestHeader(effectivePsk []byte,
paddingLength := TCPMinPaddingLength paddingLength := TCPMinPaddingLength
if initialPayload == nil { if initialPayload == nil {
initialPayload = []byte{} initialPayload = []byte{}
paddingLength += 1 + rand.Intn(TCPMaxPaddingLength) // TODO INSECURE RANDOM USED paddingLength += 1 + dice.RollWith(TCPMaxPaddingLength, cryptoRand.Reader)
} }
variableLengthHeader := &TCPRequestHeader3VariableLength{ variableLengthHeader := &TCPRequestHeader3VariableLength{

View File

@ -101,7 +101,7 @@ func (c *ClientSession) EncodeRequestHeader(header *protocol.RequestHeader, writ
common.Must(buffer.WriteByte(c.responseHeader)) common.Must(buffer.WriteByte(c.responseHeader))
common.Must(buffer.WriteByte(byte(header.Option))) common.Must(buffer.WriteByte(byte(header.Option)))
paddingLen := dice.Roll(16) paddingLen := dice.RollWith(16, rand.Reader)
security := byte(paddingLen<<4) | byte(header.Security) security := byte(paddingLen<<4) | byte(header.Security)
common.Must2(buffer.Write([]byte{security, byte(0), byte(header.Command)})) common.Must2(buffer.Write([]byte{security, byte(0), byte(header.Command)}))