Observed since 21 Oct, 10:13 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
ai-code-guard
Industry-grade security scanner for AI-generated code with AST analysis, taint tracking, and comprehensive vulnerability detection
Industry-grade security scanner for AI-generated code with AST analysis, taint tracking, and LLM-specific vulnerability detection.
AI coding assistants (GitHub Copilot, Claude, ChatGPT, Cursor) are revolutionizing development—but they can introduce security vulnerabilities that slip past code review. AI Code Guard Pro is a next-generation security scanner specifically designed to catch these issues.
| Feature | Basic Scanners | AI Code Guard Pro |
|---|---|---|
| Analysis Method | Regex matching | AST parsing + taint tracking |
| False Positives | High | Reduced via context awareness |
| Secret Detection | Pattern only | Pattern + Shannon entropy |
| Prompt Injection | ❌ Not detected | ✅ Direct + indirect detection |
| Supply Chain | Basic | Typosquatting + dependency confusion |
| Output Formats | Limited | Console, JSON, SARIF, Markdown |
| CI/CD Integration | Basic | Native SARIF for GitHub Security |
pip install ai-code-guard
Or with development dependencies:
pip install ai-code-guard[dev]
# Scan a directory
ai-code-guard scan ./src
# Scan with specific output format
ai-code-guard scan ./src --format sarif -o results.sarif
# Quick CI check
ai-code-guard check ./src
# List all rules
ai-code-guard rules
# Create config file
ai-code-guard init
🛡️ AI Code Guard Pro v1.0.0
Scanning ./my-project...
┌─────────────────────────────────────────────────────────────────────┐
│ 🔴 CRITICAL: SQL Injection Vulnerability │
├─────────────────────────────────────────────────────────────────────┤
│ 📍 src/db/queries.py:42 │
│ │
│ SQL query constructed using f-string interpolation. User-controlled │
│ data may be interpolated directly into the query, enabling SQL │
│ injection attacks. │
│ │
│ Code: query = f"SELECT * FROM users WHERE id = {user_id}" │
│ │
│ ✅ Fix: Use parameterized queries: │
│ cursor.execute('SELECT * FROM users WHERE id = ?', (user_id,)) │
│ │
│ CWE: CWE-89 │
└─────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────┐
│ 🟠 HIGH: Prompt Injection Vulnerability │
├─────────────────────────────────────────────────────────────────────┤
│ 📍 src/api/chat.py:23 │
│ │
│ User input directly embedded in LLM prompt via f-string. Attackers │
│ can inject malicious instructions to manipulate the AI's behavior. │
│ │
│ Code: prompt = f"You are a helper. User says: {user_input}" │
│ │
│ ✅ Fix: │
│ 1. Separate system prompts from user content using message roles │
│ 2. Sanitize user input (remove control characters, limit length) │
│ 3. Use structured output formats to detect injection attempts │
│ │
│ CWE: CWE-74 | OWASP: LLM01 │
└─────────────────────────────────────────────────────────────────────┘
────────────────────────────────────────────────────────────────────────
📊 SUMMARY
────────────────────────────────────────────────────────────────────────
Files scanned 47
Issues found 3
Scan time 127ms
🔴 CRITICAL: 1 🟠 HIGH: 2 🟡 MEDIUM: 0 🔵 LOW: 0
────────────────────────────────────────────────────────────────────────
Create .ai-code-guard.yaml in your project root:
# Minimum severity to report
min_severity: low # critical, high, medium, low, info
# Patterns to ignore
ignore:
- "tests/**"
- "**/test_*.py"
- "examples/**"
- "docs/**"
# Rules to disable
disable_rules: []
# - "SEC001" # If using example API keys
# - "PRI001" # If false positives on prompt construction
# Secret detection tuning
entropy_threshold: 4.5 # Shannon entropy threshold
min_secret_length: 16
# AI-specific detection
detect_placeholder_secrets: true
detect_prompt_injection: true
# Performance
max_file_size_kb: 1024
parallel_workers: 4
name: Security Scan
on: [push, pull_request]
jobs:
security:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.11'
- run: pip install ai-code-guard
- name: Run security scan
run: ai-code-guard scan . --format sarif -o results.sarif --fail-on high
- name: Upload SARIF to GitHub Security
uses: github/codeql-action/upload-sarif@v2
if: always()
with:
sarif_file: results.sarif
# .pre-commit-config.yaml
repos:
- repo: local
hooks:
- id: ai-code-guard
name: AI Code Guard Security Scan
entry: ai-code-guard check
language: python
types: [python]
pass_filenames: false
security-scan:
image: python:3.11
script:
- pip install ai-code-guard
- ai-code-guard scan . --format json -o gl-sast-report.json
artifacts:
reports:
sast: gl-sast-report.json
| Rule ID | Category | Severity | Description |
|---|---|---|---|
| SEC001-015 | Secrets | CRITICAL/HIGH | API keys (OpenAI, AWS, GitHub, Stripe, etc.) |
| SEC020-022 | Secrets | CRITICAL | Private keys (RSA, SSH, PGP) |
| SEC030-031 | Secrets | CRITICAL | Database credentials |
| SEC040 | Secrets | MEDIUM | JWT tokens |
| SEC050 | Secrets | MEDIUM | AI placeholder secrets |
| SEC099 | Secrets | MEDIUM | High-entropy strings |
| INJ001 | Injection | CRITICAL | SQL injection |
| INJ002 | Injection | CRITICAL | Command injection |
| INJ003 | Injection | CRITICAL | Code execution (eval/exec) |
| DES001 | Deserialization | CRITICAL | Unsafe YAML |
| DES002 | Deserialization | CRITICAL | Unsafe pickle |
| SSRF001 | SSRF | HIGH | Server-side request forgery |
| PRI001-005 | Prompt Injection | HIGH | Direct prompt injection |
| PRI006 | Prompt Injection | MEDIUM | User input in prompts |
| PRI010-011 | Prompt Injection | MEDIUM | Indirect injection |
| DEP001 | Dependencies | VARIES | Known suspicious packages |
| DEP002 | Dependencies | HIGH | Typosquatting detection |
| DEP003 | Dependencies | HIGH | Dependency confusion |
Unlike regex-based scanners, AI Code Guard Pro parses Python code into an Abstract Syntax Tree, enabling:
Uses Shannon entropy to distinguish real secrets from placeholders:
# High entropy (likely real secret) - DETECTED
api_key = "sk-proj-aB3xK9mL2pQrStUvWxYz..."
# Low entropy (placeholder) - IGNORED
api_key = "your-api-key-here"
Specifically targets vulnerabilities in AI/LLM applications:
Contributions welcome! See CONTRIBUTING.md for guidelines.
# ai_code_guard_pro/analyzers/my_analyzer.py
from ai_code_guard_pro.models import Finding, Severity, Category
class MyAnalyzer:
def analyze(self) -> list[Finding]:
findings = []
# Your detection logic
return findings
MIT License - see LICENSE for details.
Built for the AI era by security engineers who use AI coding assistants daily 🛡️
Download counts and popularity will appear here as the collector receives them.
| Package / target | Requirement | Relationship |
|---|---|---|
clickEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | click>=8.0.0 | runtime |
gitignore-parserEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | gitignore-parser>=0.1.0 | runtime |
pathspecEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | pathspec>=0.11.0 | runtime |
pyyamlEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | pyyaml>=6.0 | runtime |
richEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | rich>=13.0.0 | runtime |
tomliEnvironment{
"extras": "",
"marker": "python_version < \"3.11\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | tomli>=2.0.0; python_version < "3.11" | runtime |
mypyEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | mypy>=1.0.0; extra == "dev" | runtime |
pre-commitEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | pre-commit>=3.0.0; extra == "dev" | runtime |
pytest-covEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | pytest-cov>=4.0.0; extra == "dev" | runtime |
pytest-xdistEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | pytest-xdist>=3.0.0; extra == "dev" | runtime |
pytestEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | pytest>=7.0.0; extra == "dev" | runtime |
ruffEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | ruff>=0.1.0; extra == "dev" | runtime |
esprimaEnvironment{
"extras": "",
"marker": "extra == \"js\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | esprima>=4.0.0; extra == "js" | runtime |
bdist_wheel · 34.15 KB · Python py3
sdist · 31.07 KB · Python source
Shared repository data · GitHub
Observed since 21 Oct, 10:13 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package_version:7054c696072de89df766a0aea4736be151b71a883bb88e6abb1b4d0b7df5d204