Tiempo de lectura aprox: 5 minutos, 8 segundos
Alerta de Seguridad [20200429] para WordPress.
Según hemos nos han comunicado, el pasado 29 de abril de 2020, se han encontrado varios fallos en la seguridad de tres plugin.
Dado que está de moda una creciente demanda del «eLearning», los complementos para WordPress que permiten la creación de este tipo de plataformas de enseñanza o aprendizaje a distancia, se han multiplicado.
Alerta de Seguridad [20200430] para WordPress.
Los sistemas de gestión de aprendizaje son plataformas de aprendizaje electrónico utilizadas para impartir cursos educativos y programas de formación de forma remota. No solo los estudiantes universitarios usan «LMS»; Es para cualquier persona interesada en el aprendizaje en línea.
Tres de los plugin de «eLearning» más usados, han sido encontrados con fallos en su programación, que puede afectar en grados diferentes a la seguridad tanto de los usuarios, como de los servidores que usen estos plugin.
Incluso si se tiene instalado alguno de Los mejores Plugin de Seguridad para WordPress, hay fallos que no son controlables de esta forma, al menos no siempre.
Es por eso que insisto siempre en que hay que crear plugins con seguridad.
Los tres plugin de WordPress pueden convertir cualquier sitio web en un «LMS» totalmente funcional y fácil de usar. Los 3 sistemas se instalan en más de 100.000 plataformas educativas diferentes e incluyen universidades como la Universidad de Florida, la Universidad de Michigan, la Universidad de Washington y cientos de academias en línea. El impacto se multiplica ya que afecta a todos los estudiantes en todos estos establecimientos.
Según la empresa de seguridad que ha descubierto los agujeros, «Los LMS que investigamos invirtieron bastante esfuerzo en su seguridad y algunos incluso implementaron un programa de recompensa por errores. Y de hecho, los errores que encontramos no eran triviales y requerían de inmersiones interesantes. Por lo tanto, además de notificar a los desarrolladores, también decidimos compartir algunos de ellos con la comunidad de seguridad».
«Nuestro enfoque fue ver si un estudiante motivado puede lograr el sueño de la infancia de cada pirata informático: tomar el control de su institución educativa, obtener respuestas a los exámenes e incluso cambiar las calificaciones de los estudiantes».
LearnPress
El primero de los Plugin con fallos, es quizá el complemento LMS más popular de WordPress, ya que permite a los administradores de sitios web crear y vender cursos en línea fácilmente.
Según «BuiltWith», es incluso más popular que «Moodle» (que es la plataforma de aprendizaje de código abierto dominante en todo el mundo), con unas 80.000 instalaciones.
Las versiones de LearnPress afectadas son las <= 3.2.6.7
Se han encontrado dos vulnerabilidades en este Plugin, la denominada CVE-2020-6010: inyección SQL, consistente en una «inyección SQL ciega basada en el tiempo» que es muy trivial para identificar y explotar.
«Fue una sorpresa encontrarlo, ya que habríamos esperado que las declaraciones preparadas ahora fueran parte de la norma».
Un usuario autenticado puede desencadenar esta vulnerabilidad llamando al método Ajax learnpress_modal_search_items que ejecuta la siguiente cadena:
LP_Admin_Ajax::modal_search_items→ LP_Modal_Search_Items::get_items→ LP_Modal_Search_Items::_get_items.
La otra vulnerabilidad encontrada, se cataloga como: CVE-2020-11511: Convertirse en maestro
Esta vulnerabilidad es un buen ejemplo de código heredado olvidado detrás que resulta en una escalada de privilegios en el diseño actual del sistema.
La función learn_press_accept_become_a_teacherse puede utilizar para actualizar un usuario registrado a un rol de profesor, lo que resulta en una escalada de privilegios.
function learn_press_accept_become_a_teacher() { $action = ! empty( $_REQUEST['action'] ) ? $_REQUEST['action'] : ''; $user_id = ! empty( $_REQUEST['user_id'] ) ? $_REQUEST['user_id'] : ''; if ( ! $action || ! $user_id || ( $action != 'accept-to-be-teacher' ) ) { return; } if ( ! learn_press_user_maybe_is_a_teacher( $user_id ) ) { $be_teacher = new WP_User( $user_id ); $be_teacher->set_role( LP_TEACHER_ROLE ); delete_transient( 'learn_press_become_teacher_sent_' . $user_id ); do_action( 'learn_press_user_become_a_teacher', $user_id ); $redirect = add_query_arg( 'become-a-teacher-accepted', 'yes' ); $redirect = remove_query_arg( 'action', $redirect ); wp_redirect( $redirect ); } } add_action( 'plugins_loaded', 'learn_press_accept_become_a_teacher' ); ...
Esta función se invoca una vez que los plugins activados se han cargado, lo que significa que puede ser invocada simplemente suministrando los parámetros action y user_id en /wp-admin/, sin tener que conectarse.
LearnDash
Las versiones vulnerables son <3.1.6
Según «BuiltWith», más de 33.000 sitios web actualmente ejecutan «LearnDash», por su parte, «LearnDash» declaró haber sido integrado en compañías de Fortune 500, así como en universidades líderes como la Universidad de Florida, la Universidad de Michigan y la Universidad de Washington.
La vulnerabilidad encontrada en este plugin, tiene la descripción: CVE-2020-6009: Inyección SQL de segundo orden no autenticada
Esta vulnerabilidad es fácil de detectar pero mucho más difícil de explotar, ya que no es un caso simple de incorporar la entrada del usuario no confiable directamente en una consulta SQL.
Pero esto también, como cualquier otra inyección de SQL, podría haberse evitado fácilmente mediante el uso de declaraciones preparadas.
La función learndash_get_course_groupsen en el archivo ld-groups.php es vulnerable a la inyección SQL de segundo orden.
Esta función no logra desinfectar suficientemente los datos proporcionados por el usuario (aunque se consultan desde la base de datos, por lo que se podría suponer que son seguros) antes de usarlos en una consulta SQL.
Echemos un vistazo a la función vulnerable learndash_get_course_groups:
function learndash_get_course_groups( $course_id = 0, $bypass_transient = false ) { ... $sql_str = $wpdb->prepare("SELECT DISTINCT REPLACE(meta_key, 'learndash_group_enrolled_', '') FROM ". $wpdb->postmeta ." WHERE meta_key LIKE %s AND post_id = %d and meta_value != ''", 'learndash_group_enrolled_%', $course_id ); ... $col = $wpdb->get_col( $sql_str ); ... $sql_str = "SELECT ID FROM $wpdb->posts WHERE post_type='groups' AND post_status = 'publish' AND ID IN (" . implode( ',', $col ) . ')'; $course_groups_ids = $wpdb->get_col( $sql_str ); ...
Convenientemente, en el archivo ipn.php, que es responsable de manejar las transacciones de pago con «PayPal», encontramos:
... // log transaction ld_ipn_debug( 'Starting Transaction Creation.' ); $transaction = $_REQUEST; // <--- ¡entrada controlada!! $transaction['user_id'] = $user_id; $transaction['course_id'] = $course_id; // <--- ¡entrada controlada!! $transaction['log_file'] = basename($ipn_log_filename); $course_title = ''; $course = get_post( $course_id ); if ( ! empty( $course) ) { $course_title = $course->post_title; } ld_ipn_debug( 'Course Title: ' . $course_title ); $post_id = wp_insert_post( array('post_title' => "Course {$course_title} Purchased By {$email}", 'post_type' => 'sfwd-transactions', 'post_status' => 'publish', 'post_author' => $user_id) ); ld_ipn_debug( 'Created Transaction. Post Id: ' . $post_id ); foreach ( $transaction as $k => $v ) { update_post_meta( $post_id, $k, $v ); // <--- esto crea el meta de publicación maliciosa que luego se consulta y se usa en otra consulta SQL. } ...
El código de ipn.php nos permite crear un registro en la tabla wp_postmeta (a través de la función update_post_meta) con una meta_clave y un meta_valor, que pueden ser posteriormente explotados con una invocación de inyección SQL invocando learndash_get_course_groups.
LifterLMS
En este caso, las versiones vulnerables son las anteriores a 3.37.15
«LifterLMS» es un Plugin de WordPress LMS líder. Según «BuiltWith», aproximadamente 17.000 sitios web usan este complemento, incluidas las agencias y educadores de WordPress, junto con varios establecimientos escolares y educativos.
En este caso, la vulnerabilidad se ha registrado como: CVE-2020-6008: escritura de archivos arbitrarios.
Resulta un ejemplo interesante de vulnerabilidad de Arbitrary File Write, que explota la naturaleza dinámica de las aplicaciones PHP, lo que requiere que lleguemos a un sumidero interesante de una manera inesperada.
Dado que WordPress permite que los Plugin se registren como nuevos actions en su controlador admin-ajax, LifterLMS registró su propia función handle():
public static function handle() { // Make sure we are getting a valid AJAX request check_ajax_referer( self::NONCE ); // $request = self::scrub_request( $_REQUEST ); $request = $_REQUEST; $response = call_user_func( 'LLMS_AJAX_Handler::' . $request['action'], $request ); ...
La función primero crea una nueva clase basada en la variable handler que se le envía, y luego llama a su función generate_export_file con la variable filename enviada también en la solicitud.
La generate_export_file es una función heredada que debería crear un archivo CSV basado en la información obtenida en la clase LLMS_Table correspondiente que creamos usando la variable handler.
Sin embargo, el código no puede verificar que la extensión en la variable filename sea de hecho un CSV.
Esto sucede porque cuando no se envía $type, el valor predeterminado es CSV.
public function generate_export_file( $args = array(), $filename = null, $type = 'csv' ) { if ( 'csv' !== $type ) { return false; } .. $file_path = LLMS_TMP_DIR . $filename; … $handle = @fopen( $file_path, 'a+' ); ...
En este punto, un atacante puede interceptar una solicitud estándar de Ajax y usar la variable ajax_nonce creada orgánicamente, para llevar generate_export_file a crear un archivo en una ubicación arbitraria.
Conclusión
Estas vulnerabilidades permiten a los estudiantes y, a veces, incluso a usuarios no autenticados, obtener información confidencial, editar registros personales e incluso tomar el control de las plataformas LMS.
Debido al reciente aumento en la popularidad de las plataformas de eLearning, estos problemas son urgentes.
Desde entonces, los desarrolladores han lanzado correcciones a las plataformas.
Instamos a los usuarios a actualizar a las últimas versiones de estas plataformas:
Si tienes interés en otros Plugin, en el repositorio de WordPress hay muchos: (https://es.wordpress.org/plugins/).
Mientras tanto, #QuédateEnCasa, juega, experimenta y, sobre todo, ¡divertirte!
¡Gracias por leernos!
¡Tus comentarios y preguntas nos ayudan a mejorar, por favor comenta!