{"id":259735,"date":"2026-01-28T10:11:59","date_gmt":"2026-01-28T10:11:59","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/vulnity-security\/"},"modified":"2026-04-01T21:24:53","modified_gmt":"2026-04-01T21:24:53","slug":"vulnity","status":"publish","type":"plugin","link":"https:\/\/sk.wordpress.org\/plugins\/vulnity\/","author":23395477,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.2.3","stable_tag":"1.2.3","tested":"6.9.4","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"Vulnity Security","header_author":"Vulnity","header_description":"Security monitoring and SIEM integration for WordPress","assets_banners_color":"eef1f4","last_updated":"2026-04-01 21:24:53","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":5,"author_block_rating":0,"active_installs":0,"downloads":325,"num_ratings":1,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.5":{"tag":"1.0.5","author":"manuelgalan","date":"2026-01-28 10:11:25"},"1.1.7":{"tag":"1.1.7","author":"manuelgalan","date":"2026-02-12 14:05:37"},"1.1.8":{"tag":"1.1.8","author":"manuelgalan","date":"2026-02-12 19:50:27"},"1.1.9":{"tag":"1.1.9","author":"manuelgalan","date":"2026-02-13 11:25:32"},"1.2.0":{"tag":"1.2.0","author":"manuelgalan","date":"2026-03-09 13:47:46"},"1.2.1":{"tag":"1.2.1","author":"manuelgalan","date":"2026-03-09 14:12:40"},"1.2.2":{"tag":"1.2.2","author":"manuelgalan","date":"2026-03-24 19:40:39"},"1.2.3":{"tag":"1.2.3","author":"manuelgalan","date":"2026-04-01 21:24:53"}},"upgrade_notice":{"1.2.3":"<p>Critical stability fixes: prevents admin lockout from firewall, reduces SIEM request timeouts, fixes uninstall leaving broken .htaccess, and expands REST API compatibility with popular plugins.<\/p>","1.2.2":"<p>Fixes bidirectional auto-update sync with the SIEM: corrects authentication headers, dedup hashing, version tracking, and update trigger logic.<\/p>","1.2.1":"<p>Maintenance release with Plugin Check compatibility fixes.<\/p>","1.2.0":"<p>Fixes login URL validation and cron cleanup on disconnect.<\/p>","1.1.9":"<p>Whitelist IPs are now sent to the SIEM during pairing to prevent them from being lost on sync.<\/p>","1.1.8":"<p>Nginx warning now shows only once and includes a link to the solution documentation.<\/p>","1.1.7":"<p>Deactivation now fully clears all cron jobs and .htaccess markers, including events re-scheduled by alert hooks.<\/p>","1.1.5":"<p>Fixes a multisite uninstall query edge case that could log an SQL warning.<\/p>","1.1.4":"<p>Uninstall cleanup now removes Vulnity firewall\/log folders recursively so nothing is left behind.<\/p>","1.1.3":"<p>Improved uninstall cleanup for firewall\/log folders in restrictive hosting environments.<\/p>","1.1.2":"<p>New rotating Vulnity logs plus safer firewall storage warnings and cleanup behavior for shared hosting.<\/p>","1.1.1":"<p>Conservative <code>.htaccess<\/code> cleanup update: Vulnity now removes only its own marker blocks on deactivation and leaves user rules untouched.<\/p>","1.1.0":"<p>Stability and compatibility update focused on safer lifecycle handling and cleaner admin UX.<\/p>","1.0.5":"<p>Version bump to 1.0.5.<\/p>","1.0.4":"<p>Version bump to 1.0.4.<\/p>","1.0.3":"<p>Compliance-focused update to align asset loading, documentation, and escaping with WordPress.org guidelines.<\/p>","1.0.2":"<p>Initial public release featuring Vulnity SIEM integration and security monitoring dashboard.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":1},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3497049,"resolution":"128x128","location":"assets","locale":""},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3497049,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3448570,"resolution":"1544x500","location":"assets","locale":""},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3448566,"resolution":"772x250","location":"assets","locale":""}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.5","1.1.7","1.1.8","1.1.9","1.2.0","1.2.1","1.2.2","1.2.3"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3460705,"resolution":"1","location":"assets","locale":""},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3460705,"resolution":"2","location":"assets","locale":""},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3460705,"resolution":"3","location":"assets","locale":""},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3460705,"resolution":"4","location":"assets","locale":""},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3460705,"resolution":"5","location":"assets","locale":""},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3460705,"resolution":"6","location":"assets","locale":""}},"screenshots":{"1":"Dashboard overview with real-time threat summary.","2":"Alert detail screen showing remediation steps.","3":"Settings page for configuring API credentials and scan schedules."},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[44486,5603,600,254825],"plugin_category":[54],"plugin_contributors":[254826],"plugin_business_model":[],"class_list":["post-259735","plugin","type-plugin","status-publish","hentry","plugin_tags-intrusion-detection","plugin_tags-monitoring","plugin_tags-security","plugin_tags-siem","plugin_category-security-and-spam-protection","plugin_contributors-manuelgalan","plugin_committers-manuelgalan"],"banners":{"banner":"https:\/\/ps.w.org\/vulnity\/assets\/banner-772x250.png?rev=3448566","banner_2x":"https:\/\/ps.w.org\/vulnity\/assets\/banner-1544x500.png?rev=3448570","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/vulnity\/assets\/icon-128x128.png?rev=3497049","icon_2x":"https:\/\/ps.w.org\/vulnity\/assets\/icon-256x256.png?rev=3497049","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/vulnity\/assets\/screenshot-1.png?rev=3460705","caption":"Dashboard overview with real-time threat summary."},{"src":"https:\/\/ps.w.org\/vulnity\/assets\/screenshot-2.png?rev=3460705","caption":"Alert detail screen showing remediation steps."},{"src":"https:\/\/ps.w.org\/vulnity\/assets\/screenshot-3.png?rev=3460705","caption":"Settings page for configuring API credentials and scan schedules."},{"src":"https:\/\/ps.w.org\/vulnity\/assets\/screenshot-4.png?rev=3460705","caption":""},{"src":"https:\/\/ps.w.org\/vulnity\/assets\/screenshot-5.png?rev=3460705","caption":""},{"src":"https:\/\/ps.w.org\/vulnity\/assets\/screenshot-6.png?rev=3460705","caption":""}],"raw_content":"<!--section=description-->\n<p>Vulnity Security brings enterprise-grade threat detection to WordPress. It connects your site to Vulnity's SIEM platform, correlates events, and alerts you before issues become incidents.<\/p>\n\n<h4>Features<\/h4>\n\n<ul>\n<li>Real-time security event collection and forwarding to Vulnity SIEM.<\/li>\n<li>Dashboard widgets that highlight critical findings and remediation steps.<\/li>\n<li>Scheduled security scans for core files, plugins, and themes.<\/li>\n<li>Centralized logging compatible with major SOC workflows.<\/li>\n<\/ul>\n\n<h4>Integration Requirements<\/h4>\n\n<p>To receive alerts, configure an API token and endpoint URL provided by your Vulnity SIEM account. Detailed configuration instructions are displayed after activating the plugin under <strong>Vulnity &#062; Settings<\/strong>.<\/p>\n\n<h4>External Services<\/h4>\n\n<p>This plugin connects to Vulnity's external API hosted on Supabase Edge Functions (domain: <code>euxnoekqasvzwfcbybkg.supabase.co<\/code>, base URL <code>https:\/\/euxnoekqasvzwfcbybkg.supabase.co\/functions\/v1<\/code>) to power SIEM alerts, inventory sync, and mitigation updates.<\/p>\n\n<ul>\n<li><strong>What the service is and what it is used for:<\/strong>\n\n<ul>\n<li>Vulnity SIEM API for pairing\/unpairing, heartbeat checks, sending alerts, testing connectivity, syncing inventory, and receiving mitigation policies.<\/li>\n<\/ul><\/li>\n<li><strong>Endpoints used:<\/strong>\n\n<ul>\n<li><code>\/pair-plugin<\/code>, <code>\/unpair-plugin<\/code> (pairing and disconnecting the site).<\/li>\n<li><code>\/heartbeat<\/code> (periodic health check).<\/li>\n<li><code>\/connection-test<\/code> (manual connection test).<\/li>\n<li><code>\/scan-site-info<\/code> (inventory sync).<\/li>\n<li><code>\/generic-alert<\/code>, <code>\/brute-force-alert<\/code>, <code>\/file-security-alert<\/code>, <code>\/manage-user<\/code>, <code>\/user-management-alert<\/code>, <code>\/permission-change-alert<\/code>, <code>\/file-editor-alert<\/code>, <code>\/plugin-change-alert<\/code>, <code>\/theme-change-alert<\/code>, <code>\/core-update-alert<\/code>, <code>\/suspicious-query-alert<\/code>, <code>\/scanner-detected-alert<\/code> (security alerts).<\/li>\n<li><code>\/mitigation-config<\/code>, <code>\/mitigation-update<\/code> (mitigation policy sync and block\/unblock updates).<\/li>\n<\/ul><\/li>\n<li><strong>What data is sent and when:<\/strong>\n\n<ul>\n<li>Pairing\/unpairing: site ID, pair code, plugin\/WordPress\/PHP versions, and timestamp when pairing or disconnecting occurs.<\/li>\n<li>Heartbeat: site ID, URLs, site metadata (name, language, timezone, theme), and runtime info (plugin\/WordPress\/PHP versions, latency) on a scheduled interval.<\/li>\n<li>Alerts: site ID, alert type\/severity, timestamps, and event details (such as IP address, user\/action metadata, or file change context) whenever a security event is detected.<\/li>\n<li>Inventory sync: site inventory details (installed plugins\/themes\/core metadata) when inventory sync runs.<\/li>\n<li>Mitigation: site ID, block\/unblock actions, IP address, reason, duration, and rule metadata when mitigation rules are synced or enforcement actions occur.<\/li>\n<\/ul><\/li>\n<li><strong>Why the data is sent:<\/strong>\n\n<ul>\n<li>To associate the site with your Vulnity account, deliver security alerts to the SIEM, validate connectivity, synchronize inventory and mitigation policies, and keep firewall enforcement consistent.<\/li>\n<\/ul><\/li>\n<li><strong>Policies:<\/strong> See the Vulnity <a href=\"https:\/\/vulnity.io\/terms\">Terms of Service<\/a> and <a href=\"https:\/\/vulnity.io\/privacy\">Privacy Policy<\/a> for details on how data is handled.<\/li>\n<\/ul>\n\n<h3>License<\/h3>\n\n<p>This plugin is licensed under the GNU General Public License v2.0 or later. You are free to redistribute and\/or modify it under the terms of the GPL as published by the Free Software Foundation. The complete license text is included in the bundled <code>license.txt<\/code> file and is also available online at https:\/\/www.gnu.org\/licenses\/gpl-2.0.html.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin files to the <code>\/wp-content\/plugins\/vulnity<\/code> directory or install from the WordPress plugin repository.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> screen in WordPress.<\/li>\n<li>Navigate to <strong>Vulnity &#062; Settings<\/strong>, enter your Vulnity SIEM credentials, and save.<\/li>\n<li>(Optional) Enable scheduled scans on the <strong>Monitoring<\/strong> tab to receive weekly reports.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20a%20vulnity%20siem%20subscription%3F\"><h3>Do I need a Vulnity SIEM subscription?<\/h3><\/dt>\n<dd><p>Yes. The plugin requires an active Vulnity SIEM account to collect and analyze events.<\/p><\/dd>\n<dt id=\"will%20the%20plugin%20slow%20down%20my%20site%3F\"><h3>Will the plugin slow down my site?<\/h3><\/dt>\n<dd><p>No. Event collection runs asynchronously and offloads processing to the Vulnity cloud platform.<\/p><\/dd>\n<dt id=\"can%20i%20disable%20certain%20alerts%3F\"><h3>Can I disable certain alerts?<\/h3><\/dt>\n<dd><p>Absolutely. Use the <strong>Alert Policies<\/strong> section within the plugin settings to mute or reclassify events.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.3<\/h4>\n\n<ul>\n<li>Fixed firewall bootstrap blocking wp-login.php, wp-cron.php, admin-ajax.php, and xmlrpc.php for blocked IPs \u2014 admins can now recover access.<\/li>\n<li>Fixed firewall bootstrap returning HTML instead of JSON for REST API requests from blocked IPs.<\/li>\n<li>Fixed uninstall leaving broken .htaccess when file is read-only \u2014 now creates safe stub to prevent HTTP 500.<\/li>\n<li>Fixed early IP blocking (plugins_loaded:0) intercepting AJAX and REST requests, breaking admin panel functionality.<\/li>\n<li>Reduced SIEM alert timeout from 10s to 3s to prevent page hangs during attacks.<\/li>\n<li>Reduced inventory sync timeout from 30s to 8s to prevent random slow page loads via pseudo-cron.<\/li>\n<li>Improved file detection in Protect Common Paths \u2014 now handles query strings, trailing slashes, and dotted directory names correctly.<\/li>\n<li>Added PHP execution blocking rule for uploads directory in generated Nginx configuration snippet.<\/li>\n<li>Expanded REST API public route whitelist: added WooCommerce v3, UpdraftPlus, BackWPup, Elementor, Forminator, FluentForms, SureCart, MailPoet, and block editor endpoints.<\/li>\n<li>Added <code>Options -Indexes<\/code> to Protect Common Paths .htaccess rules as defense-in-depth measure.<\/li>\n<li>Updated Stable tag from 1.2.2 to 1.2.3.<\/li>\n<\/ul>\n\n<h4>1.2.2<\/h4>\n\n<ul>\n<li>Fixed anti-collapse dedup system blocking subsequent auto-update state toggle events due to identical hash.<\/li>\n<li>Fixed wrong authentication headers for <code>\/real-time-alerts<\/code> endpoint (now uses HMAC-SHA256 signature instead of token).<\/li>\n<li>Fixed missing <code>remediation<\/code> field in auto-update state events sent to the SIEM.<\/li>\n<li>Fixed <code>version_old<\/code> not captured in auto-update events; now recorded via <code>upgrader_pre_install<\/code> hook before files are replaced.<\/li>\n<li>Fixed auto-update trigger running on disable; updates now only fire for newly enabled component types.<\/li>\n<li>Fixed auto-update event detection using <code>instanceof WP_Automatic_Updater<\/code> instead of <code>wp_doing_cron()<\/code> for broader compatibility.<\/li>\n<li>Fixed single-file plugin slug resolving to <code>.<\/code> (e.g. hello-dolly) in update event payloads.<\/li>\n<li>Added <code>triggered_by<\/code> field to update events: <code>siem_manual<\/code>, <code>siem_auto_update<\/code>, or <code>wp_auto_updater<\/code>.<\/li>\n<li>Auto-update toggles in the admin panel are now read-only; changes must be made from the SIEM.<\/li>\n<li>Replaced <code>parse_url()<\/code> with <code>wp_parse_url()<\/code> for WordPress coding standards compliance.<\/li>\n<\/ul>\n\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>Plugin Check compatibility improvements for filesystem and nonce-related warnings.<\/li>\n<li>Runtime validation improvements for scanner detection, file editor monitoring, and firewall state serialization.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Fixed login URL rename validation against existing pages\/posts and reserved WordPress routes.<\/li>\n<li>Fixed uninstall cron cleanup to use <code>wp_unschedule_hook()<\/code> for complete removal.<\/li>\n<li>Fixed heartbeat, mitigation sync, and alert buffer crons not cancelled on plugin disconnect.<\/li>\n<\/ul>\n\n<h4>1.1.9<\/h4>\n\n<ul>\n<li>Send whitelist IPs (user public IP + localhost) to the SIEM during pairing so the whitelist persists after synchronization.<\/li>\n<\/ul>\n\n<h4>1.1.8<\/h4>\n\n<ul>\n<li>Fixed Nginx warning notice appearing repeatedly on every admin page load; it now displays only once.<\/li>\n<li>Improved notice format: each protected path is shown on its own line for better readability.<\/li>\n<li>Added link to solution documentation for Nginx .htaccess compatibility.<\/li>\n<\/ul>\n\n<h4>1.1.7<\/h4>\n\n<ul>\n<li>Fixed deactivation not clearing all cron jobs (4 missing hooks, plus events re-scheduled by late-firing alert hooks).<\/li>\n<li>Added <code>final_deactivation_cleanup<\/code> at priority 9999 to ensure complete cron and .htaccess cleanup after all hooks fire.<\/li>\n<li>Replaced <code>wp_clear_scheduled_hook<\/code> with <code>wp_unschedule_hook<\/code> to clear single events with arguments.<\/li>\n<li>Added native PHP fallback for .htaccess marker removal when WP_Filesystem is unavailable.<\/li>\n<li>Fixed Plugin Check error: replaced direct <code>is_writable()<\/code> with <code>vulnity_path_is_writable()<\/code> and <code>WP_Filesystem_Direct<\/code>.<\/li>\n<\/ul>\n\n<h4>1.1.5<\/h4>\n\n<ul>\n<li>Fix uninstall multisite cleanup query when <code>sitemeta<\/code> table is not available to prevent SQL warnings in debug.log.<\/li>\n<\/ul>\n\n<h4>1.1.4<\/h4>\n\n<ul>\n<li>Ensure uninstall removes Vulnity firewall\/log folders recursively so no plugin-owned folders are left behind.<\/li>\n<\/ul>\n\n<h4>1.1.3<\/h4>\n\n<ul>\n<li>Ensure uninstall removes Vulnity firewall\/log folders even when permissions are restrictive by attempting safe chmod before cleanup.<\/li>\n<\/ul>\n\n<h4>1.1.2<\/h4>\n\n<ul>\n<li>Added a dedicated Vulnity log with line-based rotation and safe fallbacks when uploads are not writable.<\/li>\n<li>Added admin warning when firewall storage cannot be written, with clear remediation guidance.<\/li>\n<li>Expanded uninstall cleanup to remove Vulnity log files and firewall artifacts across fallback paths.<\/li>\n<\/ul>\n\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Fixed deactivation cleanup so Vulnity hardening marker blocks are removed fully from <code>.htaccess<\/code> without modifying user-defined rules.<\/li>\n<li>Improved deactivation safety in shared hosting environments with conservative, marker-only rollback behavior.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Improved admin UI consistency across Dashboard, Synchronization, Mitigation, Hardening, and Setup screens.<\/li>\n<li>Hardened plugin lifecycle behavior for shared hosting compatibility and safer deactivation\/uninstall flows.<\/li>\n<li>Added conservative server integration safeguards to reduce side effects in Apache\/Nginx environments.<\/li>\n<\/ul>\n\n<h4>1.0.5<\/h4>\n\n<ul>\n<li>Version bump to 1.0.5.<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>Version bump to 1.0.4.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Standardized admin asset enqueues and AJAX URL localization for compliant loading.<\/li>\n<li>Hardened nonce and capability checks across alerts and admin handlers.<\/li>\n<li>Improved path resolution using WordPress APIs for non-default installs.<\/li>\n<li>Documented external Supabase services used for alerts and mitigation updates.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Security monitoring and SIEM integration that keeps your WordPress sites safe in real time.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/sk.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/259735","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sk.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/sk.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/sk.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=259735"}],"author":[{"embeddable":true,"href":"https:\/\/sk.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/manuelgalan"}],"wp:attachment":[{"href":"https:\/\/sk.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=259735"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/sk.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=259735"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/sk.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=259735"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/sk.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=259735"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/sk.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=259735"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/sk.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=259735"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}