Change path breakout detection logic in archive package
Fixes #9375 Signed-off-by: Alexandr Morozov <lk4d4@docker.com> Conflicts: integration-cli/docker_cli_cp_test.go removed extra test
This commit is contained in:
		
							parent
							
								
									cd74be68b8
								
							
						
					
					
						commit
						5ce91364b3
					
				
					 2 changed files with 13 additions and 8 deletions
				
			
		|  | @ -473,10 +473,13 @@ loop: | |||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		// Prevent symlink breakout | ||||
| 		path := filepath.Join(dest, hdr.Name) | ||||
| 		if !strings.HasPrefix(path, dest) { | ||||
| 			return breakoutError(fmt.Errorf("%q is outside of %q", path, dest)) | ||||
| 		rel, err := filepath.Rel(dest, path) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		if strings.HasPrefix(rel, "..") { | ||||
| 			return breakoutError(fmt.Errorf("%q is outside of %q", hdr.Name, dest)) | ||||
| 		} | ||||
| 
 | ||||
| 		// If path exits we almost always just want to remove and replace it | ||||
|  |  | |||
|  | @ -81,12 +81,14 @@ func UnpackLayer(dest string, layer ArchiveReader) error { | |||
| 		} | ||||
| 
 | ||||
| 		path := filepath.Join(dest, hdr.Name) | ||||
| 		base := filepath.Base(path) | ||||
| 
 | ||||
| 		// Prevent symlink breakout | ||||
| 		if !strings.HasPrefix(path, dest) { | ||||
| 			return breakoutError(fmt.Errorf("%q is outside of %q", path, dest)) | ||||
| 		rel, err := filepath.Rel(dest, path) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		if strings.HasPrefix(rel, "..") { | ||||
| 			return breakoutError(fmt.Errorf("%q is outside of %q", hdr.Name, dest)) | ||||
| 		} | ||||
| 		base := filepath.Base(path) | ||||
| 
 | ||||
| 		if strings.HasPrefix(base, ".wh.") { | ||||
| 			originalBase := base[len(".wh."):] | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue