Vulneravilidad grave en Duplicator

Una vulnerabilidad activa en el plugin duplicador recientemente parcheado afecta a más de 1 millón de sitios

Descripción: Descarga de archivos arbitrarios no autenticados
Plugin afectado: Duplicator
Versiones afectadas: <= 1.3.26
CVSS Score: 7.5 (High)
CVSS Vector: CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
Patched Version: 1.3.28

Recientemente se emitió una actualización de seguridad crítica para Duplicator, uno de los complementos más populares en el ecosistema de WordPress. Más de un millón de sitios de WordPress se vieron afectados por una vulnerabilidad que permitía a los atacantes descargar archivos arbitrarios de los sitios de las víctimas. Instamos a todos los usuarios de Duplicator a actualizar a la versión 1.3.28 lo antes posible.

Análisis de vulnerabilidad de descarga de archivos

El plugin Duplicator ayuda a los administradores del sitio a migrar y copiar sitios de WordPress. Parte de esta funcionalidad implica exportar contenido de bases de datos y archivos a archivos portátiles. Cuando un administrador crea una nueva copia de su sitio, Duplicator les permite descargar los archivos generados desde su panel de control de WordPress.

Captura de pantalla de una solicitud de descarga de Duplicator.

Esto se implementó como una solicitud AJAX dentro de la interfaz de administración de Duplicator. Los botones de descarga activan una llamada al controlador AJAX de WordPress con la acción duplicator_download y un parámetro de archivo, que indica la ubicación del archivo a descargar. Al hacer clic, el archivo solicitado se descarga y el usuario no necesita salir o volver a cargar su página actual.

public static function duplicator_download() {
        $file = sanitize_text_field($_GET['file']);
        $filepath = DUPLICATOR_SSDIR_PATH.'/'.$file;
        // Process download
        if(file_exists($filepath)) {
            // Clean output buffer
            if (ob_get_level() !== 0 && @ob_end_clean() === FALSE) {
                @ob_clean();
            }
 
            header('Content-Description: File Transfer');
            header('Content-Type: application/octet-stream');
            header('Content-Disposition: attachment; filename="'.basename($filepath).'"');
            header('Expires: 0');
            header('Cache-Control: must-revalidate');
            header('Pragma: public');
            header('Content-Length: ' . filesize($filepath));
            flush(); // Flush system output buffer
 
            try {
                $fp = @fopen($filepath, 'r');
                if (false === $fp) {
                    throw new Exception('Fail to open the file '.$filepath);
                }
                while (!feof($fp) && ($data = fread($fp, DUPLICATOR_BUFFER_READ_WRITE_SIZE)) !== FALSE) {
                    echo $data;
                }
                @fclose($fp);
            } catch (Exception $e) {
                readfile($filepath);
            }
            exit;
        } else {
            wp_die('Invalid installer file name!!');
        }
    }
 

Lamentablemente, la acción duplicator_download se registró a través de wp_ajax_nopriv_ y fue accesible para usuarios no autenticados. Para empeorar las cosas, ninguna validación limita las rutas de archivos que se descargan. El parámetro del archivo se pasa a través de sanitize_text_field y se agrega a la constante del complemento DUPLICATOR_SSDIR_PATH, pero el recorrido del directorio aún era posible. Un atacante podría acceder a archivos fuera del directorio previsto de Duplicator enviando valores como ../../../file.php para navegar por la estructura de archivos del servidor.

Además de la acción AJAX, existía la misma vulnerabilidad en la función duplicator_init () de Duplicator, que se llama mediante el enlace de inicio de WordPress.

function duplicator_init() {
    if (isset($_GET['action']) && $_GET['action'] == 'duplicator_download') {
        $file = sanitize_text_field($_GET['file']);