onuri/labs
download →

docs · onuri antivirus v1.0.12345

Documentation.

Everything you need to scan, configure and extend Onuri Antivirus.

Quick start

Install the app from the download page, or build the CLI from source, then point it at a repository:

terminal
$ cargo build --release
$ ./target/release/onuri repo scan ~/code/my-project

Onuri walks the working tree (respecting .gitignore and .onuriignore), then every commit in history, then every dependency in your lockfiles.

CLI reference

onuri --help
onuri repo scan [PATH]         scan a repo (default .)
    --json | --sarif | --format human|json|sarif
    -o, --output FILE           write report to a file
    --no-history                working tree only
    --offline                   no OSV.dev / registry lookups
    --max-commits N             cap the history walk
    --fail-on low|medium|high|critical|never   (default low)
onuri rules list               active rules (built-in + yours)
onuri rules check FILE         validate a rule file
onuri config path | show       where config lives / effective config
Exit codeMeaning
0Clean
1Findings at or above --fail-on
2Error

Findings

Every finding carries:

  • id — a stable ONR-xxxxxxxxxxxx identifier that stays the same across runs
  • severity — critical high medium low
  • category, path, line / column
  • reason and fix — what's wrong and what to do
  • a redacted snippet — secrets are never printed in full
  • for history findings, commit {id, author, email, date, summary}

Configuration

Configuration lives in your per-user config directory, never inside a project, so a scanned repo, or an AI agent working in it, can't change how it's scanned.

OSPath
macOS~/Library/Application Support/com.onuri.Onuri/config.toml
Linux~/.config/onuri/config.toml
config.toml
[limits]
max_file_size = 209715200     # 200 MB
max_archive_depth = 3
max_decompress_ratio = 100

[repo]
scan_history = true
max_commits = 0               # 0 = all
trusted_authors = ["me@example.com", "*@mycompany.com"]
warn_unsigned_commits = false
entropy_base64 = 4.5
entropy_hex = 3.0
online = true                 # OSV.dev + registry existence checks
disabled_rules = []

Writing rules

Add your own rules as *.toml files in <config dir>/rules/. A rule with the same id as a built-in replaces it.

rules/acme.toml
version = 1

[[rule]]
id            = "acme-api-key"           # unique, kebab-case
name          = "ACME API key"
category      = "secret"                 # secret | obfuscation | exfiltration | tamper | config
severity      = "high"                   # critical | high | medium | low
regex         = '''\b(acme_[a-z0-9]{32})\b'''
secret_group  = 1                        # capture group holding the secret
keywords      = ["acme_"]                # cheap lowercase prefilter
min_entropy   = 3.0                      # optional
allow         = ['''acme_0{32}''']       # optional: placeholders to ignore
paths         = ["**/*.py"]              # optional glob filter
exclude_paths = ["**/tests/**"]          # optional glob filter
fix           = "Revoke the key in the ACME dashboard and rotate."

Validate it before use:

$ onuri rules check my-rules.toml

Built-in checks

Alongside 30 pattern rules for common secrets, Onuri runs these structural checks:

AreaChecks
Secretsgeneric-high-entropy
Obfuscationtrojan-source-bidi invisible-unicode homoglyph-identifier minified-source
Hygieneenv-file-committed env-file-in-history gitignore-missing gitignore-missing-entry
Historyuntrusted-author unsigned-commit tamper-history
Tampernpm-install-script workflow-pwn-request workflow-script-injection workflow-unpinned-action git-hook-present build-script-suspicious
Dependenciesosv-malicious-package osv-vulnerable typosquat package-not-found

Suppressing findings

Put an .onuriignore file at the repo root. It uses gitignore-style globs, optionally scoped to one rule:

.onuriignore
vendor/**
generic-high-entropy:tests/fixtures/**

Or suppress inline, on the flagged line or the line above:

python
TEST_KEY = "..."  # onuri:ignore generic-high-entropy

GitHub code scanning

Emit SARIF and upload it, and findings appear in the Security tab and inline on pull requests:

.github/workflows/onuri.yml
- run: onuri repo scan . --sarif -o onuri.sarif --fail-on never
- uses: github/codeql-action/upload-sarif@v3
  with: { sarif_file: onuri.sarif }
Need help? Email support@onurilabs.com or see support.