Overtrust is an AI-era workstation security scanner. Deterministic. No LLMs.
OVERTRUST │ Trust Score: 34/100 [████████░░░░░░░░░░░░░░░░] CRITICAL
───────────┼───────────────────────────────────────────────────────────────────
Scan Log │ Overview │ Findings (8)
───────────┤ ● 3 critical │ [CRIT] AWS credentials file [9.0]
.env │ ● 2 high │ [CRIT] Anthropic key in .env [9.0]
creds │ ● 1 medium │ [CRIT] Auth provider extension [9.5]
pkg.json │ ● 1 low │ [HIGH] Extension terminal access [8.0]
Dockerf.. │ │ [HIGH] SSH private key exposed [7.5]
✓ done │ Press v for graph │ [HIGH] Debug adapter [8.0]
───────────┴───────────────────────┴───────────────────────────────────────────
Detail
Rule: EXT-003 │ File: .vscode/extensions/ai-code-helper/package.json
Severity: CRITICAL │ Score: 9.5
Extension 'ai-code-helper' is an authentication provider
contributes.authentication — can intercept auth tokens
Linux / macOS
git clone https://github.com/cheese-cakee/overtrust.git
cd overtrust
cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j$(nproc)
./build/overtrustWindows
Tip
Install Visual Studio 2022 with the Desktop development with C++ workload, and CMake — tick "Add CMake to the system PATH" during install.
git clone https://github.com/cheese-cakee/overtrust.git
cd overtrust
cmake -B build -DCMAKE_BUILD_TYPE=Release -G "Visual Studio 17 2022"
cmake --build build --config Release -j
.\build\Release\overtrust.exe./build/overtrust # scan $HOME (TUI mode)
./build/overtrust /path/to/project # scan a specific directory
./build/overtrust demo/ # try the included demo fixtures
./build/overtrust --no-tui # headless JSON output to stdout
./build/overtrust --report out.json # write full JSON report to file
./build/overtrust --exit-code # exit 1 if any findings found (CI use)| Flag | Description |
|---|---|
<path> |
Directory to scan (default: $HOME) |
--no-tui |
Headless mode — prints findings as JSON to stdout |
--report <file> |
Write full JSON report to file after scan |
--exit-code |
Exit with code 1 if any findings exist (useful in CI) |
--version |
Print version and exit |
-h, --help |
Show usage |
Note
--no-tui is automatically activated when stdout is not a TTY (e.g. piped or redirected), making it safe to use in scripts and CI without extra flags.
| Category | What Overtrust Finds |
|---|---|
| IDE Extensions | Terminal access, auth providers, debug adapters, always-on activation |
| npm Packages | Preinstall/postinstall scripts, curl|bash patterns |
| Dockerfiles | Root containers, curl|bash RUN instructions |
| Secrets | AWS keys, GitHub tokens, Anthropic/OpenAI keys, Stripe, PEM certs |
| Credentials Files | ~/.aws/credentials, .env files, SSH private keys |
| Kubernetes | ~/.kube/config — may contain cluster credentials and bearer tokens |
| Shell History | .bash_history, .zsh_history — may contain secrets typed in plain text |
| Processes (Linux) | CAP_SYS_PTRACE, CAP_SYS_ADMIN, open sensitive file descriptors |
| Processes (Windows) | SeDebugPrivilege, SeTcbPrivilege, elevated tokens, dangerous privileges |
| AI Tools | Cursor, Copilot, Codeium and others running with access to your secrets |
| Key | Action |
|---|---|
↑ / k |
Previous finding |
↓ / j |
Next finding |
v |
Toggle graph view (overview ↔ trust graph canvas) |
r |
Re-scan |
e |
Export JSON report and exit |
? |
Toggle help overlay |
q |
Quit |
100 → 80 TRUSTED Green System looks clean
79 → 50 MODERATE Yellow Some risks, review findings
49 → 25 HIGH RISK Orange Significant exposure
24 → 0 CRITICAL Red Immediate action needed
Score = 100 - clamp(Σ(finding.score) × 2, 0, 100)
Create a .overtrustignore or .trustignore file in the scanned directory to skip paths:
# ignore local dev directories
.dev-secrets/
vendor/
my-test-env/
Lines starting with # are comments. Both file/directory names and path substrings are matched.
The demo/ directory ships with intentionally bad configs — a ready-made target for testing:
./build/overtrust demo/
# Expected trust score: ~0–15 (Critical)| Fixture | What it triggers |
|---|---|
demo/.vscode/extensions/ai-code-helper/ |
Terminal, auth provider, debug adapter, webview |
demo/.aws/credentials |
AWS credentials file |
demo/.env |
OpenAI, Anthropic, Stripe, GitHub keys |
demo/packages/evil-npm/ |
curl | bash in preinstall script |
demo/Dockerfile |
curl | bash + no USER directive |
demo/scripts/deploy.sh |
Hardcoded secrets |
# .github/workflows/overtrust.yml
- name: Run overtrust
run: |
cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j$(nproc)
./build/overtrust ${{ github.workspace }} --exit-code --report overtrust.json
- name: Upload report
uses: actions/upload-artifact@v4
with:
name: overtrust-report
path: overtrust.json--exit-code makes the step fail if any findings are found. Pipe the JSON output to your security dashboard or SIEM.
src/
├── main.cpp Entry point, CLI args, signal handling, TUI/headless dispatch
├── scanner/
│ ├── walker.cpp Recursive filesystem walker, skips noise dirs, respects ignore files
│ ├── classifier.cpp File type detection (path heuristics + magic bytes)
│ ├── manifest.cpp VS Code / npm / Dockerfile parsers → Findings
│ ├── secrets.cpp Keyword filter → regex → entropy → FP guard
│ ├── procscanner_linux.cpp /proc caps, namespace inodes, sensitive FD scan
│ ├── procscanner_win.cpp Win32 process enumeration, token privileges, elevation check
│ └── engine.cpp ScanEngine: orchestrates all phases in a background thread
├── graph/
│ └── graph.cpp TrustGraph: DFS reachability, permission closure, Tarjan SCC
├── tui/
│ ├── app.hpp FTXUI App: 5-panel layout, live updates, keybindings
│ ├── splash.hpp Splash screen with ASCII banner
│ ├── widgets.hpp Reusable FTXUI elements (trust bar, finding rows, detail panel)
│ ├── colors.hpp Severity + score color palette
│ └── graph_view.hpp Compact tree + visual canvas graph renderers
└── report.cpp JSON report export
include/overtrust/
├── version.hpp Version constants (APP_NAME, VERSION)
├── types.hpp Finding, ScanState, ScanSummary, Severity, next_finding_id()
├── scanner.hpp ScanCallbacks, walk_directory, ignore file loading
├── classifier.hpp FileKind enum, classify_file()
├── manifest.hpp VsCodeExtManifest, NpmManifest, DockerfileManifest
├── secrets.hpp SecretMatch, scan_for_secrets(), shannon_entropy()
├── procscanner.hpp ProcessInfo, CapEntry, scan_processes(), is_ai_tool()
├── graph.hpp TrustGraph, GraphNode, GraphEdge, compute_trust_score()
├── engine.hpp ScanEngine
└── report.hpp write_json_report()
| Component | Library | Why |
|---|---|---|
| TUI | FTXUI v5 | Declarative, beautiful, active maintenance |
| JSON | nlohmann/json v3.11 | Single-header, zero drama |
| Rules | Hardcoded C++ | Zero deps, deterministic, no YAML parse attack surface |
| Filesystem | std::filesystem (C++17) |
No deps, recursive walk with permission skip |
| Processes (Linux) | /proc pseudo-FS |
Zero kernel modules, read-only |
| Processes (Windows) | Win32 CreateToolhelp32Snapshot + Advapi32 |
Pure Win32, no admin required |
| Build | CMake 3.16+ with FetchContent |
Auto-fetches FTXUI and nlohmann/json |
No. Overtrust only reads files and /proc entries it already has permission to access. Anything it can't read is silently skipped. On Windows, process enumeration works without elevation — privilege details for protected processes are simply omitted.
Never. All analysis is fully local. No telemetry, no crash reports, no network calls of any kind.
- Offline-first — no API keys, no cloud, no tokens consumed
- Deterministic — identical input always produces identical output
- AI-aware — specifically built for the new attack surface created by AI coding tools with broad filesystem access
- Single binary — one statically-linked executable, no runtime dependencies
Those tools find secrets in code. Overtrust finds what already has access to your secrets right now — running processes, IDE extensions with elevated permissions, misconfigured containers, and credential files sitting in readable directories.
PRs welcome. Read the code first — it's small and well-commented.
MIT — see LICENSE
Built with C++17, FTXUI, and systems knowledge. No AI was used in the detection logic.
