Skip to content

Navigation Menu

Sign in
Sign up

docs(troubleshooting): explain the audit-module antivirus false positive - #3348

Open
github-actions[bot] wants to merge 1 commit into
main from
autofix/issue-3347
Open

docs(troubleshooting): explain the audit-module antivirus false positive #3348
github-actions[bot] wants to merge 1 commit into
main from
autofix/issue-3347

Conversation

@github-actions

@github-actions github-actions Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

A user's antivirus quarantined a file inside their GAIA install and told them GAIA was an infostealer, with nothing in our docs to say otherwise — a genuinely alarming experience with no way to self-check. It was a false positive on GAIA's own skill auditor: that module has to name the things a credential stealer targets (~/.ssh, .aws/credentials, browser cookie stores, base64.b64decode) in order to detect them, so its compiled bytecode reads like the thing it catches. Anyone who hits this now finds a troubleshooting section that names the false positive, gives them a one-line integrity check that proves their install is byte-identical to the published wheel, and — importantly — tells them when not to add an exclusion because something really was modified.

No source change: the flagged artifact is a local bytecode cache, the wheel ships no __pycache__, and the reporter verified the source file matches its published hash. Rewriting the detector's vocabulary to dodge a proprietary heuristic would be unverifiable and would weaken the auditor.

Closes #3347

Test plan

  • python util/lint.py --all shows no new failures (the one Import Validation error reproduces on a clean main)
  • Docs build: the new section renders and the #av-false-positive anchor resolves from the "Antivirus interference" cross-link
  • Run the integrity one-liner on a real wheel install and confirm it prints modified files: none:
    ~/.gaia/venv/bin/python -c "import base64,csv,hashlib,pathlib,sysconfig; ..." (copy from the doc)
  • Windows: the PowerShell variant runs as written against %USERPROFILE%\.gaia\venv\Scripts\python.exe
🔍 Technical details

Root cause. src/gaia/skills/audit/code.py is the AST analyser behind the skill-audit gate. Its rule tables are the trigger:

  • _CREDENTIAL_PATTERNS (code.py:543-557) — \.ssh/, id_rsa, \.aws/credentials, \.netrc, \.git-credentials, Login Data|Cookies|key4\.db|logins\.json
  • _DECODERS (code.py:565-583) — base64.b64decode, zlib.decompress, binascii.unhexlify, ...
  • _BUILTIN_SINKS (code.py:519) — eval, exec, compile, __import__

Compiled into one .pyc, that is an infostealer's target list plus its unpacking primitives. Generic.PY.SordealStealer is a Python-bytecode heuristic matching the detector's own vocabulary.

The reported path ended in .pyc.2586770202400 — CPython's _write_atomic temp name (<pyc>.<id(path)>), written locally on first import. setup.py ships gaia.skills.audit as source only; no __pycache__ is in the wheel, so the flagged file was never downloaded.

Change. One new section in docs/reference/install-troubleshooting.mdx (anchor #av-false-positive), plus a one-line pointer to it from the existing "Antivirus interference" subsection, which covers a different symptom (install hangs) and was the wrong landing spot.

Verification of the doc's integrity command. The one-liner walks the RECORD manifest and recomputes each file's unpadded urlsafe-base64 SHA-256. Exercised verbatim two ways: against a real installed dist-info (prints modified files: none), and against a synthetic dist-info whose file was then edited (prints modified files: ['gaia/code.py']) — so it detects tampering rather than always passing.

Validation limits. Docs-only, no Python touched. util/lint.py --all Python checks pass (black, isort, pylint, flake8, bandit); the single Import Validation error reproduces with the change stashed, so it is pre-existing. The unit suite could not run in this environment — gaia is not installed here, so all 340 collections error on ModuleNotFoundError: No module named 'gaia' on a clean tree as well.

Deliberately not done. Restructuring the rule tables into a data file to keep those strings out of the bytecode. It would be a refactor of a security-gate module, chasing a closed-source heuristic with no way to confirm the result. The durable fix is a vendor false-positive submission.

Bitdefender's Generic.PY.SordealStealer heuristic fires on the bytecode
cache of gaia/skills/audit/code.py, whose rule tables necessarily name
the credential paths and decoder calls an infostealer targets. Add a
troubleshooting section that identifies the detection as a false
positive, gives users a RECORD-based integrity check they can run
themselves, and separates 'add an exclusion' from 'you were actually
tampered with'.
Closes #3347 
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Reviewers

@kovtcharov-amd kovtcharov-amd Awaiting requested review from kovtcharov-amd kovtcharov-amd is a code owner

Assignees

No one assigned

Labels

None yet

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

appartently a bitdefender false positive : Generic.PY.SordealStealer

0 participants

AltStyle によって変換されたページ (->オリジナル) /