Skip to content

uv.exe in hermes/bin flagged as malware (Malware.AI / Trojan ...!ml) — false positive #48411

Description

@RubenAQuispe

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    P3Low — cosmetic, nice to havecomp/cliCLI entry point, hermes_cli/, setup wizardpython:uvPull requests that update python:uv codesweeper:implemented-on-mainSweeper: behavior already present on current maintype/docsDocumentation improvements

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions