Create parent directories only after the containment check in InstallHelper.TryExtractToDirectory

Abierto Apto para principiantes
#2,056 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
78/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
csharp
Área
security

Línea de trabajo

Comienza en src/code/InstallHelper.cs, en InstallHelper.TryExtractToDirectory, alrededor de la lógica de creación de directorios y comprobación de contención. Sigue cómo entry.FullName se convierte en destinationPath y verifica que la contención se compruebe antes de cualquier efecto secundario de directorio o archivo. El trabajo estará terminado cuando las entradas rechazadas por la comprobación de contención no dejen ningún directorio, mientras que las entradas válidas sigan extrayéndose normalmente.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

Summary of the new feature / enhancement

During package extraction, entry-derived parent directories are created before the path-containment decision runs. An entry whose file write the containment check would reject can still leave empty directories outside the extraction root (directory-only effect — no file content is written outside). As a user, I want each entry's extraction side effects to be all-or-nothing, so a malformed package cannot leave stray directories anywhere on disk.

Proposed technical implementation details

In src/code/InstallHelper.cs, TryExtractToDirectory (~L1299 on current main):

  • For entries containing a path separator, Directory.CreateDirectory(Path.Combine(extractPath, parentDirs)) runs first (~L1372-1377), using the raw entry prefix.
  • Only afterwards is destinationPath = Path.GetFullPath(Path.Combine(extractPath, entry.FullName)) computed and the StartsWith(extractPath) containment verified (~L1381-1386) — and that check gates only the ExtractToFile call (~L1388).

So a package containing an entry such as ../../../../empty/dir/x (this loop is reached on installs from HTTP repositories, which do not go through a BCL extraction up front) creates empty/dir relative to the extraction temp directory as empty directories, and then the file write is skipped by the containment check.

Suggested reordering, so containment gates every side effect:

  1. Compute destinationPath = Path.GetFullPath(Path.Combine(extractPath, entry.FullName)) first.
  2. Verify containment of destinationPath under extractPath.
  3. Only then create Path.GetDirectoryName(destinationPath) and call ExtractToFile.
  4. Skip entries that fail containment entirely — no partial side effects.

This also makes directory creation consistent with the resolved path rather than the raw entry string.

Lenguaje dominante
C#
Estrellas
576
Forks
114
Merge medio
23 h 17 min
PR fusionados (30 d)
8

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de PowerShell/PSResourceGet

Todos los issues de PowerShell/PSResourceGet

Issues similares

Más issues de C#

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.