Observed since 20 Oct, 23:19 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
Security auditing tool for LLM agents, RAG pipelines, and agent frameworks
v0.1 — Security auditing tool for LLM agents, RAG pipelines, and agent frameworks.
Agent Security Scanner is an open-source security research tool designed to audit AI agents, LLM-powered applications, and RAG (Retrieval-Augmented Generation) pipelines for security misconfigurations and vulnerabilities.
This tool helps security teams, developers, and researchers identify potential security risks in AI systems before they reach production.
Security Misconfiguration Scanning
Prompt Injection Detection
Tool Calling Boundary Validation
RAG Pipeline Security
Comprehensive Reporting
git clone https://github.com/Cybathreat/agent-security-scanner.git
cd agent-security-scanner
python -m venv venv
source venv/bin/activate # Linux/macOS
# or: venv\Scripts\activate # Windows
pip install -r requirements.txt
# Run a full scan (all modules)
python -m src.cli scan --target https://api.example.com/agent --output output/
# Run specific modules only
python -m src.cli scan --target https://api.example.com/agent --modules prompt_injection,rag_security
# JSON report only
python -m src.cli scan --target https://api.example.com/agent --format json --output output/
# Markdown report only
python -m src.cli scan --target https://api.example.com/agent --format markdown --output output/
python -m src.cli scan --target <url> [options]
Options:
--target, -t Target URL or API endpoint (required)
--modules, -m Comma-separated modules to run (default: all)
Choices: misconfigurations, prompt_injection, tool_boundaries, rag_security
--output, -o Output directory for reports (default: output)
--format, -f Report format: json | markdown | both (default: both)
--config, -c Path to YAML config file
--timeout Request timeout in seconds (default: 30)
--verbose, -v Enable verbose output (includes evidence in reports)
--log-level DEBUG | INFO | WARNING | ERROR (default: INFO)
--dry-run Load config and modules without executing scan
Generate a default config file:
python -m src.cli config --generate
Or create config/config.yaml manually:
scanner:
timeout: 30
max_retries: 3
rate_limit: 10.0 # requests per second
verify_ssl: true
modules:
prompt_injection:
enabled: true
sensitivity: high
detect_obfuscation: true
rag_security:
enabled: true
check_poisoning: true
check_exfiltration: true
vector_db_scan: true
tool_boundaries:
enabled: true
check_permissions: true
audit_sandbox: true
misconfigurations:
enabled: true
check_auth: true
check_cors: true
check_rate_limiting: true
check_info_disclosure: true
output:
format: both
output_dir: output
verbose: false
logging:
level: INFO
Configuration can be overridden via environment variables using the ASS_ prefix:
export ASS_SCANNER_TIMEOUT=60
export ASS_SCANNER_VERIFY_SSL=false
export ASS_LOG_LEVEL=DEBUG
export ASS_OUTPUT_FORMAT=json
src/
├── core/
│ ├── engine.py # Scan orchestration — module selection and lifecycle
│ ├── config.py # YAML + environment variable configuration loader
│ └── logging.py # Structured logging via loguru
├── modules/
│ ├── base.py # BaseModule ABC, Finding, ScanResult, Severity
│ ├── misconfigurations.py
│ ├── prompt_injection.py
│ ├── tool_boundaries.py
│ └── rag_security.py
├── output/
│ ├── json_report.py # Structured JSON reports
│ └── markdown_report.py # Human-readable Markdown reports
└── cli.py # Command-line interface
The ScanEngine class in src/core/engine.py can be used programmatically:
from src.core.config import load_config
from src.core.engine import ScanEngine
config = load_config("config/config.yaml")
engine = ScanEngine(config)
results = engine.run(
target="https://api.example.com/agent",
modules=["prompt_injection", "misconfigurations"],
timeout=30,
)
{
"$schema": "https://github.com/Cybathreat/agent-security-scanner/schema/report/v1",
"report_id": "uuid",
"generated_at": "2026-03-23T10:00:00Z",
"scanner": { "name": "Agent Security Scanner", "version": "0.1.0" },
"target": "https://api.example.com/agent",
"summary": {
"total": 5,
"critical": 1,
"high": 2,
"medium": 1,
"low": 1,
"risk_score": 42
},
"findings": [
{
"id": "FIND-promptinjection-a1b2c3d4",
"severity": "HIGH",
"category": "promptinjection",
"title": "Direct Prompt Injection Vulnerability",
"description": "...",
"cwe": "CWE-94",
"owasp_ref": "OWASP LLM01:2024 - Prompt Injection",
"mitre_ref": "MITRE ATLAS - TA0045 LLM Attack",
"recommendation": "..."
}
],
"frameworks": {
"owasp_llm_top_10": { "OWASP LLM01:2024 - Prompt Injection": ["FIND-..."] },
"mitre_atlas": { "MITRE ATLAS - TA0045 LLM Attack": ["FIND-..."] }
}
}
Reports include an executive summary, findings overview table, detailed findings with remediation guidance, and a module status summary. Pass --verbose to include raw evidence per finding.
# Run all tests with coverage
pytest tests/ -v --cov=src --cov-report=html
# Unit tests only
pytest tests/unit/ -v
# Integration tests only
pytest tests/integration/ -v
src/modules/ inheriting from BaseModulescan(target, **kwargs) -> ScanResult methodsrc/core/engine.py — add to ALL_MODULES and _build_module()src/core/config.pyThis tool is for security research and educational purposes. Use responsibly and only against systems you are authorised to test. See DISCLAIMER.md for complete legal disclaimers.
MIT License — see LICENSE for details.
Ahmed Chiboub (Cybathreat)
Contributions welcome! Please read our contributing guidelines and submit PRs.
pypistats · 47 observations shown. Missing days are unknown. Source category: overall: without mirrors.
| Date / source period | Value | Observed at |
|---|---|---|
| 2026-10-20 – 2026-10-20 | 3 | 2026-10-21T15:58:26.3012863Z |
| 2026-10-19 – 2026-10-19 | 1 | 2026-10-21T15:58:26.3012863Z |
| 2026-10-18 – 2026-10-18 | 5 | 2026-10-21T15:58:26.3012863Z |
| 2026-10-17 – 2026-10-17 | 7 | 2026-10-21T15:58:26.3012863Z |
| 2026-10-16 – 2026-10-16 | 1 | 2026-10-21T15:58:26.3012863Z |
| 2026-10-15 – 2026-10-15 | 4 | 2026-10-21T15:58:26.3012863Z |
| 2026-10-14 – 2026-10-14 | 2 | 2026-10-21T15:58:26.3012863Z |
| 2026-10-13 – 2026-10-13 | 1 | 2026-10-21T15:58:26.3012863Z |
| 2026-10-12 – 2026-10-12 | 2 | 2026-10-21T15:58:26.3012863Z |
| 2026-10-11 – 2026-10-11 | 3 | 2026-10-21T15:58:26.3012863Z |
| 2026-10-09 – 2026-10-09 | 3 | 2026-10-21T15:58:26.3012863Z |
| 2026-10-06 – 2026-10-06 | 1 | 2026-10-21T15:58:26.3012863Z |
| 2026-10-04 – 2026-10-04 | 2 | 2026-10-21T15:58:26.3012863Z |
| 2026-10-02 – 2026-10-02 | 1 | 2026-10-21T15:58:26.3012863Z |
| 2026-09-30 – 2026-09-30 | 1 | 2026-10-21T15:58:26.3012863Z |
| 2026-09-27 – 2026-09-27 | 1 | 2026-10-21T15:58:26.3012863Z |
| 2026-09-26 – 2026-09-26 | 3 | 2026-10-21T15:58:26.3012863Z |
| 2026-09-23 – 2026-09-23 | 1 | 2026-10-21T15:58:26.3012863Z |
| 2026-09-22 – 2026-09-22 | 1 | 2026-10-21T15:58:26.3012863Z |
| 2026-09-21 – 2026-09-21 | 2 | 2026-10-21T15:58:26.3012863Z |
| 2026-09-20 – 2026-09-20 | 1 | 2026-10-21T15:58:26.3012863Z |
| 2026-09-19 – 2026-09-19 | 2 | 2026-10-21T15:58:26.3012863Z |
| 2026-09-17 – 2026-09-17 | 1 | 2026-10-21T15:58:26.3012863Z |
| 2026-09-16 – 2026-09-16 | 2 | 2026-10-21T15:58:26.3012863Z |
| 2026-09-14 – 2026-09-14 | 2 | 2026-10-21T15:58:26.3012863Z |
| 2026-09-10 – 2026-09-10 | 1 | 2026-10-21T15:58:26.3012863Z |
| 2026-09-07 – 2026-09-07 | 1 | 2026-10-21T15:58:26.3012863Z |
| 2026-09-01 – 2026-09-01 | 1 | 2026-10-21T15:58:26.3012863Z |
| 2026-08-31 – 2026-08-31 | 1 | 2026-10-21T15:58:26.3012863Z |
| 2026-08-29 – 2026-08-29 | 1 | 2026-10-21T15:58:26.3012863Z |
| 2026-08-28 – 2026-08-28 | 1 | 2026-10-21T15:58:26.3012863Z |
| 2026-08-26 – 2026-08-26 | 1 | 2026-10-21T15:58:26.3012863Z |
| 2026-08-25 – 2026-08-25 | 1 | 2026-10-21T15:58:26.3012863Z |
| 2026-08-24 – 2026-08-24 | 5 | 2026-10-21T15:58:26.3012863Z |
| 2026-08-23 – 2026-08-23 | 3 | 2026-10-21T15:58:26.3012863Z |
| 2026-08-21 – 2026-08-21 | 2 | 2026-10-21T15:58:26.3012863Z |
| 2026-08-18 – 2026-08-18 | 1 | 2026-10-21T15:58:26.3012863Z |
| 2026-08-17 – 2026-08-17 | 2 | 2026-10-21T15:58:26.3012863Z |
| 2026-08-15 – 2026-08-15 | 2 | 2026-10-21T15:58:26.3012863Z |
| 2026-08-14 – 2026-08-14 | 4 | 2026-10-21T15:58:26.3012863Z |
| 2026-08-09 – 2026-08-09 | 2 | 2026-10-21T15:58:26.3012863Z |
| 2026-08-04 – 2026-08-04 | 2 | 2026-10-21T15:58:26.3012863Z |
| 2026-08-02 – 2026-08-02 | 1 | 2026-10-21T15:58:26.3012863Z |
| 2026-07-27 – 2026-07-27 | 4 | 2026-10-21T15:58:26.3012863Z |
| 2026-07-26 – 2026-07-26 | 2 | 2026-10-21T15:58:26.3012863Z |
| 2026-07-24 – 2026-07-24 | 1 | 2026-10-21T15:58:26.3012863Z |
| 2026-07-23 – 2026-07-23 | 4 | 2026-10-21T15:58:26.3012863Z |
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 0.1.0 | 23 Mar 2026 | 9 |
This describes our collected data; it is not a security assessment.
Shared repository data · GitHub
Observed since 20 Oct, 23:19 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:2ad064ce0f32da2da578e65e1e751778d8a2c642c5d997e86c4b33a04761fc9f