Releases: reportedip/honeypot-server
v1.3.2
Fixed
Retry-storm protection for the report pipeline.
- Exponential backoff on all transient failures, not just HTTP 429: now covers 5xx server errors, 408 (Request Timeout), 499 (nginx "Client Closed Request") and cURL/connection errors. Previously the server kept hammering an overloaded API on 502/503/499 with no backoff, amplifying the overload.
- Backoff state is now persisted to
data/report_backoff.json. Under the web-cron model every page visit builds a freshReportClient, so the former in-memory backoff never survived a single request and was effectively useless. - 499 and 408 are no longer permanent rejections — such reports are retried after a backoff instead of being dropped.
- Rate limit (default 60/min) is now persisted to
data/report_ratelimit.jsonand advanced atomically viaflock, enforcing the cap globally across all requests/processes instead of within a single client instance. ReportQueuestops batches cleanly while a backoff or rate limit is active, instead of inflating thefailed_attemptscounter without sending anything.
v1.3.1
Korrekturen an der Webhooks-Seite
- "Payload Format"-Karte korrigiert: Die Beschreibung "Every delivery is an HTTP POST with Content-Type: application/json" galt seit v1.3.0 nicht mehr — HTTP-Methode, Header und Body-Format sind pro Webhook konfigurierbar. Der Text beschreibt jetzt das Default-JSON-Format korrekt als einen von drei Modi
- Payload-Beispiel zeigt die tatsächliche Anwendungsversion (dynamisch) statt einer hartcodierten Versionsnummer
- Quick Presets (AbuseIPDB, Slack, Discord) ersetzen jetzt auch eine bereits eingetragene Endpoint-URL; das Generic-JSON-Preset lässt die URL unverändert
v1.3.0
Flexible Webhooks — Reporting an AbuseIPDB und andere Dritt-APIs
Das Webhook-System kann jetzt beliebige externe APIs bedienen. Pro Webhook konfigurierbar:
- HTTP-Methode: POST, PUT, PATCH oder GET
- Eigene HTTP-Header (z. B. API-Keys) — eine Zeile pro Header, überschreiben die Defaults
- Body-Format:
json— strukturiertes Detection-Payload (wie bisher, Default)form— flache Key/Value-Felder alsapplication/x-www-form-urlencodedcustom— frei definierbares Body-Template mit Platzhaltern
- Platzhalter in Body-Template und URL:
{{ip}},{{categories}},{{abuseipdb_categories}},{{comment}},{{severity}},{{analyzers}},{{uri}},{{method}},{{user_agent}},{{host}},{{timestamp}},{{version}},{{event}}— jeweils auch als_url- und_json-Variante
AbuseIPDB-Integration
{{abuseipdb_categories}} übersetzt reportedip.de-Kategorien automatisch in AbuseIPDB-Kategorie-IDs (1–23 sind identisch, die CMS-Kategorien 24–58 werden auf die nächstliegenden Äquivalente gemappt, z. B. WP Login Brute Force auf Brute-Force + Web App Attack). Im Admin-Formular gibt es Quick-Presets für AbuseIPDB, Slack, Discord und Generic JSON — Preset wählen, API-Key eintragen, fertig.
Test-Deliveries senden die Loopback-IP 127.0.0.1, damit Abuse-Datenbanken den Test ablehnen statt einen echten Report zu speichern.
Sonstiges
- Schema-Migration läuft automatisch (neue Spalten in
honeypot_webhooks) - Mehrere Detections pro Request werden aggregiert (Kategorien vereinigt, Severity = Maximum, Kommentare zusammengeführt)
- 363 Tests (11 neue), End-to-End verifiziert inkl. echtem Angriff gegen den Honeypot mit korrekt gemapptem AbuseIPDB-Report
Enthält außerdem alle Fixes aus v1.2.1 (Autoloader-Fallback, opcache-Reset nach Self-Update).
v1.2.1
Hotfix: HTTP 500 auf der Webhooks-Seite nach Update auf 1.2.0
Installationen mit einem Composer-Autoloader in vendor/ (geschützter Pfad beim Self-Update) liefen nach dem Update auf 1.2.0 in einen "Class not found"-Fatal (HTTP 500) auf /_hp_admin/webhooks: Die veraltete optimierte Classmap kennt die in 1.2.0 neu hinzugekommenen Klassen nicht.
Fixes
public/index.phpundcli.phpregistrieren den eingebauten PSR-4-Fallback-Autoloader jetzt immer — auch wennvendor/autoload.phpexistiert. Neue Klassen werden damit unabhängig vom Zustand der Composer-Classmap gefundenUpdateManagerführt nach dem Dateitauschclearstatcache()undopcache_reset()aus, damit ersetzte Dateien sofort wirken und kein Mix aus altem und neuem Code im opcache verbleibt
Hinweis für betroffene Installationen
Nach dem Update auf 1.2.1 funktioniert die Webhooks-Seite wieder. Falls der opcache des Servers validate_timestamps=0 nutzt, einmalig PHP-FPM neu laden. Alternativ kann auf dem Server composer dump-autoload ausgeführt oder das vendor/-Verzeichnis entfernt werden (das Projekt hat keine externen Abhängigkeiten).
v1.2.0
Webhooks — externe Report-Ziele
Neuer Admin-Menüpunkt Webhooks: Detections können in Echtzeit als JSON-POST an eigene Logging-/SIEM-Systeme weitergeleitet werden.
- Filter pro Webhook nach Kategorie-IDs und/oder Analyzer-Namen (ODER-Logik, leer = alle Detections)
- Optionale HMAC-SHA256-Signatur über den Request-Body (
X-ReportedIP-Signature: sha256=<HMAC>) - Test-Button, Zustellstatus und Fehlerzähler pro Webhook im Admin-Panel
- Zustellung erfolgt nach dem Senden der Trap-Response — keine Verzögerung für den Angreifer
- Neue Tabelle
honeypot_webhooks, Migration läuft automatisch beim ersten Request - Payload-Format und Signatur-Verifikation sind in der README dokumentiert
API-Kommunikation
- Reports Richtung reportedip.de senden jetzt immer die aktuelle Version: dynamischer
User-Agent: reportedip-honeypot-server/<version>(statt hartcodiert 1.0.0) plus neuer HeaderX-Honeypot-Version
Fixes
- Cloudflare IPv6:
IpResolverkannte nur die IPv4-Ranges von Cloudflare. Bei IPv6-Origin-Verbindungen wurdeCF-Connecting-IPignoriert und die Cloudflare-Edge-IP statt der echten Angreifer-IP gemeldet (API-Ablehnungip_whitelisted). Jetzt sind alle offiziellen IPv6-Ranges enthalten — wirkt nach dem Update sofort, ohne Anpassung derconfig.php - HeaderAnomaly False Positive:
::1wurde als ungeankerter Substring gematcht und flaggte legitime IPv6-Adressen (z. B.2a06:98c0:3600::103) als Loopback. Die Loopback-Erkennung vergleicht jetzt jeden X-Forwarded-For-Eintrag exakt - Report-Queue: permanent abgelehnte Reports (HTTP 4xx außer 429) werden als
sent=2aus der Queue genommen statt endlos retried — vorher blockierten sie per Head-of-line-Blocking alle neuen Reports config.example.phpund Web-Installer enthalten die Cloudflare-IPv6-Ranges imtrusted_proxies-Default
Tests
352 Tests (22 neue), zusätzlich End-to-End-Verifikation der Webhook-Zustellung gegen einen lokalen HTTP-Receiver (Signatur, Filterung, Fehlerfälle).
v1.1.3
Dashboard-Refactor
- Activity-Chart: Range-Tabs für 24h / 7 Tage / 30 Tage (server-seitig aggregiert, kein AJAX/Reload).
- Queue Processing: zeigt jetzt die letzten 5 fehlgeschlagenen Reports mit IP, URI, Failure-Reason und Versuchszähler. Failure-Metadaten werden direkt am Log-Eintrag persistiert (
failed_attempts,last_failure_at,last_failure_reason) via idempotenterALTER TABLE-Migration. - Schärferer Visitor-Detector: Trap-Routen (
login,admin,vuln,register,xmlrpc,api) werden jetzt auch ohne Analyzer-Treffer alshackerklassifiziert.good_botundai_agentbleiben geschützt.
WordPress-Install-Defaults
- Neue Klasse
Content/WordPressDefaultsseedet die kanonischen WP-Fresh-Install-Inhalte: Hello world!-Beitrag, Sample Page, Privacy Policy — mit echtem Gutenberg-Block-Markup, in Englisch oder Deutsch je nachcontent_language. - One-shot Seeding via Marker-Datei (respektiert manuelle Löschungen). Hook im WebInstaller (Neuinstallation) und in
App::__construct(Bestandsinstallationen werden beim ersten Boot nachgeseedet). - Kanonische URLs jetzt routbar:
/sample-page/,/privacy-policy/,/hello-world/,/?p=N,/?page_id=N. ContentUrlGeneratorunterscheidetcontent_type=page(Top-Level-Permalink) vonpost(Datums-Archiv-URL)./wp-sitemap.xmlals Alias zur Sitemap;robots.txtfür WordPress verweist auf das WP-5.5-Standard-Sitemap-Schema.
Footer-Backlink
- Dezenter
Protected by reportedip.de-Link in allen 11 Frontend-Templates (WordPress/Drupal/Joomla × home/content/404/login). Stil bewusst zurückhaltend (font-size 11px, opacity 0.7).
Infra/Dev-Workflow
- Docker compose: Live-Mount des gesamten Repos in den Container — Code-Änderungen ohne Rebuild.
- nginx.conf: korrektes
try_filesmit$uriund$query_string-Fallback. - WebCronProcessor-Batchgröße 2 → 5.
.gitignorebehältdata/- unddata/cache/-Ordnerstruktur via.gitkeep-Marker.
Tests
- 325 Unit-Tests grün.
v1.1.2
Bug Fixes
- Fix false-positive detection on static assets: Browser-fetched CSS, JS, images and fonts from honeypot templates no longer trigger the detection pipeline. A normal
page visit no longer generates 10+ false attack logs. - Fix visitor logging: Human visitors are now always logged. Good bots and AI agents (GPTBot, ClaudeBot etc.) retain their classification instead of being overwritten
to 'hacker'.
Improvements
- Category-based cooldown per IP: Prevents duplicate reports for the same IP + category combination (configurable via category_cooldown_minutes).
- AI agents treated as legitimate bots: GPTBot, ClaudeBot, PerplexityBot and other AI agents now get safe-bot treatment on content pages.
- Static assets routed as 'misc': /wp-content/ static assets (theme CSS, plugin JS, images) are routed as misc instead of vuln.
- Default log_human_visitors changed to true for new installations.
v1.1.1
What's New
Realistic WordPress Plugin & Theme Emulation
- 10 popular plugins with WPScan-compatible readme.txt (Stable tag, Changelog)
- 3 themes with style.css Version headers including Avada 7.11.4 (known CVEs)
- Plugin/theme CSS/JS references in HTML for WPScan passive detection
- WordPress emoji script fingerprint
- Yoast SEO schema-graph JSON-LD on content pages
Improved Fallback Content
- Realistic DE/EN business website articles
- Updated RSS feed, sitemap, and REST API
- Configurable site identity
Bugfix
- Fixed admin whitelist page showing dashboard instead of whitelist
Upgrade Notes
- Fully backwards compatible - no config changes required
v1.1.0
Added
- Self-update system: automatic version checks via GitHub Releases API every 3 hours (web cron)
- Admin panel "Updates" tab with version status, release notes, system checks, update history, and backup management
- Auto-update toggle (enabled by default) with manual "Check Now" and "Update Now" buttons
- CLI commands:
check-update(query GitHub for new versions) andupdate/update --rollback - Automatic backup before each update with rollback on failure (max 3 backups retained)
- Protected paths:
config/config.php,data/, andvendor/are never overwritten during updates - VERSION file for tracking the current application version
- App version displayed in admin dashboard System Information section
- Update notification badge in admin sidebar when a new version is available
- Config options:
auto_update(bool) andupdate_check_interval(seconds) - 11 new tests for UpdateChecker and UpdateManager (325 total)
Security
- Download URLs validated: HTTPS only, GitHub domains only
- Lock mechanism with 10-minute stale timeout prevents concurrent updates
- Sanity check: extracted archive must contain
src/Core/App.php,VERSION,public/index.php - All admin update actions protected by CSRF tokens
- Backup name input sanitized against path traversal
Fixed
- Auto-update toggle in admin panel now correctly controls auto-update behavior
- VERSION file matches release tag for proper self-update verification