Vulnerabilidades encontradas en el plugin de WordPress de Patreon
Publicado: 2021-03-26Durante una auditoría interna del complemento de Patreon para WordPress, el equipo de Jetpack Scan encontró varios puntos débiles que permitirían que alguien se hiciera cargo de un sitio web.
Estas vulnerabilidades fueron reveladas a los autores del complemento, quienes lanzaron rápidamente la versión 1.7.2, que soluciona todos estos problemas. Si está ejecutando una versión anterior del complemento, actualice hoy.
Siga leyendo para conocer todos los detalles técnicos. Si esto se te pasa por la cabeza, no te preocupes. Ofrecemos Jetpack Scan para gestionar el análisis de malware y las actualizaciones o eliminaciones automáticas por usted.
Nuestro equipo identificó varios vectores de ataque, incluidas vulnerabilidades de divulgación de archivos locales, falsificación de solicitudes entre sitios (CSRF) y secuencias de comandos entre sitios reflejadas (XSS).
Las vulnerabilidades de divulgación de archivos locales son errores que los malos actores pueden usar para obtener acceso a información crítica, como las claves secretas de un sitio web y las credenciales de la base de datos. Las vulnerabilidades reflejadas de Cross-Site Scripting y Cross-Site Request Forgery son problemas que permiten a los atacantes realizar acciones específicas en nombre de usuarios desprevenidos engañándolos para que hagan clic en enlaces maliciosos cuidadosamente elaborados.
Si se explotan, algunos de estos podrían permitir que personas malintencionadas se apoderen de sitios web vulnerables.
Vulnerabilidad de divulgación de archivos locales
Versiones afectadas: < 1.7.0
Identificación CVE: CVE-2021-24227
CVSSv3: 7.5
CWS: 83,6
public static function servePatronOnlyImage( $image=false ) {
if ( ( !isset( $image ) OR !$image ) AND isset( $_REQUEST['patron_only_image'] ) ) {
$image = $_REQUEST['patron_only_image'];
}
if ( !$image OR $image == '') {
// This is not a rewritten image request. Exit.
return;
}
if ( !( isset( $_REQUEST['patreon_action'] ) AND $_REQUEST['patreon_action'] == 'serve_patron_only_image' ) ) {
return;
}
$upload_locations = wp_upload_dir();
// We want the base upload location so we can account for any changes to date based subfolders in case there are
$upload_dir = substr( wp_make_link_relative( $upload_locations['baseurl'] ) , 1 );
$image = get_site_url() . '/' . $upload_dir . '/' . $image;
if ( current_user_can( 'manage_options' ) ) {
Patreon_Protect::readAndServeImage( $image );
}
// Below define can be defined in any plugin to bypass core locking function and use a custom one from plugin
// It is independent of the plugin load order since it checks if it is defined.
// It can be defined by any plugin until right before the_content filter is run.
if ( apply_filters( 'ptrn/bypass_image_filtering', defined( 'PATREON_BYPASS_IMAGE_FILTERING' ) ) ) {
Patreon_Protect::readAndServeImage( $image );
}
// Check if the image is protected:
$attachment_id = attachment_url_to_postid( $image );
// attachment_url_to_postid returns 0 if it cant find the attachment post id
if ( $attachment_id == 0 ) {
// Couldnt determine attachment post id. Try to get id from thumbnail
$attachment_id = Patreon_Protect::getAttachmentIDfromThumbnailURL( $image );
//No go. Have to get out and serve the image normally
if ( $attachment_id == 0 OR !$attachment_id ) {
Patreon_Protect::readAndServeImage( $image );
Patreon-Connect contenía una vulnerabilidad de divulgación de archivos locales que cualquiera que visite el sitio podría abusar. Usando este vector de ataque, un atacante podría filtrar archivos internos importantes como wp-config.php, que contiene las credenciales de la base de datos y las claves criptográficas utilizadas en la generación de nonces y cookies.
Si se explota con éxito, esta falla de seguridad podría conducir a una toma completa del sitio por parte de malos actores.
XSS reflejado en el formulario de inicio de sesión
Versiones afectadas: < 1.7.2
Identificación CVE: CVE-2021-24228
CVSSv3: 8.8
CWSS: 80.6
public static function processPatreonMessages() {
$patreon_error = '';
if ( isset( $_REQUEST['patreon_error'] ) ) {
// If any specific error message is sent from Patreon, prepare it
$patreon_error = ' - Patreon returned: ' . $_REQUEST['patreon_error'];
}
if ( isset( $_REQUEST['patreon_message'] ) ) {
return '<p class="patreon_message">' . apply_filters( 'ptrn/error_message', self::$messages_map[ $_REQUEST['patreon_message'] ] . $patreon_error ) . '</p>';
Patreon-Connect se engancha en el formulario de inicio de sesión de WordPress (wp-login.php) y ofrece permitir a los usuarios autenticarse en el sitio usando su cuenta de Patreon. Desafortunadamente, parte de la lógica de registro de errores detrás de la escena permitió que la entrada controlada por el usuario se reflejara en la página de inicio de sesión, sin desinfectar.
Para explotar con éxito esta vulnerabilidad, un atacante necesita engañar a su víctima para que visite un enlace con una trampa explosiva que contiene código Javascript malicioso. Dado que Javascript se ejecuta en el contexto del navegador de la víctima, un atacante puede ajustar el código oculto en ese enlace para hacer lo que le permitan los privilegios de este usuario.
Si este ataque tiene éxito contra un administrador, el script puede apoderarse por completo del sitio.
XSS reflejado en la acción AJAX 'patreon_save_attachment_patreon_level'
Versiones afectadas: < 1.7.2
Identificación CVE: CVE-2021-24229
CVSSv3: 8.8
CWSS: 80.6
$args = array (
'attachment_id' => $attachment_id,
'patreon_level' => $_REQUEST['patreon_attachment_patreon_level'],
'message' => $message,
);
echo self::make_image_lock_interface( $args );
public function make_image_lock_interface( $args = array() ) {
$interface = '';
$interface .= '<div class="patreon_image_lock_modal_content">';
$interface .= '<span class="patreon_image_lock_modal_close">×</span>';
$interface .= ' <form id="patreon_attachment_patreon_level_form" action="/wp-admin/admin-ajax.php" method="post">';
$interface .= '<h1 class="patreon_image_locking_interface_heading">Lock Image</h1>';
$interface .= '<div class="patreon_image_locking_interface_level">';
$interface .= '<span class="patreon_image_locking_interface_input_prefix">$<input id="patreon_attachment_patreon_level" type="text" name="patreon_attachment_patreon_level" value="' . $args['patreon_level'] . '" / ></span>';
El complemento también usa un enlace AJAX para actualizar el nivel de compromiso requerido por los suscriptores de Patreon para acceder a un archivo adjunto determinado. Esta acción es accesible para cuentas de usuario con el privilegio 'manage_options' (es decir, solo administradores).

Desafortunadamente, uno de los parámetros utilizados en este punto final de AJAX no se desinfecta antes de volver a imprimirse para el usuario, por lo que el riesgo que representa es el mismo que el de la vulnerabilidad XSS anterior que describimos.
CSRF que permite a los atacantes sobrescribir/crear meta del usuario
Versiones afectadas: < 1.7.0
Identificación CVE: CVE-2021-24230
CVSSv3: 6.5
CWSS: 42
public function toggle_option() {
if( !( is_admin() && current_user_can( 'manage_options' ) ) ) {
return;
}
$current_user = wp_get_current_user();
$option_to_toggle = $_REQUEST['toggle_id'];
$current_value = get_user_meta( $current_user->ID, $option_to_toggle, true );
$new_value = 'off';
if( !$current_value OR $current_value == 'off' ) {
$new_value = 'on';
}
update_user_meta( $current_user->ID, $option_to_toggle, $new_value );
}
Algunos puntos finales no validaron que la solicitud que recibieron se envió después de una acción legítima de un usuario, lo que puede hacer usando nonces. Uno de estos puntos finales desprotegidos permitió a personas malintencionadas crear un enlace con una trampa explosiva que sobrescribiría o crearía metadatos de usuario arbitrarios en la cuenta de la víctima una vez visitada.
Si se explota, este error se puede usar para sobrescribir el metadato "wp_capabilities", que contiene los roles y privilegios de la cuenta de usuario afectada. Hacer esto esencialmente los bloquearía del sitio, impidiéndoles acceder al contenido pago.
CSRF permite a los atacantes desconectar sitios de Patreon
Versiones afectadas: < 1.7.0
ID de CVE : CVE-2021-24231
CVSSv3: 6.5
CWSS: 26.1
if ( isset( $_REQUEST['patreon_wordpress_action'] ) AND $_REQUEST['patreon_wordpress_action'] == 'disconnect_site_from_patreon' AND is_admin() AND current_user_can( 'manage_options' ) ) {
// Admin side, user is admin level. Perform action:
// To disconnect the site from a particular creator account, we will delete all options related to creator account, but we will leave other plugin settings and post gating values untouched
$options_to_delete = array(
'patreon-custom-page-name',
'patreon-fetch-creator-id',
'patreon-creator-tiers',
'patreon-creator-last-name',
'patreon-creator-first-name',
'patreon-creator-full-name',
'patreon-creator-url',
'patreon-campaign-id',
'patreon-creators-refresh-token-expiration',
'patreon-creator-id',
'patreon-setup-wizard-last-call-result',
'patreon-creators-refresh-token',
'patreon-creators-access-token',
'patreon-client-secret',
'patreon-client-id',
'patreon-setup_is_being_done',
'patreon-setup-done',
'patreon-currency-sign',
);
// Ask the API to delete this client:
$creator_access_token = get_option( 'patreon-creators-access-token', false );
$client_id = get_option( 'patreon-client-id', false );
// Exceptions until v1 v2 transition is complete
$api_version = get_option( 'patreon-installation-api-version' );
if ( $api_version == '1' ) {
// Delete override - proceed with deleting local options
foreach ( $options_to_delete as $key => $value ) {
delete_option( $options_to_delete[$key] );
}
update_option( 'patreon-installation-api-version', '2' );
update_option( 'patreon-can-use-api-v2', true );
wp_redirect( admin_url( 'admin.php?page=patreon_wordpress_setup_wizard&setup_stage=reconnect_0') );
exit;
}
Esta es similar a la última vulnerabilidad en que es el mismo tipo de ataque (CSRF) pero está dirigido a los administradores. Este vector de ataque particular funciona como el anterior. Un atacante necesita que un administrador que haya iniciado sesión visite un enlace especialmente diseñado.
Dado que este punto final específico puede desconectar un sitio de Patreon, los atacantes que se dirijan a este vector de ataque también pueden hacer precisamente eso, lo que evitaría que el contenido nuevo se sincronice con el sitio.
Cronología
- Intento de contacto inicial (fallido) – 4 de diciembre
- Segundo intento de contacto – 11 de diciembre
- Los autores agradecen el informe – 15 de diciembre
- Lanzamiento de la versión 1.7.0 – 5 de enero
- Informamos dos problemas XSS adicionales: 9 de marzo
- Los autores reconocen el segundo informe – 9 de marzo
- Lanzamiento de la versión 1.7.2 – 11 de marzo
Conclusión
Le recomendamos que verifique la versión actual del complemento Patreon-Connect que está utilizando en su sitio y, si no es 1.7.2, ¡actualícelo lo antes posible!
En Jetpack, trabajamos arduamente para asegurarnos de que sus sitios web estén protegidos contra este tipo de vulnerabilidades. Para estar un paso por delante de cualquier nueva amenaza, consulte Jetpack Scan, que incluye análisis de seguridad y eliminación automatizada de malware.
Créditos
Esta divulgación de seguridad fue posible gracias a George Stephanis, Fioravante Souza, Miguel Neto, Benedict Singer y Marc Montpas.