Clear an antivirus false positive¶
If your build was rejected with a message like:
Flagged by 8 of 66 AV engines. This is often a false positive on packed
Python apps - see https://docs.pylocket.com/part-2-how-to/av-false-positive/
to get your app allowlisted. SHA-256: b0558df4...
this page explains why it happens and how to get the detection removed at the source.
The fastest permanent fix is a code-signing certificate
A false-positive report clears one build. A code-signing certificate stops the detections happening in the first place, for every build you ever ship. If you only do one thing, do that one. See Code Signing and Replace with Signed Package.
Why this happens¶
A PyInstaller (or cx_Freeze, or Briefcase) executable bundles a Python interpreter plus your compressed bytecode into a single file that unpacks itself at launch. Structurally, that is exactly what a malware packer does. Machine-learning engines are trained to flag that shape, so they flag the packaging, not your code.
You can usually spot a heuristic guess by its detection name:
| Detection name | What it means |
|---|---|
Trojan:Win32/Wacatac.B!ml |
The !ml suffix means a machine-learning verdict, not a signature match. Wacatac is a generic bucket that packed Python apps land in constantly. |
W32.AIDetectMalware, Malicious, Unsafe, confidence 60% |
Generic ML labels with no specific malware family behind them. |
Gen:Variant.*, Trojan.Generic.* |
Generic heuristic families rather than an identified sample. |
A detection naming a specific family with no !ml or Gen: marker is worth a second look
before you file a dispute. Make sure your build machine is clean and that no dependency has been
compromised.
Before you file¶
Every vendor asks for roughly the same things. Collect them once:
- The SHA-256 of the exact file. PyLocket puts it at the end of the rejection message on the
build row. You can also get it locally with
shasum -a 256 <file>(macOS/Linux) orcertutil -hashfile <file> SHA256(Windows). - The exact detection name that vendor used. Not the count, the string. On a Pro plan, PyLocket lists this per engine on the rejected build. Vendors will ask "what did we call it?" and a generic answer slows the dispute down.
- The file itself, or a link to it. Most vendors accept an upload.
- Who you are. Company or publisher name, product name, product website. Submitting as a software vendor rather than an end user routes the ticket to a different, faster queue at several vendors.
- One sentence on what the app does. "Commercial desktop application for X, distributed to paying customers, packaged with PyInstaller and protected with PyLocket."
Where to find the engine names
The per-engine breakdown on a rejected build is a Pro feature, because it is what makes a dispute actionable. On the free tier you still get the detection count, the SHA-256 and this guide. You can also read the per-engine list for any file directly on virustotal.com by searching its SHA-256.
Where to submit¶
Start with Microsoft. Defender ships on every Windows machine, so a single Microsoft reclassification usually helps more end users than every other vendor combined.
| Vendor | Where to submit | Notes |
|---|---|---|
| Microsoft Defender | microsoft.com/en-us/wdsi/filesubmission | Choose Software Developer as the submission type, then Incorrectly detected as malware/malicious. Highest impact by a wide margin. |
| Zillya | support@zillya.com, or the upload form at zillya.com/support |
Accepts attachments up to 50 MB. |
| Avast / AVG | avast.com/report-false-positive | Asks for your email, the detection name and the file. |
| Bkav | fpreport@bkav.com |
Use the subject line False Positive: file being detected by a Bkav product. |
| SecureAge APEX | secureage.com/contact-us | Their form is oriented toward CatchPulse customers, so include your publisher details and make clear you are the software vendor. |
For any engine not listed above, there are two reliable routes:
- Look the vendor up in the community-maintained False Positive Center, which collects submission addresses and forms for most VirusTotal engines.
- Open your file's page on VirusTotal, find the engine in the detections list, and use the vendor contact details VirusTotal publishes for it.
Verify the address before you send
Antivirus vendors change their submission endpoints fairly often, and several of the smaller ones have no stable public form. If an address above bounces, use the VirusTotal route rather than guessing, and please tell us so we can correct this page.
What to expect¶
- Turnaround is typically 1 to 5 business days. Microsoft is often within 24 to 72 hours.
- The fix is per-file. A cleared detection applies to that exact SHA-256. Your next build is a different file and can be flagged again, which is why the certificate matters more than the dispute.
- Detections can come back after a vendor retrains a model. This is normal and not a sign something is wrong with your app.
Getting your build through in the meantime¶
PyLocket rejects an upload only when a meaningful share of the engines that actually returned a verdict flag it, so a handful of heuristic detections will not block you. If your build was rejected and you believe it is a false positive:
- Sign the binary and upload the signed copy. See Replace with Signed Package. This is the highest-value action.
- Re-upload after a vendor clears the detection. The scan runs again on upload, against the current verdicts.
- Contact support@pylocket.com with the build ID and the SHA-256 if you are confident the detection is wrong and it is blocking a release. We can review the scan and re-run the build.
Reducing detections on future builds¶
- Use a code-signing certificate, and prefer an EV certificate if you can. Reputation accumulates against the signing identity, so detections fall off over time across all your builds rather than one at a time.
- Keep a stable publisher identity. Changing certificates resets the reputation you have built.
- Avoid UPX compression. Extra packing on top of the PyInstaller bundle makes heuristics worse, not better.
- Ship consistently. An executable that appears once and vanishes looks more suspicious to reputation systems than one released on a predictable cadence.