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 или подозрително изтичане на данни.
 
Тееенкю
Ще се погрижа да ги оправя тези коментари.

Надявам се да ви е полезен колеги
 

Горе