# Antivirus Detections `RackStack.exe` is periodically flagged by machine-learning and heuristic antivirus engines. These are false positives. This page explains why they happen, how to **prove for yourself** that the binary you hold is the genuine published release, and what to do about the alert. If you arrived here from a VirusTotal result or a quarantine notification, start with [Verify what you have](#verify-what-you-have). --- ## Table of Contents - [Why it happens](#why-it-happens) - [Verify what you have](#verify-what-you-have) - [Telling a false positive from a real problem](#telling-a-false-positive-from-a-real-problem) - [Restoring from quarantine](#restoring-from-quarantine) - [Avoiding it entirely: run the script](#avoiding-it-entirely-run-the-script) - [Reporting a new detection](#reporting-a-new-detection) --- ## Why it happens Two properties of RackStack combine to score badly with behavioral and static ML classifiers. Both are inherent to what the tool is and does. | Property | Why a classifier dislikes it | |---|---| | **The EXE is not Authenticode-signed** | No publisher reputation exists to offset a heuristic score. Code-signing certificates that would fix this require a validated legal entity, which this project does not have. | | **It manages Defender exclusions and services** | RackStack applies Microsoft's own published antivirus exclusion recommendations for Hyper-V, Failover Clustering, and iSCSI/SAN workloads, and can disable optional Windows services. An unsigned binary whose contents mention antivirus exclusions is, to a classifier, the textbook opening move of a dropper. | A third property was removed in v1.123.0. Releases through v1.122.4 were produced by [ps2exe](https://github.com/MScholtes/PS2EXE), which wraps a script in its own PowerShell host implementation. That wrapper is widely reused by malware droppers, so every build scored as a packed script host regardless of the script's content: detections carried `MSIL`, `assembly`, and generic packer labels, a cleared hash was re-flagged within weeks, and the same file drifted from 8 to 19 VirusTotal detections without changing a byte. The EXE is now a small launcher, compiled with the C# compiler that ships inside Windows, that starts Windows PowerShell's own console host and runs the script from an embedded plain-text resource. See [`dist/launcher/`](../dist/launcher/). The most common result is a **behavioral** detection such as `Behavior:Win32/DefenseEvasion.A!ml`, which fires on what the running process *does* — not on the file matching anything known. Static ML verdicts such as `Trojan:Win32/Wacatac.B!ml` come from the same combination of features. New releases are also **low-prevalence** files, which raises heuristic scores until download history accumulates. --- ## Verify what you have Do this first. It settles the question independently of any antivirus verdict. ```mermaid flowchart TD A[Antivirus alert on RackStack.exe] --> B[Compute the SHA-256 hash] B --> C{Does it match release-hashes.txt
for that version?} C -->|Yes| D[Genuine published build] C -->|No| E[STOP - do not run it] D --> F{Do the cosign signature and
SLSA provenance verify?} F -->|Yes| G[Confirmed authentic
Treat the alert as a false positive] F -->|No| E E --> H[Re-download from the GitHub release
and report it] G --> I[Restore from quarantine, or
run the .ps1 instead] ``` ### 1. Hash ```powershell (Get-FileHash RackStack.exe -Algorithm SHA256).Hash.ToLower() ``` Compare against `release-hashes.txt`, attached to [every release](https://github.com/TheAbider/RackStack/releases). The same hash also appears as `InstallerSha256` in the winget manifest under [`dist/winget/`](../dist/winget/). ### 2. Build provenance This proves the binary was produced by a specific public CI run, from a specific commit, in this repository — something malware repackaged by a third party cannot reproduce. ```powershell gh attestation verify RackStack.exe --owner TheAbider ``` ### 3. Sigstore signature ```powershell cosign verify-blob ` --certificate RackStack.exe.pem ` --signature RackStack.exe.sig ` --certificate-identity-regexp "^https://github.com/TheAbider/RackStack/.github/workflows/ci.yml@refs/heads/master$" ` --certificate-oidc-issuer https://token.actions.githubusercontent.com ` RackStack.exe ``` Every release also ships a CycloneDX SBOM. There is no manual or local step anywhere in the release path — the published EXE is built entirely in GitHub-hosted CI from the public source in this repository, and the monolithic `.ps1` it embeds is published in the same release so you can read exactly what the EXE does. --- ## Telling a false positive from a real problem If the hash matches and the attestations verify, the binary is authentic and any detection is a false positive by definition — whatever it does, it is what the public source does. When reading a VirusTotal result, the *pattern* of detections matters more than the count: **Consistent with a false positive** - Verdicts are generic ML labels — `*.!ml`, `ML.Attribute.*`, `Static AI`, `*.ml.score`, `Malicious (high Confidence)`, `Artemis!`, `Trojan.MSIL.Gen.*` - Major engines are silent — Kaspersky, ESET, BitDefender, Sophos, Avast/AVG, Malwarebytes, Fortinet, Google, CrowdStrike - The "popular threat label" names a specific malware family that does not match the file's actual architecture. This label is chosen by clustering the family strings that detecting engines report, so a handful of low-tier engines bucketing every unsigned .NET binary into one generic family is enough to produce a frightening headline. **Worth taking seriously** - Multiple major engines agree on a specific named family - The hash does not match `release-hashes.txt` - `gh attestation verify` or `cosign verify-blob` fails - The file did not come from the GitHub release, PowerShell Gallery, Scoop, Chocolatey, or winget --- ## Restoring from quarantine Only after you have verified the hash and attestations above. If the tool was quarantined **mid-run**, some configuration may have been applied and some not. Check the action history and undo state before continuing: ``` %ProgramData%\RackStack\state\ ``` Then restore and exclude, from an elevated PowerShell session: ```powershell # See what was quarantined Get-MpThreat | Select-Object ThreatName, Resources # Restore it (substitute the ThreatName reported above) & "$env:ProgramFiles\Windows Defender\MpCmdRun.exe" -Restore -Name "Behavior:Win32/DefenseEvasion.A!ml" # Exclude the location you run it from Add-MpPreference -ExclusionPath 'C:\Path\To\RackStack.exe' ``` > Adding an antivirus exclusion reduces your security posture. Scope it to the specific file > path, not a whole drive, and remove it when you are finished. --- ## Avoiding it entirely: run the script The monolithic `RackStack v{version}.ps1` published in every release is the *same code* the EXE embeds. It is unpacked, it is cosign-signed like every other release artifact, and it is never scored by the PE classifiers that produce these detections. ```powershell Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process & '.\RackStack v{version}.ps1' # substitute the version you downloaded ``` The PowerShell Gallery module (`Install-Module RackStack`) is another script-based route that avoids the executable entirely. If antivirus alerts are a recurring problem in your environment, prefer one of these. --- ## Reporting a new detection False-positive clearances granted by antivirus vendors are **per file hash**, so a detection can reappear on a new release even after a previous one was cleared. Reports are genuinely useful. Please [open an issue](https://github.com/TheAbider/RackStack/issues) with: - The RackStack version and the SHA-256 you computed - The engine and the exact detection name - Whether it was a static scan or fired while the tool was running - A VirusTotal link if you have one Detections are disputed with the vendors as they are reported, with the build provenance and public source attached as evidence. --- ## Related - [Security Policy](../SECURITY.md) — release verification and vulnerability reporting - [Troubleshooting](Troubleshooting.md) — operational issues