Skip to content

Commit af5d256

Browse files
authored
Fail closed with malformed allowfrom data in register endpoint (#148)
* Prepare readme for release * Fail closed with malformed allowfrom data in register endpoint
1 parent 395cb7a commit af5d256

File tree

3 files changed

+58
-4
lines changed

3 files changed

+58
-4
lines changed

acmetxt.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,16 @@ func (c *cidrslice) JSON() string {
3030
return string(ret)
3131
}
3232

33+
func (c *cidrslice) isValid() error {
34+
for _, v := range *c {
35+
_, _, err := net.ParseCIDR(sanitizeIPv6addr(v))
36+
if err != nil {
37+
return err
38+
}
39+
}
40+
return nil
41+
}
42+
3343
func (c *cidrslice) ValidEntries() []string {
3444
valid := []string{}
3545
for _, v := range *c {

api.go

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,11 @@ type RegResponse struct {
2222
func webRegisterPost(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
2323
var regStatus int
2424
var reg []byte
25+
var err error
2526
aTXT := ACMETxt{}
2627
bdata, _ := ioutil.ReadAll(r.Body)
2728
if bdata != nil && len(bdata) > 0 {
28-
err := json.Unmarshal(bdata, &aTXT)
29+
err = json.Unmarshal(bdata, &aTXT)
2930
if err != nil {
3031
regStatus = http.StatusBadRequest
3132
reg = jsonError("malformed_json_payload")
@@ -35,6 +36,18 @@ func webRegisterPost(w http.ResponseWriter, r *http.Request, _ httprouter.Params
3536
return
3637
}
3738
}
39+
40+
// Fail with malformed CIDR mask in allowfrom
41+
err = aTXT.AllowFrom.isValid()
42+
if err != nil {
43+
regStatus = http.StatusBadRequest
44+
reg = jsonError("invalid_allowfrom_cidr")
45+
w.Header().Set("Content-Type", "application/json")
46+
w.WriteHeader(regStatus)
47+
w.Write(reg)
48+
return
49+
}
50+
3851
// Create new user
3952
nu, err := DB.Register(aTXT.AllowFrom)
4053
if err != nil {

api_test.go

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,9 @@ func TestApiRegister(t *testing.T) {
9696

9797
allowfrom := map[string][]interface{}{
9898
"allowfrom": []interface{}{"123.123.123.123/32",
99-
"1010.10.10.10/24",
100-
"invalid"},
99+
"2001:db8:a0b:12f0::1/32",
100+
"[::1]/64",
101+
},
101102
}
102103

103104
response := e.POST("/register").
@@ -112,7 +113,37 @@ func TestApiRegister(t *testing.T) {
112113
ContainsKey("allowfrom").
113114
NotContainsKey("error")
114115

115-
response.Value("allowfrom").Array().Elements("123.123.123.123/32")
116+
response.Value("allowfrom").Array().Elements("123.123.123.123/32", "2001:db8:a0b:12f0::1/32", "::1/64")
117+
}
118+
119+
func TestApiRegisterBadAllowFrom(t *testing.T) {
120+
router := setupRouter(false, false)
121+
server := httptest.NewServer(router)
122+
defer server.Close()
123+
e := getExpect(t, server)
124+
invalidVals := []string{
125+
"invalid",
126+
"1.2.3.4/33",
127+
"1.2/24",
128+
"1.2.3.4",
129+
"12345:db8:a0b:12f0::1/32",
130+
"1234::123::123::1/32",
131+
}
132+
133+
for _, v := range invalidVals {
134+
135+
allowfrom := map[string][]interface{}{
136+
"allowfrom": []interface{}{v}}
137+
138+
response := e.POST("/register").
139+
WithJSON(allowfrom).
140+
Expect().
141+
Status(http.StatusBadRequest).
142+
JSON().Object().
143+
ContainsKey("error")
144+
145+
response.Value("error").Equal("invalid_allowfrom_cidr")
146+
}
116147
}
117148

118149
func TestApiRegisterMalformedJSON(t *testing.T) {

0 commit comments

Comments
 (0)