Vulnerabilități găsite în pluginul WordPress Patreon
Publicat: 2021-03-26În timpul unui audit intern al pluginului Patreon pentru WordPress, echipa Jetpack Scan a găsit câteva puncte slabe care ar permite cuiva să preia un site web.
Aceste vulnerabilități au fost dezvăluite autorilor de pluginuri, care au lansat imediat versiunea 1.7.2, care rezolvă toate aceste probleme. Dacă utilizați o versiune mai veche a pluginului, vă rugăm să actualizați astăzi!
Citiți mai departe pentru toate detaliile tehnice. Dacă îți trece peste cap, nu-ți face griji. Oferim Jetpack Scan pentru a gestiona scanarea programelor malware și upgrade-urile sau eliminarea automată pentru dvs.
Echipa noastră a identificat diferiți vectori de atac, inclusiv vulnerabilitățile Disclosure Local File, Cross-Site Request Forgery (CSRF) și Reflected Cross-Site Scripting (XSS).
Vulnerabilitățile locale de divulgare a fișierelor sunt erori pe care actorii răi le pot folosi pentru a obține acces la informații critice, cum ar fi cheile secrete ale unui site web și acreditările bazei de date. Vulnerabilitățile reflectate de Scripting Cross-Site și Cross-Site Request Forgery sunt probleme care permit atacatorilor să efectueze acțiuni specifice în numele utilizatorilor nebănuiți, păcălindu-i să facă clic pe linkuri rău intenționate.
Dacă sunt exploatate, unele dintre acestea ar putea permite persoanelor rău intenționate să preia site-uri web vulnerabile.
Vulnerabilitatea dezvăluirii fișierelor locale
Versiuni afectate: < 1.7.0
ID CVE: CVE-2021-24227
CVSSv3: 7.5
CWSS: 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 conținea o vulnerabilitate locală de dezvăluire a fișierelor care putea fi abuzată de oricine vizitează site-ul. Folosind acest vector de atac, un atacator ar putea scurge fișiere interne importante precum wp-config.php, care conține acreditări ale bazei de date și chei criptografice utilizate la generarea de nonces și cookie-uri.
Dacă este exploatat cu succes, acest defect de securitate ar putea duce la preluarea completă a site-ului de către actori răi.
XSS reflectat pe formularul de conectare
Versiuni afectate: < 1.7.2
ID 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 conectează la formularul de autentificare WordPress (wp-login.php) și oferă posibilitatea de a permite utilizatorilor să se autentifice pe site folosind contul lor Patreon. Din păcate, o parte din logica de înregistrare a erorilor din spatele scenei a permis ca intrarea controlată de utilizator să fie reflectată pe pagina de conectare, neigienizată.
Pentru a exploata cu succes această vulnerabilitate, un atacator trebuie să-și păcălească victima să viziteze o legătură cu capcane care conține cod Javascript rău intenționat. Deoarece Javascript rulează în contextul browserului victimei, un atacator poate ajusta codul ascuns în acel link pentru a face orice îi permit privilegiile acestui utilizator.
Dacă acest atac reușește împotriva unui administrator, scriptul poate prelua complet site-ul.
XSS reflectat pe acțiunea AJAX „patreon_save_attachment_patreon_level”
Versiuni afectate: < 1.7.2
ID 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>';
Pluginul folosește, de asemenea, un cârlig AJAX pentru a actualiza nivelul de gaj necesar abonaților Patreon pentru a accesa un anumit atașament. Această acțiune este accesibilă pentru conturile de utilizator cu privilegiul „manage_options” (adică numai administratori).

Din păcate, unul dintre parametrii utilizați în acest punct final AJAX nu este igienizat înainte de a fi imprimat înapoi utilizatorului, astfel încât riscul pe care îl reprezintă este același cu vulnerabilitatea anterioară XSS pe care am descris-o.
CSRF permițând atacatorilor să suprascrie/creeze meta utilizator
Versiuni afectate: < 1.7.0
ID 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 );
}
Unele puncte finale nu au validat cererea pe care a primit-o a fost trimisă în urma unei acțiuni legitime din partea unui utilizator, pe care o puteți face folosind nonces. Unul dintre aceste puncte finale neprotejate le-a permis persoanelor răuvoitoare să creeze un link prin capcană care ar suprascrie sau crea metadate arbitrare ale utilizatorului în contul victimei odată vizitat.
Dacă este exploatat, acest bug poate fi folosit pentru a suprascrie meta „wp_capabilities”, care conține rolurile și privilegiile contului de utilizator afectat. Făcând acest lucru, în esență, i-ar bloca pe site, blocându-i să acceseze conținut plătit.
CSRF care permite atacatorilor să deconecteze site-urile de la Patreon
Versiuni afectate: < 1.7.0
ID 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;
}
Aceasta este similară cu ultima vulnerabilitate prin faptul că este același tip de atac (CSRF), dar vizează administratorii. Acest vector de atac particular funcționează ca precedentul. Un atacator trebuie să obțină un administrator conectat pentru a vizita un link special creat.
Deoarece acest punct final specific poate deconecta un site de la Patreon, atacatorii care vizează acest vector de atac pot face și asta, ceea ce ar împiedica sincronizarea noului conținut cu site-ul.
Cronologie
- Încercarea inițială de contact (nereușită) – 4 decembrie
- A doua încercare de contact – 11 decembrie
- Autorii recunosc raportul – 15 decembrie
- Versiunea 1.7.0 este lansată – 5 ianuarie
- Raportăm două probleme suplimentare XSS – 9 martie
- Autorii recunosc al doilea raport – 9 martie
- Versiunea 1.7.2 este lansată – 11 martie
Concluzie
Vă recomandăm să verificați versiunea curentă a pluginului Patreon-Connect pe care îl utilizați pe site-ul dvs. și, dacă nu 1.7.2, să o actualizați cât mai curând posibil!
La Jetpack, muncim din greu pentru a ne asigura că site-urile dvs. sunt protejate de aceste tipuri de vulnerabilități. Pentru a fi cu un pas înaintea oricăror noi amenințări, consultați Jetpack Scan, care include scanarea de securitate și eliminarea automată a programelor malware.
credite
Această dezvăluire de securitate a fost posibilă datorită lui George Stephanis, Fioravante Souza, Miguel Neto, Benedict Singer și Marc Montpas.