Ferruccio - WordPress Plugin Analysis Tool
Ferruccio is a static analysis tool designed to scan WordPress plugins (directories or zip files) and generate security reports for developers and security auditors. It prioritizes high-confidence detections while offering a "suspicious" mode for deeper manual review.
Features
- Smarter PHP Analysis:
- Tracks function scopes to accurately verify AJAX handlers (nonce/capability checks).
- Detects SQL injection (unprepared
$wpdbcalls). - Detects XSS (unscaped
echo/print). - Detects insecure file uploads and object injection (
unserialize).
- JavaScript Analysis:
- Detects DOM XSS (
innerHTML,document.write). - Flags dangerous functions (
eval,setTimeoutwith strings). - Checks for hardcoded secrets.
- Detects DOM XSS (
- Attack Surface Mapping: Lists actions, filters, REST routes, and shortcodes.
- Multiple Formats: Outputs reports in Text, Markdown, or JSON.
- Extensible: Supports custom config files and offline vulnerability databases.
Installation
Requires Python 3.8+.
pip install ferruccio
Usage
CLI
# Check version
ferruccio --version
# Scan a single plugin (zip or directory)
ferruccio scan plugin.zip --wp-version 6.7 --php-version 8.2 --format text
# Scan all plugins in a directory (parallel execution)
ferruccio scan --all ./wp-content/plugins --threads 6 --format markdown > report.md
# Include low-confidence hints
ferruccio scan plugin.zip --include-suspicious --format json
# Use a config file and vulnerability DB
ferruccio scan plugin.zip --config .ferruccio.yml --vuln-db advisories.json
Library
from pathlib import Path
from ferruccio import scan_path, Scanner
# Simple scan
report = scan_path("plugin.zip", strict=True)
print(report.metadata.name, len(report.findings))
# Advanced usage
scanner = Scanner(strict=False, include_suspicious=True)
project = scanner.scan_plugins_dir(Path("./wp-content/plugins"))
print(project.summary)
Configuration
You can customize the scanner using a .ferruccio.yml file:
strict: true
include_suspicious: false
ignore_paths:
- "tests/*"
- "vendor/*"
deny_sinks:
"system": "Command injection risk"
License
MIT License. See LICENSE for details.
Release files for ferruccio 114.514.1919
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| ferruccio-114.514.1919.tar.gz | 19.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ferruccio-114.514.1919-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 41.8 kB
Release files / ferruccio-114.514.1919.tar.gz
| Download URL | ferruccio-114.514.1919.tar.gz |
|---|---|
| Size | 19.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1433a71a8af69ed928af5fd24c2b3451fc09c3c42df908f9069febce320cc81e
|
|
BLAKE2b-256 checksum How to use checksums |
acf171882be6a089cf90f66d42b36fcfcf61847414883b0aa7fe99e8914aeb7b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.3
|
Release files / ferruccio-114.514.1919-py3-none-any.whl
| Download URL | ferruccio-114.514.1919-py3-none-any.whl |
|---|---|
| Size | 22.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
0e8d9e03f8a008bd26680e91051438ccf718d88fc64ae8ad1c2b128412157049
|
|
BLAKE2b-256 checksum How to use checksums |
c450a12985a23e4415df9172fd3cab8ba2c21a14ceb927fbf1be2d724a9c42fc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.3
|