Skip to content

Guard against PowerShell $home variable footgun causing user profile deletion #3098

@DamianEdwards

Description

@DamianEdwards

Summary

PowerShell's variable names are case-insensitive, so a seemingly local variable named $home resolves to the built-in read-only $HOME variable. When a generated or agent-authored script intends to use $home as a scratch path and then runs cleanup such as Remove-Item -Recurse -Force $home, PowerShell can target the user's real profile directory instead of the intended temporary directory.

I've now seen this pattern multiple times in agent-generated PowerShell. In one case during Copilot CLI hook testing, this command shape attempted to remove content from the user profile before the process was stopped:

$home = 'C:\Users\name\.copilot\session-state\...\files\copilot-home-hooks'
if (Test-Path $home) { Remove-Item -Recurse -Force $home }

Because $HOME is read-only, assignment failed, but subsequent references still pointed at the real home directory. That creates a high-risk corrupted-profile failure mode.

Why this matters

Copilot CLI frequently generates PowerShell for Windows users. $home is a natural variable name for directories like app home, tool home, temp home, or Copilot home. In PowerShell this is a dangerous footgun because it aliases the built-in $HOME variable by case-insensitive lookup.

Suggested mitigations

  • Add a Copilot CLI/system instruction for PowerShell generation: never use $home as a user-defined variable; use names like $userProfile, $homeDir, $copilotHomePath, or $targetRoot instead.
  • Add a safety rule or lint-like guard before destructive PowerShell commands when the target variable is $home/$HOME.
  • Consider warning or requiring confirmation when generated PowerShell combines $home with destructive recursive operations such as Remove-Item -Recurse.

This is especially important for autonomous/remote sessions where a user may not see the exact command before damage occurs.

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:platform-windowsWindows-specific: PowerShell, cmd, Git Bash, WSL, Windows Terminalarea:toolsBuilt-in tools: file editing, shell, search, LSP, git, and tool call behavior
    No fields configured for Feature.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions