Skip to main content
ReDoctor Logo

ReDoctor

The Python ReDoS Vulnerability Scanner — Protect your applications from Regular Expression Denial of Service attacks.

PyPI version Python versions License Tests codecov Downloads

⚠️ License Notice: ReDoctor is licensed under the Business Source License 1.1 (BSL-1.1). Non-commercial use is free. Commercial production use requires a paid license. The code will convert to MIT license on January 9, 2031.


Quick Start • Features • Installation • Usage • Documentation • Contributing


🚨 What is ReDoS?

Regular Expression Denial of Service (ReDoS) is a type of algorithmic complexity attack that exploits the worst-case behavior of regex engines. A vulnerable regex can cause your application to hang for minutes or hours when processing malicious input.

# ⚠️ This innocent-looking regex is VULNERABLE!
import re
pattern = r"^(a+)+$"

# This will hang your application:
re.match(pattern, "a" * 30 + "!")  # Takes exponential time!

ReDoctor detects these vulnerabilities before they reach production.

⚡ Quick Start

# Install
pip install redoctor

# Check a pattern from command line
redoctor '^(a+)+$'
# Output: VULNERABLE: ^(a+)+$ - Complexity: O(2^n)

# Use in Python
from redoctor import check

result = check(r"^(a+)+$")
if result.is_vulnerable:
    print(f"🚨 Vulnerable! Complexity: {result.complexity}")
    print(f"   Attack string: {result.attack}")

✨ Features

🔬 Hybrid Analysis Engine

Combines static automata-based analysis with intelligent fuzzing for comprehensive detection. Catches vulnerabilities that single-approach tools miss.

⚡ Fast & Zero Dependencies

Pure Python with no external dependencies. Runs in milliseconds for most patterns. Compatible with Python 3.6+.

🎯 Accurate Results

Generates proof-of-concept attack strings with complexity analysis (O(n²), O(2ⁿ), etc.). Low false-positive rate through recall validation.

🛡️ Source Code Scanning

Scan your entire Python codebase for vulnerable regex patterns. Integrates with CI/CD pipelines.

📦 Installation

pip install redoctor

Requirements: Python 3.6+ Dependencies: None (pure Python)

🔧 Usage

Command Line Interface

# Check a single pattern
redoctor '^(a+)+$'

# Verbose output with attack details
redoctor '(a|a)*$' --verbose

# Check with flags
redoctor 'pattern' --ignore-case --multiline

# Read patterns from stdin
echo '^(a+)+$' | redoctor --stdin

# Set timeout
redoctor 'complex-pattern' --timeout 30

Exit codes:

  • 0 - Pattern is safe
  • 1 - Pattern is vulnerable
  • 2 - Error occurred

Python API

from redoctor import check, is_vulnerable, Config

# Simple check
result = check(r"^(a+)+$")
print(result.status)        # Status.VULNERABLE
print(result.complexity)    # O(2^n)
print(result.attack)        # 'aaaaaaaaaaaaaaaaaaaaa!'

# Quick vulnerability check
if is_vulnerable(r"(x+x+)+y"):
    print("Don't use this pattern!")

# Access attack pattern details
if result.is_vulnerable:
    attack = result.attack_pattern
    print(f"Prefix: {attack.prefix!r}")
    print(f"Pump: {attack.pump!r}")
    print(f"Suffix: {attack.suffix!r}")

    # Generate attack strings of different lengths
    short_attack = attack.build(10)   # 10 pump repetitions
    long_attack = attack.build(100)   # 100 pump repetitions

# Custom configuration
config = Config(
    timeout=30.0,           # Analysis timeout in seconds
    max_attack_length=4096, # Max attack string length
)
result = check(r"complex-pattern", config=config)

# Quick mode for CI/CD
config = Config.quick()  # 1 second timeout
result = check(pattern, config=config)

Source Code Scanning

Scan your Python codebase for vulnerable regex patterns:

from redoctor.integrations import scan_file, scan_directory

# Scan a single file
vulnerabilities = scan_file("myapp/validators.py")
for vuln in vulnerabilities:
    print(f"{vuln.file}:{vuln.line} - {vuln.pattern}")
    print(f"  Complexity: {vuln.diagnostics.complexity}")

# Scan entire directory
for vuln in scan_directory("src/", recursive=True):
    if vuln.is_vulnerable:
        print(f"🚨 {vuln}")

📊 Complexity Types

ReDoctor classifies vulnerabilities by their time complexity:

Complexity Description Risk Level
O(n) Linear - Safe ✅ Safe
O(n²) Quadratic ⚠️ Moderate
O(n³) Cubic ⚠️ High
O(2ⁿ) Exponential 🚨 Critical

🔍 How It Works

ReDoctor uses a hybrid approach combining two detection methods:

┌─────────────────────────────────────────────────────────────┐
│                     ReDoctor Engine                         │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ┌─────────────────┐         ┌─────────────────┐           │
│  │   Automaton     │         │     Fuzz        │           │
│  │   Checker       │         │    Checker      │           │
│  │                 │         │                 │           │
│  │  • NFA analysis │         │  • VM execution │           │
│  │  • O(n) check   │         │  • Step counting│           │
│  │  • Witness gen  │         │  • Mutation     │           │
│  └────────┬────────┘         └────────┬────────┘           │
│           │                           │                     │
│           └───────────┬───────────────┘                     │
│                       │                                     │
│              ┌────────▼────────┐                            │
│              │ Recall Validator│                            │
│              │ (confirmation)  │                            │
│              └────────┬────────┘                            │
│                       │                                     │
│              ┌────────▼────────┐                            │
│              │   Diagnostics   │                            │
│              │  • Complexity   │                            │
│              │  • Attack string│                            │
│              │  • Hotspot      │                            │
│              └─────────────────┘                            │
└─────────────────────────────────────────────────────────────┘
  1. Automaton Checker: Builds an ε-NFA from the regex and analyzes for ambiguity patterns that cause backtracking.
  2. Fuzz Checker: Executes patterns in a step-counting VM with evolved test strings to detect polynomial/exponential growth.
  3. Recall Validator: Confirms detected vulnerabilities with real execution timing.

📚 Documentation

Full documentation is available at redoctor.getpagespeed.com

🧪 Examples of Vulnerable Patterns

from redoctor import check

# Classic nested quantifier - Exponential O(2^n)
check(r"^(a+)+$")           # VULNERABLE

# Overlapping alternatives - Exponential O(2^n)
check(r"(a|a)*$")           # VULNERABLE

# Polynomial O(n²)
check(r".*a.*a.*")          # VULNERABLE

# Email-like pattern - Often vulnerable
check(r"^([a-zA-Z0-9]+)*@") # VULNERABLE

# Safe patterns
check(r"^[a-z]+$")          # SAFE
check(r"^\d{1,10}$")        # SAFE
check(r"^[A-Z][a-z]*$")     # SAFE

🤝 Contributing

Contributions are welcome! See our Contributing Guide for details.

# Clone the repo
git clone https://github.com/GetPageSpeed/redoctor.git
cd redoctor

# Install development dependencies
pip install -e ".[dev]"

# Run tests
pytest tests/ -x --tb=short

# Run with coverage
make tests

📄 License

ReDoctor is licensed under the Business Source License 1.1 (BSL-1.1).

  • ✅ Free for non-commercial and non-production use
  • ✅ Free for personal projects, education, and research
  • 💼 Commercial production use requires a paid license
  • 🔓 Converts to MIT License on January 9, 2031

🙏 Acknowledgments

  • Inspired by recheck and academic research on ReDoS detection
  • Built with ❤️ by GetPageSpeed

Protect your applications from ReDoS attacks.
⭐ Star on GitHub • 📦 View on PyPI • 📚 Read the Docs

Metadata

Release files for redoctor 0.1.5

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for redoctor 0.1.5
File Size Uploaded Provenance
redoctor-0.1.5.tar.gz 108.6 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for redoctor 0.1.5
File Interpreter ABI Platform
redoctor-0.1.5-py3-none-any.whl Python 3 none any Details

Total release size: 189.1 kB

Release files / redoctor-0.1.5.tar.gz

Download URL redoctor-0.1.5.tar.gz
Size 108.6 kB
Tags Source
SHA-256 checksum
How to use checksums
992aeb5cac07d5c49120dd6b1f1261142f9f534a0352d2a3756a91eb14f55022
BLAKE2b-256 checksum
How to use checksums
c15aae4846be7c0922eea50f9701995eedf298e6cdba3a0a5c665ebdb072d55d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.7

Release files / redoctor-0.1.5-py3-none-any.whl

Download URL redoctor-0.1.5-py3-none-any.whl
Size 80.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
35396cdf4c6d47822170e567a6f79d6614231101ae3b950ed91e372726dd8056
BLAKE2b-256 checksum
How to use checksums
3af2b5b52c4b927e318f736d3bf468932aff0a96be64dba62e2887b5f44cf0a6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.7

Security for redoctor 0.1.5

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page