Skip to content

Releases: reportedip/honeypot-server

v1.3.2

17 Jun 20:17

Choose a tag to compare

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 fresh ReportClient, 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.json and advanced atomically via flock, enforcing the cap globally across all requests/processes instead of within a single client instance.
  • ReportQueue stops batches cleanly while a backoff or rate limit is active, instead of inflating the failed_attempts counter without sending anything.

v1.3.1

12 Jun 08:47

Choose a tag to compare

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

12 Jun 08:23

Choose a tag to compare

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 als application/x-www-form-urlencoded
    • custom — 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

12 Jun 08:02

Choose a tag to compare

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.php und cli.php registrieren den eingebauten PSR-4-Fallback-Autoloader jetzt immer — auch wenn vendor/autoload.php existiert. Neue Klassen werden damit unabhängig vom Zustand der Composer-Classmap gefunden
  • UpdateManager führt nach dem Dateitausch clearstatcache() und opcache_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

12 Jun 07:42

Choose a tag to compare

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 Header X-Honeypot-Version

Fixes

  • Cloudflare IPv6: IpResolver kannte nur die IPv4-Ranges von Cloudflare. Bei IPv6-Origin-Verbindungen wurde CF-Connecting-IP ignoriert und die Cloudflare-Edge-IP statt der echten Angreifer-IP gemeldet (API-Ablehnung ip_whitelisted). Jetzt sind alle offiziellen IPv6-Ranges enthalten — wirkt nach dem Update sofort, ohne Anpassung der config.php
  • HeaderAnomaly False Positive: ::1 wurde 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=2 aus der Queue genommen statt endlos retried — vorher blockierten sie per Head-of-line-Blocking alle neuen Reports
  • config.example.php und Web-Installer enthalten die Cloudflare-IPv6-Ranges im trusted_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

03 May 20:31

Choose a tag to compare

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 idempotenter ALTER TABLE-Migration.
  • Schärferer Visitor-Detector: Trap-Routen (login, admin, vuln, register, xmlrpc, api) werden jetzt auch ohne Analyzer-Treffer als hacker klassifiziert. good_bot und ai_agent bleiben geschützt.

WordPress-Install-Defaults

  • Neue Klasse Content/WordPressDefaults seedet die kanonischen WP-Fresh-Install-Inhalte: Hello world!-Beitrag, Sample Page, Privacy Policy — mit echtem Gutenberg-Block-Markup, in Englisch oder Deutsch je nach content_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.
  • ContentUrlGenerator unterscheidet content_type=page (Top-Level-Permalink) von post (Datums-Archiv-URL).
  • /wp-sitemap.xml als Alias zur Sitemap; robots.txt fü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_files mit $uri und $query_string-Fallback.
  • WebCronProcessor-Batchgröße 2 → 5.
  • .gitignore behält data/- und data/cache/-Ordnerstruktur via .gitkeep-Marker.

Tests

  • 325 Unit-Tests grün.

v1.1.2

01 Mar 19:25

Choose a tag to compare

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

28 Feb 12:18

Choose a tag to compare

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

27 Feb 16:17

Choose a tag to compare

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) and update / update --rollback
  • Automatic backup before each update with rollback on failure (max 3 backups retained)
  • Protected paths: config/config.php, data/, and vendor/ 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) and update_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