Skip to content

Commit ffe69c0

Browse files
authored
PR #622: security fixes for v1.3.2
* test: alter LimitExtractPath to check for file/dir collision * fix: disallow traversal when file and base dir share name * fix: use random file name for writing asciitrans tar entries * fix: add dir separator to base dir if missing
1 parent dad484e commit ffe69c0

File tree

3 files changed

+11
-3
lines changed

3 files changed

+11
-3
lines changed

src/ICSharpCode.SharpZipLib/Tar/TarArchive.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -824,7 +824,7 @@ private void WriteEntryCore(TarEntry sourceEntry, bool recurse)
824824
{
825825
if (!IsBinary(entryFilename))
826826
{
827-
tempFileName = Path.GetTempFileName();
827+
tempFileName = Path.GetRandomFileName();
828828

829829
using (StreamReader inStream = File.OpenText(entryFilename))
830830
{

src/ICSharpCode.SharpZipLib/Zip/WindowsNameTransform.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using ICSharpCode.SharpZipLib.Core;
22
using System;
33
using System.IO;
4+
using System.Runtime.InteropServices;
45
using System.Text;
56

67
namespace ICSharpCode.SharpZipLib.Zip
@@ -133,7 +134,14 @@ public string TransformFile(string name)
133134
{
134135
name = Path.Combine(_baseDirectory, name);
135136

136-
if (!_allowParentTraversal && !Path.GetFullPath(name).StartsWith(_baseDirectory, StringComparison.InvariantCultureIgnoreCase))
137+
// Ensure base directory ends with directory separator ('/' or '\' depending on OS)
138+
var pathBase = Path.GetFullPath(_baseDirectory);
139+
if (pathBase[pathBase.Length - 1] != Path.DirectorySeparatorChar)
140+
{
141+
pathBase += Path.DirectorySeparatorChar;
142+
}
143+
144+
if (!_allowParentTraversal && !Path.GetFullPath(name).StartsWith(pathBase, StringComparison.InvariantCultureIgnoreCase))
137145
{
138146
throw new InvalidNameException("Parent traversal in paths is not allowed");
139147
}

test/ICSharpCode.SharpZipLib.Tests/Zip/FastZipHandling.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -474,7 +474,7 @@ public void LimitExtractPath()
474474
tempPath = Path.Combine(tempPath, uniqueName);
475475
var extractPath = Path.Combine(tempPath, "output");
476476

477-
const string contentFile = "content.txt";
477+
const string contentFile = "output.txt";
478478

479479
var contentFilePathBad = Path.Combine("..", contentFile);
480480
var extractFilePathBad = Path.Combine(tempPath, contentFile);

0 commit comments

Comments
 (0)