@@ -212,8 +212,30 @@ func TestSymLinkMazeHardening(t *testing.T) {
212212 require .NoError (t , tw .Close ())
213213
214214 extractor := extract.Extractor {FS : & LoggingFS {}}
215- require .NoError (t , extractor .Tar (context .Background (), outputTar , targetDir .String (), nil ))
216- require .FileExists (t , targetDir .Join ("tmp" , "sym" ).String ())
215+ require .Error (t , extractor .Tar (context .Background (), outputTar , targetDir .String (), nil ))
216+ require .NoFileExists (t , targetDir .Join ("tmp" , "sym" ).String ())
217+ })
218+
219+ t .Run ("TarWithDoubleSymlinkToExternalPath" , func (t * testing.T ) {
220+ // Create target dir
221+ tmp := mkTempDir (t )
222+ targetDir := tmp .Join ("test" )
223+ require .NoError (t , targetDir .Mkdir ())
224+ fmt .Println ("TMP:" , tmp )
225+ fmt .Println ("TARGET DIR:" , targetDir )
226+
227+ // Make a tar archive with regular symlink maze
228+ outputTar := bytes .NewBuffer (nil )
229+ tw := tar .NewWriter (outputTar )
230+ tw .WriteHeader (& tar.Header {Name : "fake" , Mode : 0777 , Typeflag : tar .TypeDir })
231+ addTarSymlink (t , tw , "sym-maze" , tmp .String ())
232+ addTarSymlink (t , tw , "sym-maze" , "fake" )
233+ addTarSymlink (t , tw , "sym-maze/oops" , "/tmp/something" )
234+ require .NoError (t , tw .Close ())
235+
236+ extractor := extract.Extractor {FS : & LoggingFS {}}
237+ require .Error (t , extractor .Tar (context .Background (), outputTar , targetDir .String (), nil ))
238+ require .NoFileExists (t , tmp .Join ("oops" ).String ())
217239 })
218240
219241 t .Run ("TarWithSymlinkToExternalPathWithoutMazing" , func (t * testing.T ) {
0 commit comments