Heads up for anyone whose AV quarantines uv.exe out of the hermes bin folder (C:\Users<you>\AppData\Local\hermes\bin\uv.exe).
Bitdefender flags it as Malware.AI., Defender calls it Trojan:Script/Phonzy.A!ml, a couple other ML engines hit it too. It's a false positive. That exe is Astral's uv, the Rust Python package manager Hermes bundles to manage its Python env. The ML engines trip on it because it's an unsigned Rust binary that goes and installs packages, and there's a pile of upstream reports saying the same thing:
If you want to confirm your own copy before you exclude it, you can. You need the GitHub CLI (winget install --id GitHub.cli, then gh auth login). Then:
$uv = "$env:LOCALAPPDATA\hermes\bin\uv.exe"
$ver = (& $uv --version).Split(' ')[1]
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$zip = "$env:TEMP\uv.zip"
Invoke-WebRequest "https://github.com/astral-sh/uv/releases/download/$ver/uv-x86_64-pc-windows-msvc.zip" -OutFile $zip -UseBasicParsing
gh attestation verify $zip --repo astral-sh/uv
Expand-Archive $zip "$env:TEMP\uv_x" -Force
(Get-FileHash "$env:TEMP\uv_x\uv.exe").Hash -eq (Get-FileHash $uv).Hash
One thing that'll trip you up: verify the zip, not the loose exe. Running gh attestation verify against the extracted uv.exe gives you a 404. That's not a failure, Astral just attests the release archive, not the unpacked binary. So verify the zip, then the last line checks your exe against the one inside it.
If the attestation says "Verification succeeded" and that last line prints True, you're good. Exclude the folder, not the file hash, since Hermes updates uv and the hash changes every version:
Add-MpPreference -ExclusionPath "$env:LOCALAPPDATA\hermes\bin"
Bitdefender users add the exception in the Bitdefender console (Protection > Antivirus > Settings > Manage Exceptions), the Defender command won't touch it.
Heads up for anyone whose AV quarantines uv.exe out of the hermes bin folder (C:\Users<you>\AppData\Local\hermes\bin\uv.exe).
Bitdefender flags it as Malware.AI., Defender calls it Trojan:Script/Phonzy.A!ml, a couple other ML engines hit it too. It's a false positive. That exe is Astral's uv, the Rust Python package manager Hermes bundles to manage its Python env. The ML engines trip on it because it's an unsigned Rust binary that goes and installs packages, and there's a pile of upstream reports saying the same thing:
uvinstaller as malicious on Windows astral-sh/uv#10079If you want to confirm your own copy before you exclude it, you can. You need the GitHub CLI (winget install --id GitHub.cli, then gh auth login). Then:
$uv = "$env:LOCALAPPDATA\hermes\bin\uv.exe"
$ver = (& $uv --version).Split(' ')[1]
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$zip = "$env:TEMP\uv.zip"
Invoke-WebRequest "https://github.com/astral-sh/uv/releases/download/$ver/uv-x86_64-pc-windows-msvc.zip" -OutFile $zip -UseBasicParsing
gh attestation verify $zip --repo astral-sh/uv
Expand-Archive $zip "$env:TEMP\uv_x" -Force
(Get-FileHash "$env:TEMP\uv_x\uv.exe").Hash -eq (Get-FileHash $uv).Hash
One thing that'll trip you up: verify the zip, not the loose exe. Running gh attestation verify against the extracted uv.exe gives you a 404. That's not a failure, Astral just attests the release archive, not the unpacked binary. So verify the zip, then the last line checks your exe against the one inside it.
If the attestation says "Verification succeeded" and that last line prints True, you're good. Exclude the folder, not the file hash, since Hermes updates uv and the hash changes every version:
Add-MpPreference -ExclusionPath "$env:LOCALAPPDATA\hermes\bin"
Bitdefender users add the exception in the Bitdefender console (Protection > Antivirus > Settings > Manage Exceptions), the Defender command won't touch it.