Atlant Security - WordPress плъгин за цялостна защита

Blinky

Owner
Днес попаднах на един много добър плъгин, писан от българи:


Става дума за Atlant Security, който е цялостен плъгин за сигурност на WordPress, който осигурява защита от корпоративен клас чрез 17 интегрирани модула за сигурност, организирани в архитектура за защита на пет нива.

Има фри версия: https://wordpress.org/plugins/atlant-security/

Както и ентърпрайс лиценз.

Скоро мисля да го пробвам и да дам повече информация как работи в реална среда. Ако някой го е ползвал, нека сподели.
 
От кодекс-а

Прегледах кода на Atlant Security 1.1.25. Изводът ми: не изглежда като зловреден плъгин и има доста добре обмислени защити, но не бих го сложил директно на production сайт без staging тест. Има няколко реални архитектурни риска.


Най-важните проблеми​


1. Риск от загуба на данни при миграция — висок​


При миграцията от старите fwwp_* таблици към aswp_*:


  • данните се копират само ако новата таблица е напълно празна;
  • след това старата таблица се изтрива независимо дали съдържа допълнителни записи.

Ако старата и новата таблица имат данни, старите записи могат да бъдат загубени. Същият подход при конфликтни настройки предпочита вече съществуващата нова стойност, която може да е default, пред реалната стара конфигурация.


Това трябва да се преработи с INSERT IGNORE, миграция по първични/уникални ключове и изтриване само след проверка на резултата.


2. Събира прекалено чувствителни данни — висок​


Visitor logger записва:


  • пълния URL, включително query string;
  • IP адрес;
  • referrer;
  • user agent;
  • потребителско име;
  • история до 30 дни по подразбиране.

Така в базата могат да попаднат:


  • reset tokens;
  • tracking и authentication параметри;
  • имейли, ЕГН или други данни от URL;
  • чувствителни REST параметри.

Outbound monitor също пази пълни външни URL адреси. Ако API ключ се предава в query string, той ще бъде записан в лога.


Трябва да има централизирано премахване на чувствителни параметри като token, key, secret, code, nonce, password, signature и възможност query string изобщо да не се пази.


3. Значително натоварване на базата — среден към висок​


При почти всяко посещение плъгинът:


  • проверява настройки;
  • проверява whitelist/blocklist;
  • анализира user agent;
  • евентуално прави GeoIP lookup;
  • записва ред в aswp_visitor_log;
  • после прави допълнителен UPDATE за title/post/status.

На сайт с реален трафик това практически означава поне 1–2 допълнителни SQL операции на request. При твоя случай с oversold shared hosting, Redis timeout-и и ограничени DB connections бих бил особено предпазлив.


4. Rate limiting не е атомарен — среден​


REST limiter използва APCu масив или WordPress transient чрез:


  1. прочитане;
  2. добавяне;
  3. записване.

При няколко едновременни заявки част от обновяванията могат да се загубят. Това позволява реалният лимит да бъде надвишен. За security limiter е по-добре атомарно Redis increment, object-cache lock или SQL операция с уникален bucket.


5. Неточно логване на HTTP статусите — среден​


Request logger се стартира още на init. В този момент повечето заявки изглеждат като HTTP 200. Има специална корекция за 404, но не виждам общо финално обновяване за:


  • 301/302;
  • 401/403;
  • 429;
  • 500 и други грешки.

Следователно статистиката може да показва 200 за заявки, които реално са приключили с друг статус.


6. Security плъгинът има огромна зона на влияние​


Той контролира едновременно:


  • login URL;
  • WAF;
  • IP blocking;
  • REST API;
  • XML-RPC;
  • 2FA;
  • сесии;
  • security headers;
  • cron;
  • файлове и quarantine;
  • външни HTTP заявки.

Това не е директна уязвимост, но един regression може да счупи WooCommerce, Gutenberg, cron, webhooks, update проверки или външни API интеграции. Има safe mode чрез:



define('ASWP_SAFE_MODE', true);


Това е добро решение, но изисква достъп до wp-config.php.


Какво е направено добре​


Кодът е осезаемо по-добър от типичен случаен WordPress security плъгин:


  • AJAX методите обикновено проверяват nonce и capability.
  • Няма видими backdoors, eval, shell изпълнение или прикрито изпращане към съмнителен сървър.
  • 2FA flow има отделен HMAC challenge, ограничение на опитите, cooldown и bcrypt за email/recovery кодовете.
  • Проверява се path traversal преди download/quarantine.
  • Quarantine файловете губят изпълнимото си разширение.
  • Има защита срещу SSRF, IPv6 и DNS rebinding при външни заявки.
  • Cloudflare IP headers не се приемат сляпо.
  • WAF първоначално работи в log mode.
  • Има аварийна процедура срещу заключване на администратора.
  • SQL заявките с входни стойности в повечето случаи използват $wpdb->prepare().

Допълнителни забележки​


  • TOTP secret се пази в чист вид в usermeta. Това е обичайно, защото е необходим за проверката, но при изтичане на базата 2FA защитата пада. Може да се криптира със server-side ключ.
  • Scanner-ът е основно regex-based. Ще има false positives и не трябва автоматично да се приема за еквивалент на професионален malware scanner.
  • REST rate limiting чрез transients може сериозно да пълни wp_options, ако няма persistent object cache.
  • Плъгинът записва голямо количество информация, което изисква поне актуализирана privacy policy и разумна retention настройка.
  • Не успях да пусна автоматичен php -l, защото PHP CLI липсва в средата; анализът е статичен преглед на кода.

Оценка​


ОбластОценка
Видима злонамереностНе открих
Организация на кода7/10
Защитно програмиране8/10
Производителност5/10
Privacy/GDPR4/10
Безопасност при обновяване4/10
Подходящ за директен production installНе

Моята практична присъда: изглежда сериозно разработен, но е прекалено агресивен и комплексен. Бих го тествал на копие на сайта, бих изключил visitor logging или поне query strings, и задължително бих поправил миграцията преди доверено production използване.
 
@Sky тествай моя :D тъкмо го одобриха в репо-то
 
@Sky тествай моя :D тъкмо го одобриха в репо-то
Статичният преглед на ini-protector 1.9.5 изглежда добре. Не открих нещо, което да ме накара да кажа „не го слагай на публичен сайт“.

Оценката ми е приблизително: 8/10 за кодова сигурност. Бих го използвал, но с няколко забележки.

Положителното:

  • Няма eval(), exec(), shell_exec(), system(), скрит PHP payload или подозрителна obfuscation.
  • Няма неизвестни бинарни файлове в ZIP-а.
  • Всички PHP файлове минават php -l без syntax errors.
  • Admin операциите като промяна на настройки, блокиране на IP, integrity действия и update са защитени с capability checks и nonce проверки.
  • REST endpoint-ът /secwp/v1/state не е публично четим. Работи само ако INI WP connector е конфигуриран и използва HMAC проверка + site ID.
  • Собственият update механизъм всъщност тегли само от downloads.wordpress.org, а не от някакъв произволен сървър на разработчика. Допълнително проверява slug, версия и името на плъгина преди инсталация.
  • SQL заявките, които видях, използват $wpdb->prepare() там, където има променливи параметри. Динамичните имена на таблици са вътрешно генерирани, не идват от request.
  • IP блокирането по подразбиране използва REMOTE_ADDR, което е правилният консервативен подход.
  • TOTP secret-ът се криптира с sodium_crypto_secretbox, когато libsodium е наличен.
  • Recovery кодовете се пазят хеширани.
  • ALTCHA е self-hosted.
  • Vulnerability scanner-ът говори с wpvulnerability.net; не видях изпращане на потребителски данни натам.
Има обаче няколко неща, които бих имал предвид:

  1. SECWP_TRUST_PROXY
Има настройка:

define('SECWP_TRUST_PROXY', true);
При включването ѝ плъгинът започва да вярва на:

CF-Connecting-IP
X-Forwarded-For
Това е безопасно само ако origin сървърът реално не може да бъде достъпен директно.

Например ако сайтът е зад Cloudflare, но IP адресът на origin-а е публично достъпен, атакуващ може директно да прати:

X-Forwarded-For: 1.2.3.4
и да подмени адреса, използван от traffic/autoblock системата.

Аз бих оставил SECWP_TRUST_PROXY изключен, освен ако firewall-ът допуска HTTP/HTTPS само от Cloudflare/proxy.

  1. Webhook-ът на File Integrity допуска произволен HTTP/HTTPS адрес
Проверява се само:

http://
https://
Тоест администратор би могъл да сложи примерно:

http://127.0.0.1:...
Технически това е SSRF surface.

Тук рискът е нисък, защото URL може да задава само администратор с manage_options. Но за security plugin бих предпочел да използва wp_safe_remote_post() вместо wp_remote_post().

Това е най-конкретното нещо, което бих поправил в кода.

  1. TOTP fallback към plaintext
Ако libsodium липсва:

if ( ! function_exists( 'sodium_crypto_secretbox' ) ) {
return $plain;
}
Тоест TOTP secret-ът се записва некриптиран в базата.

Не е vulnerability сама по себе си — ако някой вече има DB + WordPress salts, ситуацията така или иначе не е добра — но за security plugin поведението не ми харесва.

На нормален PHP 8.x Linux сървър почти сигурно имаш sodium. Просто бих проверил:

php -m | grep sodium
Трябва да върне:

sodium
  1. Traffic monitor може да стане тежък
Това е по-скоро operational проблем, отколкото security vulnerability.

При включен traffic logging се прави DB insert при почти всяка frontend заявка:

$wpdb->insert(...)
и на приблизително 2% от заявките прави pruning проверки.

Default retention е 90 дни, а default:

MAX_ROWS = 0
тоест няма твърд лимит на броя редове.

На сайт с 1–5 хил. заявки дневно — нищо особено.

На сайт със стотици хиляди HTTP заявки дневно тази таблица може да стане значителна.

Аз бих сложил например:

Retention: 30 days
Max rows: 200000–500000
ако целта е просто security telemetry.

  1. Auto-block бих оставил първо в suggestion mode
Самият автор правилно го е направил така по подразбиране.

Логиката маркира като подозрителни неща като:

404
wp-login POST
/.env
/.git
xmlrpc.php
empty user agent
Това е разумно, но автоматично IP blocking винаги носи риск от false positives.

Затова първоначално:

Auto Block: ON
Enforce: OFF
и след седмица-две гледаш предложенията.

Има и нещо, което специално ми харесва: кодът изглежда писан с мисъл за security, а не просто като marketing „security plugin“. На доста места има allowlists, validation, hash_equals(), wp_safe_redirect(), nonce-и, capability проверки и коментари защо е избран даден подход.

За публичен WordPress сайт бих го пуснал.

Моята конфигурация би била:

2FA ON
Limit login ON
ALTCHA ON
File integrity ON
Vulnerability scan ON
Security headers ON
Info disclosure ON

Traffic monitor ON, но с retention limit
Auto-block Suggest mode първоначално

SECWP_TRUST_PROXY OFF
И задължително бих проверил sodium.

Най-сериозната промяна, която бих предложил на разработчика, е wp_remote_post() за webhook-а да стане wp_safe_remote_post(). След това не виждам очевиден blocker за production публичен сайт.

Това е статичен code audit, не pentest — т.е. не доказва отсъствие на уязвимости, но не открих очевидна RCE, SQL injection, unauthenticated privileged action, backdoor или подозрително изтичане на данни.
 

Горе