@@ -23,3 +23,128 @@ func TestDefaultClient(t *testing.T) {
2323 require .Error (t , err )
2424 assert .Contains (t , err .Error (), "is not a safe port" )
2525}
26+
27+ func TestSetTrustedPrivateNetworks (t * testing.T ) {
28+ t .Run ("invalid CIDR returns error" , func (t * testing.T ) {
29+ err := SetTrustedPrivateNetworks ([]string {"not-a-cidr" })
30+ assert .Error (t , err )
31+ assert .Contains (t , err .Error (), "invalid trusted private network CIDR" )
32+ })
33+
34+ t .Run ("valid CIDRs are accepted" , func (t * testing.T ) {
35+ err := SetTrustedPrivateNetworks ([]string {"10.0.0.0/8" , "192.168.0.0/16" })
36+ assert .NoError (t , err )
37+ t .Cleanup (resetTrustedNetworks )
38+ })
39+
40+ t .Run ("invalid CIDR does not change existing allowlist" , func (t * testing.T ) {
41+ err := SetTrustedPrivateNetworks ([]string {"10.0.0.0/8" })
42+ require .NoError (t , err )
43+ require .Len (t , loadTrustedNetworks (), 1 )
44+
45+ err = SetTrustedPrivateNetworks ([]string {"bad" })
46+ require .Error (t , err )
47+ // The previous valid config is still in place.
48+ assert .Len (t , loadTrustedNetworks (), 1 )
49+ t .Cleanup (resetTrustedNetworks )
50+ })
51+
52+ t .Run ("empty list clears allowlist" , func (t * testing.T ) {
53+ err := SetTrustedPrivateNetworks ([]string {"10.0.0.0/8" })
54+ require .NoError (t , err )
55+
56+ err = SetTrustedPrivateNetworks ([]string {})
57+ require .NoError (t , err )
58+ assert .Empty (t , loadTrustedNetworks ())
59+ })
60+ }
61+
62+ func resetTrustedNetworks () {
63+ _ = SetTrustedPrivateNetworks (nil )
64+ }
65+
66+ func TestSafeControl (t * testing.T ) {
67+ build .BuildMode = build .ModeProd
68+ t .Cleanup (resetTrustedNetworks )
69+
70+ t .Run ("private IP blocked by default" , func (t * testing.T ) {
71+ err := safeControl ("tcp4" , "192.168.1.1:80" , nil )
72+ assert .Error (t , err )
73+ assert .Contains (t , err .Error (), "is not a public IP address" )
74+ })
75+
76+ t .Run ("loopback blocked by default" , func (t * testing.T ) {
77+ err := safeControl ("tcp4" , "127.0.0.1:80" , nil )
78+ assert .Error (t , err )
79+ assert .Contains (t , err .Error (), "is not a public IP address" )
80+ })
81+
82+ t .Run ("private IP allowed when inside configured CIDR" , func (t * testing.T ) {
83+ require .NoError (t , SetTrustedPrivateNetworks ([]string {"192.168.0.0/16" }))
84+ err := safeControl ("tcp4" , "192.168.1.1:80" , nil )
85+ assert .NoError (t , err )
86+ })
87+
88+ t .Run ("private IP on non-standard port allowed when inside configured CIDR" , func (t * testing.T ) {
89+ require .NoError (t , SetTrustedPrivateNetworks ([]string {"10.0.0.0/8" }))
90+ err := safeControl ("tcp4" , "10.0.0.1:8080" , nil )
91+ assert .NoError (t , err )
92+ })
93+
94+ t .Run ("private IP outside configured CIDR remains blocked" , func (t * testing.T ) {
95+ require .NoError (t , SetTrustedPrivateNetworks ([]string {"10.0.0.0/8" }))
96+ err := safeControl ("tcp4" , "192.168.1.1:80" , nil )
97+ assert .Error (t , err )
98+ assert .Contains (t , err .Error (), "is not a public IP address" )
99+ })
100+
101+ t .Run ("loopback allowed only if explicitly configured" , func (t * testing.T ) {
102+ require .NoError (t , SetTrustedPrivateNetworks ([]string {"192.168.0.0/16" }))
103+ err := safeControl ("tcp4" , "127.0.0.1:80" , nil )
104+ assert .Error (t , err )
105+
106+ require .NoError (t , SetTrustedPrivateNetworks ([]string {"127.0.0.0/8" }))
107+ err = safeControl ("tcp4" , "127.0.0.1:80" , nil )
108+ assert .NoError (t , err )
109+ })
110+
111+ t .Run ("link-local remains blocked even with trusted networks" , func (t * testing.T ) {
112+ require .NoError (t , SetTrustedPrivateNetworks ([]string {"0.0.0.0/0" }))
113+ err := safeControl ("tcp4" , "169.254.1.1:80" , nil )
114+ assert .Error (t , err )
115+ assert .Contains (t , err .Error (), "is not a valid IP address" )
116+ })
117+
118+ t .Run ("unspecified address remains blocked even with trusted networks" , func (t * testing.T ) {
119+ require .NoError (t , SetTrustedPrivateNetworks ([]string {"0.0.0.0/0" }))
120+ err := safeControl ("tcp4" , "0.0.0.0:80" , nil )
121+ assert .Error (t , err )
122+ assert .Contains (t , err .Error (), "is not a valid IP address" )
123+ })
124+
125+ t .Run ("unsupported network type rejected" , func (t * testing.T ) {
126+ err := safeControl ("udp" , "10.0.0.1:80" , nil )
127+ assert .Error (t , err )
128+ assert .Contains (t , err .Error (), "is not a safe network type" )
129+ })
130+
131+ t .Run ("public IP on non-standard port still blocked" , func (t * testing.T ) {
132+ require .NoError (t , SetTrustedPrivateNetworks ([]string {"10.0.0.0/8" }))
133+ err := safeControl ("tcp4" , "8.8.8.8:8080" , nil )
134+ assert .Error (t , err )
135+ assert .Contains (t , err .Error (), "is not a safe port number" )
136+ })
137+
138+ t .Run ("public IP on non-standard port blocked even with broad trusted CIDR" , func (t * testing.T ) {
139+ require .NoError (t , SetTrustedPrivateNetworks ([]string {"0.0.0.0/0" }))
140+ err := safeControl ("tcp4" , "8.8.8.8:8080" , nil )
141+ assert .Error (t , err )
142+ assert .Contains (t , err .Error (), "is not a safe port number" )
143+ })
144+
145+ t .Run ("IPv6 private address with matching CIDR" , func (t * testing.T ) {
146+ require .NoError (t , SetTrustedPrivateNetworks ([]string {"::1/128" }))
147+ err := safeControl ("tcp6" , "[::1]:8080" , nil )
148+ assert .NoError (t , err )
149+ })
150+ }
0 commit comments