Skip to main content

RAGGuard

Static security scanner for RAG pipelines. Finds injection vulnerabilities, hardcoded secrets, auth gaps, and more in Python codebases.

Built from real-world security audits of production RAG frameworks.

PyPI License Python

Install

pip install ragsec

Or from source:

git clone https://github.com/HrushiYadav/ragGuard.git
cd ragguard
pip install -e .

Usage

# Terminal output (default)
ragguard scan ./path/to/codebase

# Generate reports
ragguard scan ./path/to/codebase --output report.md --format markdown
ragguard scan ./path/to/codebase --output report.html --format html
ragguard scan ./path/to/codebase --output report.sarif --format sarif

# Filter by severity or category
ragguard scan ./path/to/codebase --severity high
ragguard scan ./path/to/codebase --category filter-injection

What it detects

11 scanners covering the most common vulnerability patterns in RAG/LLM codebases:

Scanner Severity CWE What it finds
Filter Injection HIGH CWE-94 f-string interpolation in Milvus, Valkey, Azure, Elasticsearch filter expressions
NoSQL Injection HIGH CWE-943 Unvalidated dict values in MongoDB/Elasticsearch queries
SQL Injection HIGH CWE-89 f-string SQL construction (INSERT, DELETE, SELECT, UPDATE)
Hardcoded Secrets HIGH CWE-798 API keys (OpenAI, AWS, GitHub, GitLab, Slack), hardcoded passwords
SSRF HIGH CWE-918 User-controlled URLs in requests, httpx, aiohttp, urllib
Insecure Deserialization HIGH CWE-502 yaml.load without SafeLoader, marshal, jsonpickle, shelve
Command Injection HIGH CWE-78 os.system/popen with f-strings, subprocess with shell=True
Secret Logging MEDIUM CWE-532 API keys, passwords, connection strings in logger calls
Auth Gaps MEDIUM CWE-306 FastAPI/Flask routes without auth (AST-based), client-controlled user IDs (IDOR)
Insecure TLS MEDIUM CWE-295 verify=False, disabled certificate validation, cleartext HTTP
Resource Safety MEDIUM-HIGH CWE-502 pickle deserialization, zip bombs, tar extraction, eval/exec

Example output

RAGGuard scanning ./my-rag-app

RG-001 [HIGH] Filter injection: Possible filter expression injection
  vector_stores/store.py:42
  > conditions.append(f'(metadata["{key}"] == "{value}")')

RG-002 [HIGH] NoSQL injection: Filter value passed into query
  vector_stores/mongo.py:89
  > filter_dict["payload." + key] = value

RG-003 [HIGH] Hardcoded secret: OpenAI API key
  config.py:12
  > OPENAI_KEY = "sk-proj-abc123..."

      Summary
+------------------+
| Severity | Count |
|----------+-------|
| HIGH     |    12 |
| MEDIUM   |     8 |
| LOW      |     5 |
| Total    |    25 |
+------------------+

HTML Report

Generate a styled HTML report for sharing:

ragguard scan ./my-rag-app --output report.html --format html

Dark theme with severity badges, code snippets, and remediation guidance.

SARIF Output

For CI/CD integration and GitHub Code Scanning:

ragguard scan ./my-rag-app --output report.sarif --format sarif

Configuration

Create ragguard.toml (or .ragguard.toml) in your project root:

[ragguard]
ignore_paths = ["tests/", "migrations/"]
disable_scanners = ["secret-logging"]
min_severity = "MEDIUM"
Option Description
ignore_paths Path substrings to skip
disable_scanners Scanner categories to disable
min_severity Minimum severity to report (HIGH, MEDIUM, LOW)

Inline Suppression

Suppress a specific finding with an inline comment:

api_key = os.environ.get("OPENAI_KEY", "sk-hardcoded")  # ragguard: ignore

Development

pip install -e .
pytest tests/ -v
ruff check ragguard/

See CONTRIBUTING.md for details on adding new scanners.

License

Apache-2.0

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ragsec-0.3.0.tar.gz (22.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ragsec-0.3.0-py3-none-any.whl (29.8 kB view details)

Uploaded Python 3

File details

Details for the file ragsec-0.3.0.tar.gz.

File metadata

  • Download URL: ragsec-0.3.0.tar.gz
  • Upload date:
  • Size: 22.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.5

File hashes

Hashes for ragsec-0.3.0.tar.gz
Algorithm Hash digest
SHA256 efe8e92db59fc92aef43c45a21e95900a1c4fb39520488a720965f85f7c69745
MD5 4b6cf666de86f35ee04e95aec7328798
BLAKE2b-256 184d3b559887e0beb5eec2cff50123d4a3042073c3a1907b7b4fcc45d2312019

See more details on using hashes here.

File details

Details for the file ragsec-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: ragsec-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 29.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.5

File hashes

Hashes for ragsec-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 9b9584df61743ed085ef4d4f57b8c38ab11516b0ef15fbc752afa5450e20a0a7
MD5 68c8bf77bb24cfc11835bd43777dce9b
BLAKE2b-256 7fe1b551f471246c798a218d21f62c3c09194b4b3976b5ce406ca03600672415

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page