Apocalypse Meow v21.7.5
License: WTFPL
WordPress: v4.4+
PHP: v7.3+
Released: 2024-04-03

Apocalypse Meow

Apocalypse Meow is a simple, light-weight collection of tools to harden WordPress security and help mitigate common types of attacks.

Its main focus is addressing WordPress security issues related to user accounts and logins. This includes things like:

Security is an admittedly technical subject, but Apocalypse Meow strives to help educate "normal" users about the nature of common web attacks, mitigation techniques, etc. Every option contains detailed explanations and links to external resources with additional information.

Knowledge is power!


Due to the advanced nature of some of the plugin features, there are a few additional server requirements beyond what WordPress itself requires:

Multi-Server Setup

Apocalypse Meow tracks login history in the database. If your WordPress site is spread across multiple load-balanced servers, they must share access to a master database, or else tracking will only occur on a per-node basis.

Log Monitoring

Some robots are so dumb they'll continue trying to submit credentials even after the login form is replaced, wasting system resources and clogging up the log-in history table. One way to mitigate this is to use a server-side log-monitoring program like Fail2Ban or OSSEC to ban users via the firewall.

Apocalypse Meow produces a 403 error when a banned user requests the login form. Your log-monitoring rule should therefore look for repeated 403 responses to wp-login.php. Additionally, some robots are unable to follow redirects; if your login form requires SSL, you should also ban repeated 301/302 responses to catch those fools.

If you have enabled user enumeration protection with the die() option, requests for ?author=X will produce a 400 response code which can be similarly tracked.


Is this plugin compatible with WPMU?

No, sorry. This plugin may only be installed on single-site WordPress instances.

How does the Community Pool Blocklist Work?

The Community Pool is a new opt-in feature that combines attack data from your site with other sites running in pool mode to produce a global blocklist.

In other words, an attack against one becomes an attack against all!

The blocklist data is conservatively filtered using a tiered and weighted ranking system based on activity shared within the past 24 hours. For an IP address to be eligible for community banning, it must be independently reported from multiple sources and have a significant amount of total failures.

Your site's whitelist is always respected. Failures from whitelisted IPs will never be sent to the pool, and if the pool declares a ban for an IP you have whitelisted, your site will not ban it.

For more information, check out the Community Pool settings page.

How do I unban a user?

The Login Activity page will show any active bans in the top/right corner. You can click the button corresponding to the victim to remove the ban.

If you accidentally banned yourself and cannot access the backend, you have a few options:

Remember: you can (and should) whitelist any IP addresses that you commonly log in from. This is done through the Settings pgae.

Can I see the passwords people tried when logging in?

Of course not! Haha. Apocalypse Meow is here to solve security problems, not create them. Only usernames and IP addresses are stored.

Will the brute-force log-in prevention work if my server is behind a proxy?

As of version 1.5.0, it is now possible to specify an alternative $_SERVER variable Apocalypse Meow should use to determine the visitor's "true" IP. It is important to note, however, that depending on how that environmental variable is populated, the value might be forgeable. Nonetheless, this should be better than nothing!

I am seeing "You are running Vue in development mode." in the console?

This informational message appears on Apocalypse Meow admin pages if your site is running in WP_DEBUG mode. This version of Vue.js can provide more useful information for debugging Javascript-related issues.

When WP_DEBUG is set to FALSE (which should be the case for any production sites), the leaner production version of Vue.js is loaded instead. :)