JMo Security Audit Suite (terminal-first, multi-tool, unified outputs, multi-target scanning)
Project description
JMo's Security Audit Tool Suite
๐ฌ Stay Updated & Support
Get security tips and updates delivered to your inbox:
- ๐ New feature announcements
- ๐ก Real-world security case studies & exclusive guides
Subscribe to Newsletter | Support Full-Time Development
A terminal-first, cross-platform security audit toolkit that orchestrates multiple scanners (secrets, SAST, SBOM, IaC, Dockerfile) with a unified Python CLI, normalized outputs, and an HTML dashboard.
๐ New here? Read the comprehensive User Guide: docs/USER_GUIDE.md Docs hub: docs/index.md Project homepage: jmotools.com
Origin Story: Built as my capstone project for Institute of Data ร Michigan Tech University's Cybersecurity Bootcamp (graduated October 2025). Now a production-grade security platform. Actively seeking cybersecurity/DevSecOps roles โ let's connect! Issues and PRs welcome.
Thinking about contributing? See CONTRIBUTING.md for setup and coding standards. For publishing, see docs/RELEASE.md.
Roadmap & history:
- Latest: ROADMAP #2 (Interactive Wizard) โ Complete - see docs/examples/wizard-examples.md
- Completed steps (summary): see CHANGELOG.md โ ROADMAP Items #1-2 and Steps 1โ13
- Active/planned work: see ROADMAP.md
For scanning a list of repos from a TSV end-to-end (clone + unshallow + full toolchain), see: docs/examples/scan_from_tsv.md
โ CI and release at a glance
- Tests run on a matrix of operating systems and Python versions:
- OS: ubuntu-latest, macos-latest
- Python: 3.10, 3.11, 3.12
- CI uses concurrency to cancel redundant runs on rapid pushes and sets a 20-minute job timeout.
- Coverage is uploaded to Codecov without a token (OIDC/tokenless on public repos) using
codecov/codecov-action@v5. - Releases to PyPI use Trusted Publishers (OIDC) via
pypa/gh-action-pypi-publish@v1; no PyPI API token is required once the repo is authorized in PyPI.
See .github/workflows/tests.yml and .github/workflows/release.yml for details.
Quick link: CI Troubleshooting โ Interpreting CI failures
๐ Recent Improvements
v0.7.0 - Performance & UX (October 2025)
Smart Defaults & Real-Time Feedback:
- โ
Auto-Detect CPU Threads - Automatically uses 75% of CPU cores for optimal performance (min 2, max 16)
- No more guessing thread counts
- Docker scans now utilize full CPU capacity
- Override with
threads: autoin jmo.yml orJMO_THREADS=auto
- โ
Real-Time Progress Tracking - Live updates during long-running scans
- Format:
[3/10] โ repo: my-app (45s) | Progress: 30% | ETA: 2m 15s - Per-target timing shows which targets are slow
- No more wondering if scan is frozen
- Format:
Why This Matters:
- ๐ Faster Scans - Proper CPU utilization reduces scan times by 40-60%
- ๐ Better Visibility - Know exactly what's happening during long scans (15-60 min)
- ๐ฏ Smarter Defaults - Works out-of-the-box without manual configuration
v0.6.0 - Multi-Target Scanning (October 2025)
BREAKTHROUGH: Unified Security Platform (ROADMAP #4 - Phase 1):
Scan repositories AND infrastructure in one unified workflow!
- โ Container Image Scanning - Scan Docker/OCI images with Trivy + Syft for vulnerabilities, secrets, and SBOMs
- โ IaC File Scanning - Scan Terraform/CloudFormation/K8s manifests with Checkov + Trivy
- โ Live Web URL Scanning - DAST scanning of web apps and APIs with OWASP ZAP
- โ GitLab Integration - Scan GitLab repos with TruffleHog verified secrets detection
- โ Kubernetes Cluster Scanning - Live K8s cluster scanning with Trivy for vulnerabilities and misconfigurations
- โ Unified Results - All targets aggregated, deduplicated, and reported in one dashboard
- โ Multi-Target CI/CD - Scan multiple target types in one pipeline run
Key Benefits:
- ๐ฏ Single Tool - Replace 5+ separate security tools with one unified CLI
- ๐ Parallel Execution - Scan images/IaC/URLs/repos simultaneously for faster results
- ๐ Unified Reporting - One dashboard for all findings across all targets
- ๐ CI/CD Ready - Multi-target scanning with severity gating in one command
- ๐ง Flexible - Scan single targets or batch process from files
Example: Complete Security Audit in One Command:
# Scan repo + container image + live web app + K8s cluster together
jmo scan \
--repo ./myapp \
--image myapp:latest \
--url https://myapp.com \
--k8s-context prod \
--results-dir ./audit-results
See docs/USER_GUIDE.md โ Multi-Target Scanning for complete documentation.
v0.5.0 - Tool Suite Consolidation (October 2025)
Tool Suite Consolidation (ROADMAP #3):
- โ DAST coverage added with OWASP ZAP (20-30% more vulnerabilities detected)
- โ Runtime security monitoring with Falco (zero-day exploit detection for containers/K8s)
- โ Fuzzing capabilities with AFL++ (coverage-guided vulnerability discovery)
- โ Verified secrets with TruffleHog (95% false positive reduction)
- โ Removed deprecated tools (gitleaks, tfsec, osv-scanner)
- โ Profile restructuring - Fast: 3 tools, Balanced: 7 tools, Deep: 11 tools
Security & Bug Fixes (Phase 1 - October 2025):
- โ XSS vulnerability patched in HTML dashboard with comprehensive input escaping
- โ OSV scanner fully integrated for open-source vulnerability detection
- โ Type-safe severity enum with comparison operators for cleaner code
- โ
Backward-compatible suppression keys (
suppressionsand legacysuppress)
Enhanced Features:
- ๐ Enriched SARIF output with CWE/OWASP/CVE taxonomies, code snippets, and CVSS scores
- โ๏ธ Configurable thread recommendations via
jmo.ymlprofiling section - ๐ Magic numbers extracted to named constants for better maintainability
- ๐ 9 new roadmap enhancements including Policy-as-Code (OPA), SLSA attestation, GitHub App, and more
Quality Metrics:
- โ 272/272 tests passing
- โ 91% code coverage (exceeds 85% requirement)
- โ No breaking changes to existing workflows
See CHANGELOG.md for complete details.
๐ Three Ways to Get Started
๐ช Windows Users: Use Option 2 (Docker) for the best experience. WSL2 with Docker Desktop provides zero-installation scanning with full tool compatibility. Native Windows support is limited due to tool availability. See Docker for Windows Setup below.
Option 1: ๐ง Interactive Wizard (Recommended for Beginners)
Never used security scanners before? Start with the guided wizard:
Prerequisites:
- Already installed? Skip to running the wizard below
- Need to install? See Installation Quick Reference (2 minutes)
Run the wizard:
jmotools wizard
What the wizard provides:
- โ Step-by-step guidance through all configuration options
- โ Profile selection (fast/balanced/deep) with time estimates
- โ Docker vs native mode - zero-installation Docker option!
- โ Multi-target support (v0.6.2+) - scan repos, images, IaC, URLs, GitLab, K8s
- โ Smart detection - auto-discovers repos, validates URLs/K8s contexts
- โ Command preview - see what will run before executing
- โ Auto-open results - dashboard and summary automatically displayed
Non-interactive mode for automation:
jmotools wizard --yes # Use smart defaults
jmotools wizard --docker # Force Docker mode
Generate reusable artifacts:
jmotools wizard --emit-make-target Makefile.security # Team Makefile
jmotools wizard --emit-script scan.sh # Shell script
jmotools wizard --emit-gha .github/workflows/security.yml # GitHub Actions
๐ Full wizard guide: docs/examples/wizard-examples.md
Option 2: ๐ณ Docker (Zero Installation) โญ Recommended for Windows
โจ Start scanning in 60 seconds with ZERO tool installation!
Perfect for:
- ๐ช Windows users (WSL2 + Docker Desktop)
- ๐ Quick trials (no commitment, no setup)
- ๐ CI/CD pipelines (consistent environments)
- ๐ Any platform (Linux, macOS, Windows)
# Pull the image (one-time, ~500MB)
# Option 1: Amazon ECR Public (recommended for AWS users)
docker pull public.ecr.aws/m2d8u2k1/jmo-security:latest
# Option 2: GitHub Container Registry (recommended for general users)
docker pull ghcr.io/jimmy058910/jmo-security:latest
# Scan current directory (replace IMAGE with your chosen registry)
docker run --rm -v $(pwd):/scan IMAGE:latest \
scan --repo /scan --results /scan/results --profile balanced --human-logs
# View results
open results/summaries/dashboard.html # macOS
xdg-open results/summaries/dashboard.html # Linux
start results/summaries/dashboard.html # Windows (WSL2)
cat results/summaries/SUMMARY.md # Quick text overview
๐ Learn how to triage and act on your findings:
- Quick triage workflow (30 min): docs/RESULTS_QUICK_REFERENCE.md - Printable one-page reference
- Complete results guide: docs/RESULTS_GUIDE.md - Understanding, triaging, CI/CD integration, compliance
**Three image variants available:**
- `latest` (~500MB) - All 12 scanners included
- `slim` (~200MB) - Core 6 scanners for CI/CD
- `alpine` (~150MB) - Minimal footprint
**Why Docker?**
- โ
No Python/tool installation required
- โ
Works identically on all platforms
- โ
Automatic tool version management
- โ
Isolated from your host system
- โ
Perfect for Windows (native tools often unavailable)
๐ **Complete Docker guide:** [docs/DOCKER_README.md](docs/DOCKER_README.md)
๐ **Beginner Docker tutorial:** [docs/DOCKER_README.md#quick-start-absolute-beginners](docs/DOCKER_README.md#quick-start-absolute-beginners)
---
### Option 3: ๐งช CLI Wrapper Commands (Local Install)
**Prerequisites:**
- **Already have tools installed?** Skip to commands below
- **Need to install?** See [Installation Quick Reference](#-installation-quick-reference) (5-10 minutes)
**Quick wrapper commands:**
```bash
# Quick fast scan (auto-opens results)
jmotools fast --repos-dir ~/repos
# Balanced scan (recommended default)
jmotools balanced --repos-dir ~/repos
# Deep scan with all tools
jmotools full --repos-dir ~/repos
Clone from TSV and scan:
jmotools balanced --tsv ./repositories.tsv --dest ./cloned-repos
Setup tools quickly:
jmotools setup --check # Verify tool installation
jmotools setup --auto-install # Auto-install on Linux/WSL/macOS
Makefile shortcuts:
make setup # Verify tools (installs package if needed)
make fast DIR=~/repos # Run fast profile
make balanced DIR=~/repos
make full DIR=~/repos
Note: Under the hood, wrapper commands verify your OS/tools, optionally clone from TSV, run jmo ci with the appropriate profile, and auto-open results.
๐ฆ Installation Quick Reference
Choose your installation path based on experience level:
Path 1: Docker (Zero Installation - Recommended for Beginners)
Time: 2 minutes | Tools: All 11+ scanners included
# 1. Install Docker Desktop
# Download from: https://www.docker.com/products/docker-desktop
# (Windows/Mac/Linux all supported)
# 2. Pull JMo Security image (one-time, ~500MB)
docker pull ghcr.io/jimmy058910/jmo-security:latest
# 3. You're ready! No other installation needed.
# Run the wizard in Docker mode:
docker run -it --rm -v $(pwd):/scan ghcr.io/jimmy058910/jmo-security:latest wizard
โ Best for: Complete beginners, Windows users, quick trials, CI/CD
๐ Full guide: Docker README
Path 2: Python Package (pip install)
Time: 5-10 minutes | Tools: Install separately (see below)
# 1. Ensure Python 3.10+ installed
python3 --version # Should be 3.10 or higher
# 2. Install JMo Security CLI
pip install jmo-security
# 3. Add to PATH (if needed)
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
# 4. Verify installation
jmo --help
jmotools --help
# 5. Install security tools (choose one):
# Option A: Auto-install (Linux/WSL/macOS)
git clone https://github.com/jimmy058910/jmo-security-repo.git
cd jmo-security-repo
make tools # Installs all tools
make verify-env # Verify installation
# Option B: Manual install (see "Tool Installation" section below)
โ Best for: Developers, advanced users, customization needs
๐ Full guide: Quick Start Guide
Path 3: Clone Repository (Contributors)
Time: 10-15 minutes | Tools: Install separately
# 1. Clone repository
git clone https://github.com/jimmy058910/jmo-security-repo.git
cd jmo-security-repo
# 2. Install in editable mode
pip install -e .
# 3. Install dev dependencies
make dev-deps
# 4. Install pre-commit hooks
make pre-commit-install
# 5. Install security tools
make tools
make verify-env
โ Best for: Contributors, development work
๐ Full guide: Contributing Guide
Quick Decision Guide
| Your Situation | Recommended Path | Time |
|---|---|---|
| "I just want to scan something NOW" | Docker (Path 1) | 2 min |
| "I'm on Windows" | Docker (Path 1) or WSL 2 | 2-15 min |
| "I use security tools regularly" | pip install (Path 2) | 5-10 min |
| "I want to contribute code" | Clone repo (Path 3) | 10-15 min |
| "I'm a complete beginner" | Docker (Path 1) | 2 min |
Still unsure? โ Use Docker (Path 1). You can always install locally later.
Windows Docker Setup
Recommended Setup for Windows Users:
-
Install WSL2 (Windows Subsystem for Linux 2)
# Run in PowerShell as Administrator wsl --install
-
Install Docker Desktop for Windows
- Download: https://www.docker.com/products/docker-desktop
- Enable WSL2 backend in Docker Desktop settings
- Ensure "Use the WSL 2 based engine" is checked
-
Run JMo Security in WSL2
# Open WSL2 terminal (Ubuntu) wsl # Pull JMo Security Docker image docker pull ghcr.io/jimmy058910/jmo-security:latest # Scan a repository docker run --rm -v $(pwd):/scan ghcr.io/jimmy058910/jmo-security:latest \ scan --repo /scan --results /scan/results --profile balanced # View results (opens in Windows browser) explorer.exe results/summaries/dashboard.html type results\summaries\SUMMARY.md
๐ Understanding results: docs/RESULTS_GUIDE.md - Complete triage and remediation guide
Alternative: Use the Wizard in Docker mode
# Clone this repo in WSL2
git clone https://github.com/jimmy058910/jmo-security-repo.git
cd jmo-security-repo
# Run wizard (auto-detects Docker)
pip install -e .
jmotools wizard --docker
# Follow the prompts - wizard handles everything!
Why WSL2 + Docker?
- โ Best compatibility: All 12 security tools work perfectly
- โ Zero native Windows tools: No Python/git/tool installation on Windows
- โ Linux performance: Scans run 2-3x faster than native Windows
- โ
Easy file access: Access Windows files via
/mnt/c/Users/... - โ Seamless integration: Results open in Windows browser automatically
Troubleshooting:
- Docker not found: Ensure Docker Desktop is running and WSL2 integration is enabled
- Slow scans: Clone repos to WSL2 filesystem (
~/repos), not Windows mount (/mnt/c/) - Permission denied: Add your user to docker group:
sudo usermod -aG docker $USER
๐ Complete Windows guide: docs/DOCKER_README.md#windows-wsl2-setup
๐ฏ Multi-Target Scanning Examples (v0.6.0+)
New in v0.6.0: Scan 6 different target types in one unified workflow!
Quick Examples
Scan a container image:
jmo scan --image nginx:latest --results-dir ./image-scan
Scan multiple images from file:
# images.txt: one image per line
# nginx:latest
# postgres:15
# redis:alpine
jmo scan --images-file images.txt --results-dir ./registry-audit
Scan Terraform state file:
jmo scan --terraform-state terraform.tfstate --tools checkov trivy
Scan live web application:
jmo scan --url https://example.com --tools zap --results-dir ./web-audit
Scan GitLab organization (all repos):
jmo scan --gitlab-url https://gitlab.com --gitlab-token $GITLAB_TOKEN \
--gitlab-group myorg --tools trufflehog
Scan Kubernetes cluster:
jmo scan --k8s-context prod --k8s-all-namespaces --tools trivy
Multi-target audit (everything at once!):
# Scan repository + container + web app + K8s in one command
jmo scan \
--repo ./myapp \
--image myapp:latest \
--url https://myapp.com \
--k8s-context prod \
--k8s-namespace default \
--results-dir ./complete-audit
CI mode with multi-target scanning:
# Scan + report + fail on HIGH severity in one command
jmo ci \
--image myapp:latest \
--url https://staging.myapp.com \
--fail-on HIGH \
--profile balanced
Supported Target Types
| Target Type | Tools | CLI Arguments | Use Case |
|---|---|---|---|
| Repositories | trufflehog, semgrep, bandit, syft, trivy, checkov, hadolint | --repo, --repos-dir, --targets |
Source code scanning |
| Container Images | trivy, syft | --image, --images-file |
Registry audits, CI/CD gates |
| IaC Files | checkov, trivy | --terraform-state, --cloudformation, --k8s-manifest |
Infrastructure compliance |
| Web URLs | zap | --url, --urls-file, --api-spec |
DAST scanning |
| GitLab Repos | trufflehog | --gitlab-repo, --gitlab-group, --gitlab-token |
GitLab security audits |
| Kubernetes Clusters | trivy | --k8s-context, --k8s-namespace, --k8s-all-namespaces |
Live cluster audits |
Results structure:
results/
โโโ individual-repos/ # Repository scans
โโโ individual-images/ # Container image scans
โโโ individual-iac/ # IaC file scans
โโโ individual-web/ # Web app/API scans
โโโ individual-gitlab/ # GitLab repo scans
โโโ individual-k8s/ # K8s cluster scans
โโโ summaries/ # Unified reports (all targets)
โโโ findings.json
โโโ SUMMARY.md
โโโ dashboard.html
โโโ findings.sarif
๐ Complete multi-target guide: docs/USER_GUIDE.md โ Multi-Target Scanning
๐ฏ Overview
A unified security platform for scanning code repositories, container images, infrastructure-as-code, web applications, GitLab repos, and Kubernetes clusters.
This project provides an automated framework for conducting thorough security audits across your entire application stack. It orchestrates multiple industry-standard security tools to detect secrets, vulnerabilities, misconfigurations, and security issues.
Key Features
- ๐ฏ Multi-Target Scanning (v0.6.0+): Scan 6 target types in one unified workflow
- Repositories (source code)
- Container images (Docker/OCI)
- IaC files (Terraform/CloudFormation/K8s)
- Live web URLs (DAST)
- GitLab repos (verified secrets)
- Kubernetes clusters (live audits)
- โ
Multi-Tool Scanning: Curated set covering secrets (trufflehog verified, noseyparker), SAST (semgrep, bandit), SBOM+vuln/misconfig (syft+trivy), IaC (checkov), Dockerfile (hadolint), DAST (OWASP ZAP), runtime security (Falco), and fuzzing (AFL++)
- v0.5.0 Update: Removed deprecated tools (gitleaks, tfsec, osv-scanner), added DAST/runtime/fuzzing capabilities
- ๐ Comprehensive Reporting: Unified findings (JSON/YAML), enriched SARIF 2.1.0 with taxonomies, Markdown summary, and an interactive HTML dashboard with XSS protection
- ๐จ Easy-to-Read Outputs: Well-formatted reports with severity categorization using type-safe enums
- ๐ Automated Workflows: One CLI to scan, aggregate, and gate on severity (scan/report/ci)
- ๐งญ Profiles and Overrides: Named profiles, per-tool flags/timeouts, include/exclude patterns, configurable thread recommendations
- ๐ Resilience: Timeouts, retries with per-tool success codes, human-friendly logs, graceful cancel
- ๐ Security-First: XSS vulnerability patched, comprehensive input escaping, secure-by-default configurations
๐ Quick Start (Local Installation)
Install or Update (curated tools)
These targets detect Linux/WSL/macOS and install or upgrade the curated CLI tools used by this suite. They also surface helpful hints if a platform step needs manual action.
make tools # one-time install of curated tools
make tools-upgrade # refresh/upgrade curated tools
make verify-env # check OS/WSL/macOS and tool availability
make dev-deps # install Python dev dependencies
Optional: install the package locally to get jmo and jmotools commands on your PATH:
pip install -e .
Pre-commit hooks (YAML & Actions validation)
We ship pre-commit hooks for YAML linting and GitHub Actions validation (among other basic checks):
make pre-commit-install # installs the git hooks
make pre-commit-run # run checks on all files
These run locally via pre-commit and are also enforced in CI.
We ship a .yamllint.yaml and validate GitHub Actions workflows via actionlint. The same checks are executed in CI.
Reproducible dev dependencies (optional)
This repo ships a requirements-dev.in with a compiled requirements-dev.txt. Use pip-tools or uv to pin/sync your dev environment:
make upgrade-pip
make deps-compile # compile dev deps
make deps-sync # sync env to compiled lock
CI verifies that requirements-dev.txt is up to date on PRs. If it fails, run make deps-compile and commit the diff.
Quick Start (Unified CLI)
- Verify your environment (Linux/WSL/macOS) and see install hints for optional tools:
make verify-env
- Install Python dev dependencies (for running tests and reporters):
make dev-deps
- Scan repositories using a profile, then aggregate reports:
# Scan immediate subfolders under ~/repos with the 'balanced' profile (default)
python3 scripts/cli/jmo.py scan --repos-dir ~/repos --profile-name balanced --human-logs
# Aggregate and write unified outputs to results/summaries
# (positional or --results-dir are both accepted)
python3 scripts/cli/jmo.py report ./results --profile --human-logs
# or
python3 scripts/cli/jmo.py report --results-dir ./results --profile --human-logs
Multi-target scanning (v0.6.0+)
# Scan container image
python3 scripts/cli/jmo.py scan --image nginx:latest --human-logs
# Scan Terraform state
python3 scripts/cli/jmo.py scan --terraform-state terraform.tfstate --human-logs
# Scan live web app
python3 scripts/cli/jmo.py scan --url https://example.com --tools zap --human-logs
# Scan everything together
python3 scripts/cli/jmo.py scan \
--repo ./myapp \
--image myapp:latest \
--url https://myapp.com \
--k8s-context prod \
--human-logs
Or do both in one step for CI with a failure threshold
# Repository CI
python3 scripts/cli/jmo.py ci --repos-dir ~/repos --profile-name fast --fail-on HIGH --profile --human-logs
# Multi-target CI (v0.6.0+)
python3 scripts/cli/jmo.py ci --image myapp:latest --url https://staging.myapp.com --fail-on HIGH --human-logs
Outputs include: summaries/findings.json, SUMMARY.md, findings.yaml, findings.sarif (enabled by default), dashboard.html, and timings.json (when profiling).
Basic Usage
Optional: Quick Setup with Helper Script
Use the populate_targets.sh helper script to clone multiple repositories for testing (optimized for WSL):
# Clone sample vulnerable repos (fast shallow clones)
./scripts/core/populate_targets.sh
# Clone from custom list with full history
./scripts/core/populate_targets.sh --list my-repos.txt --full
# Clone with 8 parallel jobs for faster performance
./scripts/core/populate_targets.sh --parallel 8
# Unshallow repos if secret scanners need full git history
./scripts/core/populate_targets.sh --unshallow
Running Security Scans (legacy shell script)
Prefer the Python CLI above. For legacy flows, you can still use the shell wrapper:
./scripts/cli/security_audit.sh -d ~/security-testing # scan
./scripts/cli/security_audit.sh --check # verify tools
End-to-End Workflow
# 1. Clone test repositories (shallow for speed)
./scripts/core/populate_targets.sh --dest ~/test-repos --parallel 4
# 2. Run security audit (preferred)
python3 scripts/cli/jmo.py ci --repos-dir ~/test-repos --fail-on HIGH --profile --human-logs
# 3. View results
cat results/summaries/SUMMARY.md
# macOS: open results/summaries/dashboard.html
# Linux: xdg-open results/summaries/dashboard.html
๐ Next steps after scanning:
- Understand your results: docs/RESULTS_GUIDE.md - Triage workflow, compliance reports, CI/CD integration
- Quick reference card: docs/RESULTS_QUICK_REFERENCE.md - 30-minute triage workflow
Looking for screenshots and how to capture them? See: docs/screenshots/README.md
๐ Documentation
Workflow (at a glance)
The security audit follows this workflow:
- Tool Verification: Checks all required tools are installed
- Repository Scanning: jmo scan orchestrates tools per jmo.yml (profiles, overrides, retries)
- Results Aggregation: jmo report normalizes tool outputs to a CommonFinding shape
- Report Generation: JSON/MD/YAML/HTML/SARIF and suppression summary
- Dashboard Creation: Self-contained HTML dashboard with an optional profiling panel
Output Structure (Default)
results/
โโโ individual-repos/ # Repository scans
โ โโโ <repo-name>/
โ โโโ trufflehog.json
โ โโโ semgrep.json
โ โโโ syft.json
โ โโโ trivy.json
โ โโโ checkov.json
โ โโโ hadolint.json
โ โโโ zap.json # DAST (balanced + deep)
โ โโโ noseyparker.json # deep only
โ โโโ bandit.json # deep only
โ โโโ falco.json # deep only
โ โโโ afl++.json # deep only
โโโ individual-images/ # โจ NEW v0.6.0: Container image scans
โ โโโ <sanitized-image>/
โ โโโ trivy.json
โ โโโ syft.json
โโโ individual-iac/ # โจ NEW v0.6.0: IaC file scans
โ โโโ <file-stem>/
โ โโโ checkov.json
โ โโโ trivy.json
โโโ individual-web/ # โจ NEW v0.6.0: Web app/API scans
โ โโโ <domain>/
โ โโโ zap.json
โโโ individual-gitlab/ # โจ NEW v0.6.0: GitLab scans
โ โโโ <group>_<repo>/
โ โโโ trufflehog.json
โโโ individual-k8s/ # โจ NEW v0.6.0: K8s cluster scans
โ โโโ <context>_<namespace>/
โ โโโ trivy.json
โโโ summaries/ # Unified reports (ALL targets)
โโโ findings.json
โโโ findings.yaml # requires PyYAML
โโโ findings.sarif # SARIF 2.1.0
โโโ SUMMARY.md
โโโ dashboard.html
โโโ SUPPRESSIONS.md # written when suppressions apply
โโโ timings.json # written when --profile is used
Reporters
The aggregator writes unified outputs under results/summaries/:
- JSON (
findings.json) โ complete, machine-readable findings list - Markdown (
SUMMARY.md) โ human-readable overview with severity counts and top rules - YAML (
findings.yaml) โ optional; requires PyYAML - HTML (
dashboard.html) โ interactive dashboard with filters, sorting, exports, and theme toggle - SARIF (
findings.sarif) โ 2.1.0 for code scanning integrations - Suppression summary (
SUPPRESSIONS.md) โ appears when suppression rules filter findings
See SAMPLE_OUTPUTS.md for real examples produced from the infra-demo fixture.
How we normalize findings
All tool outputs are converted into a single CommonFinding schema during aggregation. This enables a unified view (JSON/YAML/HTML/SARIF) and consistent gating.
- Schema: docs/schemas/common_finding.v1.json
- Required fields include: schemaVersion (1.0.0), id, ruleId, severity, tool (name/version), location (path/lines), and message. Optional fields include title, description, remediation, references, tags, cvss, and raw (original tool payload).
- Fingerprint (id): deterministically derived from a stable subset of attributes (tool | ruleId | path | startLine | message snippet) to support cross-tool dedupe. The aggregation step deduplicates by this id.
๐ ๏ธ Tool Installation
macOS (Homebrew)
# Core tools
brew install cloc jq
# Secrets detection
brew install trufflesecurity/trufflehog/trufflehog
# SAST
brew install semgrep
# SBOM + Vuln/Misconfig
brew install syft trivy
# IaC
brew install checkov
# Dockerfile linting
brew install hadolint
# DAST (balanced + deep profiles)
brew install --cask owasp-zap
# Additional tools for deep profile:
# - Nosey Parker: Download from https://github.com/praetorian-inc/noseyparker/releases
# - Falco: brew install falco (or via official installer)
# - AFL++: brew install afl++
Linux (Ubuntu/Debian)
# Core tools
sudo apt-get install cloc jq
# Secrets detection
curl -sSfL https://raw.githubusercontent.com/trufflesecurity/trufflehog/main/scripts/install.sh | sh -s -- -b /usr/local/bin
# SAST
pip install semgrep
# SBOM + Vuln/Misconfig
# Syft
curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh -s -- -b /usr/local/bin
# Trivy
wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add -
echo "deb https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main" | sudo tee -a /etc/apt/sources.list.d/trivy.list
sudo apt-get update && sudo apt-get install trivy
# IaC
pip install checkov
# Dockerfile linting
sudo wget -O /usr/local/bin/hadolint https://github.com/hadolint/hadolint/releases/latest/download/hadolint-Linux-x86_64
sudo chmod +x /usr/local/bin/hadolint
# DAST (balanced + deep profiles)
sudo snap install zaproxy --classic
# Additional tools for deep profile:
# - Nosey Parker: Download from https://github.com/praetorian-inc/noseyparker/releases
# - Bandit: pip install bandit
# - Falco: Follow https://falco.org/docs/getting-started/installation/
# - AFL++: sudo apt-get install afl++
Nosey Parker (manual install)
Nosey Parker doesnโt ship via apt/brew universally. Install the release binary and put it on your PATH:
-
Download the latest release for your OS/arch from: https://github.com/praetorian-inc/noseyparker/releases
-
Unpack and move the binary onto PATH (example for Linux x86_64):
tar -xzf noseyparker-*.tar.gz
chmod +x noseyparker
sudo mv noseyparker /usr/local/bin/
noseyparker --version
Tip: run make verify-env to confirm the tool is detected.
Nosey Parker on WSL (native recommended) + Docker fallback
On WSL Ubuntu, installing Nosey Parker natively is the most reliable path (prebuilt binaries can hit glibc issues). See โUser Guide โ Nosey Parker on WSLโ for a short build-from-source flow using Rust and Boost. When the local binary is not available or fails to run, the CLI automatically falls back to a Docker-based runner.
The CLI automatically falls back to a Docker-based Nosey Parker runner when the local binary is missing or not runnable (common on older WSL/glibc). When enabled via profiles, scans will transparently produce the expected JSON here:
results/individual-repos/<repo-name>/noseyparker.json
Requirements for the fallback:
- Docker installed and running
- Ability to pull or use
ghcr.io/praetorian-inc/noseyparker:latest
Manual usage (optional):
bash scripts/core/run_noseyparker_docker.sh \
--repo /path/to/repo \
--out results/individual-repos/<repo-name>/noseyparker.json
This mounts your repository read-only into the container, scans it, and writes a JSON report to the --out path. The CLI uses this same script automatically when needed.
Semgrep (latest via official script, optional)
If you prefer the bleeding-edge standalone installer maintained by Semgrep:
curl -sL https://semgrep.dev/install.sh | sh
# Ensure ~/.local/bin is on PATH (the installer places semgrep there by default)
export PATH="$HOME/.local/bin:$PATH"
semgrep --version
Note: we recommend isolating CLI tools via pipx or OS packages for stability. The official installer is a convenient alternative when you need the newest release.
๐ Advanced Usage
Helper Scripts for Multi-Repo Scanning
scripts/populate_targets.sh - Automated Repository Cloning
This helper script streamlines the process of cloning multiple repositories for security scanning, with performance optimizations for WSL environments.
Features:
- ๐ Shallow clones (depth=1) for faster cloning
- โก Parallel cloning for improved performance
- ๐ Unshallow option for secret scanners requiring full history
- ๐ Reads from repository list file
Usage Examples:
# Basic usage with defaults (samples/repos.txt โ ~/security-testing)
./scripts/core/populate_targets.sh
# Custom repository list and destination
./scripts/core/populate_targets.sh --list custom-repos.txt --dest ~/my-test-repos
# Full clones with 8 parallel jobs
./scripts/core/populate_targets.sh --full --parallel 8
# Unshallow existing shallow clones
./scripts/core/populate_targets.sh --dest ~/security-testing --unshallow
# Show all options
./scripts/core/populate_targets.sh --help
Repository List Format (samples/repos.txt):
# One GitHub repository URL per line
# Lines starting with # are comments
https://github.com/user/repo1.git
https://github.com/user/repo2.git
Performance Tips for WSL:
- Use shallow clones initially for 10x faster cloning
- Adjust
--parallelbased on network speed (default: 4) - Use
--unshallowonly if secret scanners need full git history - Clone to WSL filesystem (not Windows mount) for better performance
CLI-first usage
Prefer the Python CLI for report generation from existing results:
# Default reporters (formats controlled by jmo.yml)
python3 scripts/cli/jmo.py report /path/to/results
# Set thread workers explicitly for aggregation
python3 scripts/cli/jmo.py report /path/to/results --threads 6
# Record profiling timings (writes summaries/timings.json)
python3 scripts/cli/jmo.py report /path/to/results --profile
# Human-friendly colored logs (stderr)
python3 scripts/cli/jmo.py report /path/to/results --human-logs
Unified CLI: report-only
After scans complete, you can generate unified, normalized reports via the Python CLI:
# Default reports (formats controlled by jmo.yml)
python3 scripts/cli/jmo.py report /path/to/security-results
# Set thread workers explicitly for aggregation
python3 scripts/cli/jmo.py report /path/to/security-results --threads 6
# Record profiling timings (writes summaries/timings.json)
python3 scripts/cli/jmo.py report /path/to/security-results --profile
# Human-friendly colored logs (stderr)
python3 scripts/cli/jmo.py report /path/to/security-results --human-logs
Or using Make:
make report RESULTS_DIR=/path/to/security-results THREADS=6
make profile RESULTS_DIR=/path/to/security-results THREADS=6
When profiling is enabled, timings.json will include aggregate time, a recommended thread count, and per-job timings.
Unified CLI: scan/ci
# Scan a single repo with a custom tool subset and timeouts
python3 scripts/cli/jmo.py scan --repo /path/to/repo --tools trufflehog semgrep --timeout 300 --human-logs
# CI convenience โ scan then report with gating on severity
python3 scripts/cli/jmo.py ci --repos-dir ~/repos --profile-name balanced --fail-on HIGH --profile
Output Structure (Summaries)
The summaries/ folder also contains unified outputs:
summaries/
โโโ findings.json # Unified normalized findings (machine-readable)
โโโ SUMMARY.md # Human-readable summary
โโโ findings.yaml # Optional YAML (requires PyYAML)
โโโ dashboard.html # Self-contained HTML view
โโโ findings.sarif # SARIF 2.1.0 for code scanning
โโโ SUPPRESSIONS.md # Suppression summary
โโโ timings.json # Profiling (when --profile used)
Profiles, per-tool overrides, retries
You can define named profiles in jmo.yml to control which tools run, include/exclude repo patterns, timeouts, and threads. You can also provide per-tool flags and timeouts, and a global retry count for flaky tools.
Example jmo.yml snippet:
default_profile: balanced
retries: 1
profiles:
fast:
tools: [trufflehog, semgrep, trivy]
include: ["*"]
exclude: ["big-monorepo*"]
timeout: 300
threads: 8
per_tool:
semgrep:
flags: ["--exclude", "node_modules", "--exclude", "dist"]
timeout: 180
balanced:
tools: [trufflehog, semgrep, syft, trivy, checkov, hadolint, zap]
timeout: 600
threads: 4
deep:
tools: [trufflehog, noseyparker, semgrep, bandit, syft, trivy, checkov, hadolint, zap, falco, afl++]
timeout: 900
threads: 2
retries: 1
per_tool:
trivy:
flags: ["--no-progress"]
timeout: 1200
zap:
flags: ["-config", "api.disablekey=true", "-config", "spider.maxDuration=5"]
Using a profile from CLI:
# Scan using profile 'fast' with human-friendly logs
python3 scripts/cli/jmo.py scan --repos-dir ~/repos --profile-name fast --human-logs
# CI convenience: scan then report, failing on HIGH or worse, record timings, use 'deep' profile
python3 scripts/cli/jmo.py ci --repos-dir ~/repos --profile-name deep --fail-on HIGH --profile
Retries behavior:
- Global
retries(or per-profile) retries failed tool commands a limited number of times - Some tools use non-zero exit to indicate โfindingsโ; we treat those as success codes to avoid useless retries
Human logs show per-tool retry attempts when > 1, e.g.: attempts={'semgrep': 2}
Customizing Tool Execution
Prefer jmo.yml profiles and per_tool overrides. For one-off local tweaks, use:
python3 scripts/cli/jmo.py scan --repos-dir ~/repos --tools trufflehog semgrep --timeout 300
๐ Examples, Screenshots, and Testing
- Examples: see
docs/examples/README.mdfor common CLI patterns and CI gating. - Screenshots:
docs/screenshots/README.mdanddocs/screenshots/capture.shto generate dashboard visuals. - Testing: see
TEST.mdfor running lint, tests, and coverage locally (CI gate โฅ85%).
๐ Understanding Your Results
๐ Complete Guides:
- Results Guide - The definitive 12,000-word guide covering everything from triage to compliance
- Quick Reference - One-page printable card for 30-minute triage
What you get after a scan:
After running a scan, you'll have multiple output formats in results/summaries/:
| File | Use When | Key Features |
|---|---|---|
dashboard.html |
First look, deep investigation | Interactive charts, filterable table, clickable file paths |
SUMMARY.md |
Quick triage, team sharing | Human-readable, top risks, remediation priorities |
COMPLIANCE_SUMMARY.md |
Compliance audits | OWASP, CWE, NIST, PCI DSS, CIS, MITRE ATT&CK mappings |
PCI_DSS_COMPLIANCE.md |
Payment compliance | Detailed PCI DSS requirement mapping |
findings.json |
Scripting, automation | Machine-readable CommonFinding schema |
findings.sarif |
CI/CD integration | GitHub/GitLab Security tab upload |
attack-navigator.json |
Threat modeling | MITRE ATT&CK heatmap visualization |
Triage in 30 minutes:
# Step 1: Quick overview (2 min)
cat results/summaries/SUMMARY.md
# Step 2: Filter production code only (5 min)
jq '[.[] | select(.severity == "HIGH" or .severity == "CRITICAL")
| select(.location.path | contains("tests/") or contains(".venv/") | not)]' \
results/summaries/findings.json > priority.json
# Step 3: Group by rule to find systemic issues (10 min)
jq 'group_by(.ruleId) | map({rule: .[0].ruleId, count: length})
| sort_by(.count) | reverse' priority.json
# Step 4: Suppress false positives (3 min)
# Create jmo.suppress.yml (see docs/RESULTS_GUIDE.md)
# Step 5: Open dashboard for deep dive (10 min)
open results/summaries/dashboard.html
๐ Complete triage workflow: This is just a quick example. For the full 30-minute systematic triage process, see docs/RESULTS_GUIDE.md - includes compliance reports, CI/CD integration, and real-world examples.
Severity Levels
The toolkit uses a type-safe severity enum with comparison operators for consistent filtering and sorting:
- CRITICAL: Immediate security risk (hardcoded passwords, RCE) - Fix immediately
- HIGH: Serious issue (SQL injection, XSS, CVE โฅ7.0) - Fix within 1 week
- MEDIUM: Moderate risk (weak crypto, missing auth) - Fix within 1 month
- LOW: Minor issue (info disclosure) - Fix when convenient
- INFO: Informational (deprecated APIs) - Optional improvement
Compliance Framework Auto-Enrichment
All findings automatically enriched with 6 compliance frameworks:
| Framework | What It Maps | When to Use |
|---|---|---|
| OWASP Top 10 2021 | Web app security categories (A03:2021 = Injection) | Web security audits, developer training |
| CWE Top 25 2024 | Common weakness types (CWE-798 = Hardcoded Creds) | Secure coding standards, CVE remediation |
| NIST CSF 2.0 | Risk management functions (PROTECT/DETECT) | Enterprise risk reporting, FISMA compliance |
| PCI DSS 4.0 | Payment security requirements (6.2.4 = Code scanning) | Payment processing compliance |
| CIS Controls v8.1 | Security best practices (IG1/IG2/IG3) | Cyber insurance, benchmarking |
| MITRE ATT&CK | Attack techniques (T1195 = Supply Chain) | Threat modeling, SOC analysis |
Example compliance finding:
{
"ruleId": "DL3018",
"message": "Pin versions in apk add",
"severity": "MEDIUM",
"compliance": {
"cisControlsV8_1": [{"control": "4.1", "implementationGroup": "IG1"}],
"nistCsf2_0": [{"function": "PROTECT", "category": "PR.IP"}],
"pciDss4_0": [{"requirement": "2.2.1", "priority": "HIGH"}]
}
}
Recommendations Priority
- Immediate: Fix all CRITICAL findings (verified secrets, RCE, critical CVEs)
- High Priority: Fix all HIGH findings in production code (not tests/dependencies)
- Medium Priority: Review MEDIUM findings, suppress false positives
- Long-term: Address LOW findings, improve code quality
๐ฏ Three-Stage Implementation Strategy
Stage 1: Pre-commit Hooks
- Tool: TruffleHog (verified secrets)
- Purpose: Prevent secrets before commit
- Speed: Fast (suitable for developer workflow)
Stage 2: CI/CD Pipeline
- Tools: TruffleHog + Semgrep
- Purpose: Automated PR/commit scanning
- Coverage: Verified secrets + vulnerabilities
Stage 3: Deep Periodic Audits
- Tools: All tools
- Purpose: Comprehensive security assessment
- Frequency: Weekly/monthly
๐ Sample Outputs
For a current snapshot produced from the infra-demo fixture, see: SAMPLE_OUTPUTS.md.
๐ค Contributing
Contributions are welcome! Please feel free to submit pull requests or open issues for bugs and feature requests.
โค๏ธ Support
If this toolkit saves you time, consider fueling development with an energy drink.
- Prefer one-time tips? Koโfi: https://ko-fi.com/jmogaming
- When youโre ready, replace the badge target with your preferred platform: GitHub Sponsors (industry standard), Open Collective, Ko-fi, or Stripe Checkout.
- GitHub Sponsors integrates directly with your GitHub profile and repository sidebar once enabled.
๐ License
Dual licensed under your choice of MIT OR Apache 2.0. See LICENSE, LICENSE-MIT, and LICENSE-APACHE.
๐ Related Resources
- TruffleHog Documentation (verified secrets scanning)
- Semgrep Documentation (multi-language SAST)
- Trivy Documentation (vulnerability + misconfig scanning)
- OWASP ZAP Documentation (DAST web security)
- Falco Documentation (runtime security monitoring)
- Start Small: Test on a single repository first
- Review Regularly: Schedule periodic audits
- Act Quickly: Rotate verified secrets immediately
- Prevent Issues: Implement pre-commit hooks
- Monitor Trends: Track metrics over time
๐ Troubleshooting
Common Issues
Problem: Tools not found
- Solution: Run
make verify-env(orjmotools setup --check) to verify installation and get platform-specific hints
Problem: JSON parsing errors
- Solution: Ensure jq is installed and tools are outputting valid JSON
Problem: Permission denied
- Solution: Ensure scripts are executable:
find scripts -type f -name "*.sh" -exec chmod +x {} +
Problem: Out of memory
- Solution: Scan repositories in smaller batches
./scripts/core/populate_targets.sh --unshallow
Problem: Path errors (e.g., "//run_security_audit.sh not found")
- Solution: This issue has been fixed in the latest version. Update to the latest main branch.
- The wrapper scripts now use absolute paths computed from the script's real path location.
Problem: AttributeError when generating dashboard with TruffleHog results
- Solution: This has been fixed. The dashboard generator now handles all TruffleHog output formats:
- JSON arrays:
[{...}, {...}] - Single objects:
{...} - NDJSON (one object per line)
- Empty files or missing files
- Nested arrays
- JSON arrays:
Rebuilding Reports Without Re-Scanning
You can regenerate the dashboard or reports from existing scan results without re-running the security tools:
# Generate dashboard with default output location
python3 scripts/core/generate_dashboard.py /path/to/results
# Generate dashboard with custom output path (creates parent directories automatically)
python3 scripts/core/generate_dashboard.py /path/to/results /custom/path/dashboard.html
# Example: Generate dashboard in a reports directory
python3 scripts/core/generate_dashboard.py ~/security-results-20251010-120000 ~/reports/security-dashboard.html
This is useful when you want to:
- Update the dashboard after manually editing JSON files
- Generate multiple dashboards with different configurations
- Share results by exporting to a specific location
Last Updated: October 16th, 2025 (v0.6.0) Author: James Moceri
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file jmo_security-0.8.0.tar.gz.
File metadata
- Download URL: jmo_security-0.8.0.tar.gz
- Upload date:
- Size: 213.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
da81f04c92e8505ac56219e7c0c79d3da1a5e694c1c5ffe8ed45746e22396b71
|
|
| MD5 |
58d9575877ca71715f3f9744c9f2700c
|
|
| BLAKE2b-256 |
6705f4a61e0fa6c28158954956374fd9b0aa4eac28165fabf99582841cda1f06
|
Provenance
The following attestation bundles were made for jmo_security-0.8.0.tar.gz:
Publisher:
release.yml on jimmy058910/jmo-security-repo
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
jmo_security-0.8.0.tar.gz -
Subject digest:
da81f04c92e8505ac56219e7c0c79d3da1a5e694c1c5ffe8ed45746e22396b71 - Sigstore transparency entry: 647836298
- Sigstore integration time:
-
Permalink:
jimmy058910/jmo-security-repo@5b7f3a0b6d444609be3ce33d3b9f7bd8a164e9c3 -
Branch / Tag:
refs/tags/v0.8.0 - Owner: https://github.com/jimmy058910
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@5b7f3a0b6d444609be3ce33d3b9f7bd8a164e9c3 -
Trigger Event:
push
-
Statement type:
File details
Details for the file jmo_security-0.8.0-py3-none-any.whl.
File metadata
- Download URL: jmo_security-0.8.0-py3-none-any.whl
- Upload date:
- Size: 216.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
15e38e7f969cfc015c9593ea0e6130f3d4f62b0b3f5d4a1aeb34316e96ae3b9c
|
|
| MD5 |
5679aaa13249995c3e47c73258fc6c26
|
|
| BLAKE2b-256 |
ebd6824dcf65abddf6b56c3d507c8f9c2f91138669c40aaa1c0f5fc2c9153d5e
|
Provenance
The following attestation bundles were made for jmo_security-0.8.0-py3-none-any.whl:
Publisher:
release.yml on jimmy058910/jmo-security-repo
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
jmo_security-0.8.0-py3-none-any.whl -
Subject digest:
15e38e7f969cfc015c9593ea0e6130f3d4f62b0b3f5d4a1aeb34316e96ae3b9c - Sigstore transparency entry: 647836336
- Sigstore integration time:
-
Permalink:
jimmy058910/jmo-security-repo@5b7f3a0b6d444609be3ce33d3b9f7bd8a164e9c3 -
Branch / Tag:
refs/tags/v0.8.0 - Owner: https://github.com/jimmy058910
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@5b7f3a0b6d444609be3ce33d3b9f7bd8a164e9c3 -
Trigger Event:
push
-
Statement type: