@@ -29,6 +29,7 @@ import (
2929
3030 "github.com/arduino/arduino-create-agent/config"
3131 "github.com/arduino/arduino-create-agent/gen/tools"
32+ "github.com/arduino/arduino-create-agent/upload"
3233 v2 "github.com/arduino/arduino-create-agent/v2"
3334 "github.com/gin-gonic/gin"
3435 "github.com/stretchr/testify/require"
@@ -114,3 +115,38 @@ func TestInstallToolV2(t *testing.T) {
114115 })
115116 }
116117}
118+ func TestUploadHandlerAgainstEvilFileNames (t * testing.T ) {
119+ r := gin .New ()
120+ r .POST ("/" , uploadHandler )
121+ ts := httptest .NewServer (r )
122+
123+ uploadEvilFileName := Upload {
124+ Port : "/dev/ttyACM0" ,
125+ Board : "arduino:avr:uno" ,
126+ Extra : upload.Extra {Network : true },
127+ Hex : []byte ("test" ),
128+ Filename : "../evil.txt" ,
129+ ExtraFiles : []additionalFile {{Hex : []byte ("test" ), Filename : "../evil.txt" }},
130+ }
131+ uploadEvilExtraFile := Upload {
132+ Port : "/dev/ttyACM0" ,
133+ Board : "arduino:avr:uno" ,
134+ Extra : upload.Extra {Network : true },
135+ Hex : []byte ("test" ),
136+ Filename : "file.txt" ,
137+ ExtraFiles : []additionalFile {{Hex : []byte ("test" ), Filename : "../evil.txt" }},
138+ }
139+
140+ for _ , request := range []Upload {uploadEvilFileName , uploadEvilExtraFile } {
141+ payload , err := json .Marshal (request )
142+ require .NoError (t , err )
143+
144+ resp , err := http .Post (ts .URL , "encoding/json" , bytes .NewBuffer (payload ))
145+ require .NoError (t , err )
146+ require .Equal (t , http .StatusBadRequest , resp .StatusCode )
147+
148+ body , err := io .ReadAll (resp .Body )
149+ require .NoError (t , err )
150+ require .Contains (t , string (body ), "unsafe path join" )
151+ }
152+ }
0 commit comments