Reduce antivirus false positives: embed full Windows manifests + AV docs#8
Merged
Conversation
…tives Kaspersky was closing the running main app after the Cursor-agent feature landed. A multi-agent audit plus VirusTotal scans of every shipped binary confirmed there is NO malicious or evasion code (no packing/injection/AMSI tricks): the main app is statically clean (0/75 — Kaspersky's own engine included). The detection is purely behavioral/reputation — an unsigned binary, recompiled fresh on each user's PC (so a brand-new hash every time = zero reputation), that spawns a hidden node.exe child opening SSH/network. Honest hardening only (deliberately no packing/encryption/obfuscation): - Embed a COMPLETE Windows application manifest in the main app and the installer. Tauri's built-in default ships only a Common-Controls dependency (no trustInfo/asInvoker, no supportedOS, no DPI awareness), leaving the shipped exes with a bare, identity-less manifest — part of the suspicious profile. New src-tauri/app.manifest and installer/app.manifest declare a clear identity, asInvoker (never requireAdministrator), the Win7-11 supportedOS GUIDs, PerMonitorV2 DPI and long-path support, wired through each build.rs via WindowsAttributes::app_manifest. Verified it embeds and builds clean on the GNU toolchain users compile with (and on MSVC in CI). - User-facing antivirus guidance where users actually hit it: a callout in README.md and a note in the installer release page, both with the SmartScreen "Run anyway" + Kaspersky exclusion + false-positive-report steps. - installer/ANTIVIRUS.md: full diagnosis, fresh 75-engine VirusTotal numbers, the ML-verdict-variance finding (scores wander both directions across rebuilds of identical source), why per-user self-signed certs don't help, and the genuinely-free durable path (SignPath Foundation for OSS). - installer-release.yml also carries an optional Authenticode signing step (no-op unless a WINDOWS_SIGN_PFX_BASE64 secret is set) — the durable remedy. Per the maintainer's choice this keeps the clone+compile model and relies on the free Kaspersky exclusion + FP-report route documented above. The branch's other in-progress work (hooks, voice, bench, the single-exe stub) is left uncommitted and intentionally out of this PR. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
A user reported Kaspersky closing the running app after the Cursor-agent feature landed. Investigation this session (a multi-agent code audit + VirusTotal scans of every shipped binary) confirmed:
node.exechild (the Cursor agent) opening SSH/network.The durable remedy is code signing — but clone+compile makes the per-user-compiled main app unsignable, so per the maintainer's choice this keeps clone+compile and ships honest hardening + a free user-side mitigation route (Kaspersky exclusion / false-positive report).
What changed (this session — commit
fa05ab8)Common-Controlsdependency (notrustInfo/asInvoker, nosupportedOS, no DPI awareness), leaving the shipped exes with a bare, identity-less manifest. Newsrc-tauri/app.manifestandinstaller/app.manifestdeclare a clear identity,asInvoker(neverrequireAdministrator), the Win7–11supportedOSGUIDs,PerMonitorV2DPI and long-path support — wired through eachbuild.rsviaWindowsAttributes::app_manifest.README.mdand a note on the installer release page (installer-release.yml), both with SmartScreen "Run anyway" + Kaspersky exclusion + FP-report steps.installer/ANTIVIRUS.md: full diagnosis, fresh 75-engine VirusTotal numbers, the ML-verdict-variance finding, why per-user self-signed certs don't help, and the free durable path (SignPath Foundation for OSS).installer-release.ymlalso carries an optional Authenticode signing step (no-op unless aWINDOWS_SIGN_PFX_BASE64secret is set).Also in this branch (prior commit
5d50705)This branch was already one commit ahead of
main: "Remove the old signed-NSIS-bundle installer + tauri-updater path" (deletesrelease.yml,src-tauri/installer/*.nsi/bmp, and thetauri-plugin-updaterwiring). It rides along in this PR since it's unmerged branch history.Testing
cargo +stable-x86_64-pc-windows-gnu build --release): both build clean and the PEs now carrytrustInfo/supportedOS/dpiAwareness(verified by inspecting the resource section); version info intact.Reviewer notes
build.rs, two manifests, and docs.🤖 Generated with Claude Code