Descoberta por investigadores da RIPS Technologies GmbH, a vulnerabilidade “authenticated arbitrary file deletion” foi endereçada há 7 meses para a equipa de segurança do WordPress, mas permanece sem correção e afeta todas as versões do WordPress, incluindo a atual 4.9.6
A vulnerabilidade reside numa das principais funções do WordPress que é executada em segundo plano quando um utilizador exclui permanentemente a miniatura de uma imagem enviada.
Os investigadores descobriram que a função de exclusão de miniaturas aceita entradas não sanitizadas, que, se modificada, pode permitir que utilizadores com privilégios limitados excluam qualquer ficheiro da do servidor, e que de outra forma só deveria ser permitido aos administradores do website ou do próprio servididor.
function wp_delete_attachment( $post_id, $force_delete = false ) { ⋮ $meta = wp_get_attachment_metadata( $post_id ); ⋮ if ( ! empty($meta['thumb']) ) { // Don't delete the thumb if another attachment uses it. if (! $wpdb->get_row( $wpdb->prepare( "SELECT meta_id FROM $wpdb->postmeta WHERE meta_key = '_wp_attachment_metadata' AND meta_value LIKE %s AND post_id <> %d", '%' . $wpdb->esc_like( $meta['thumb'] ) . '%', $post_id)) ) { $thumbfile = str_replace(basename($file), $meta['thumb'], $file); /** This filter is documented in wp-includes/functions.php */ $thumbfile = apply_filters( 'wp_delete_file', $thumbfile ); @ unlink( path_join($uploadpath['basedir'], $thumbfile) ); } } ⋮ }
Segundo os autores, os ficheiros que podem ser excluídos são os seguintes:
- .htaccess: In general, deleting this file does not have any security consequences. However, in some occasions, the .htaccess file contains security related constraints (e.g., access constraints to some folders). Deleting this file would deactivate those security constraints.
- index.php files: Oftentimes empty index.php files are placed into directories to prevent directory listing for the case the webserver fails to do so. Deleting those files would grant an attacker a listing of all files in directories protected by this measure.
- wp-config.php: Deleting this file of a WordPress installation would trigger the WordPress installation process on the next visit to the website. This is due to the fact that wp-config.php contains the database credentials, and without its presence, WordPress acts as if it hasn’t been installed yet. An attacker could delete this file, undergo the installation process with credentials of his choice for the administrator account and, finally, execute arbitrary code on the server.
Por exemplo, excluir o ficheiro “wp-config.php” – um dos ficheiros de configuração mais importantes da instalação do WordPress que contém informações de conexão com a base de dados poderia forçar o website inteiro de volta à tela de instalação, supostamente permitindo que o invasor reconfigure o website assumindo assim total controlo sobre ele.
No entanto, deve ser enunciado que o atacante não pode ler diretamente o conteúdo do ficheiro wp-config.php para saber o “nome da base de dados”, “nome do utilizador do mysql” e sua “password”. A única funcionalidade maliciosa ao dispor dos atacantes através deste exploit é somente a exclusão do ficheiro do servidor.
O que poderá ser realizado após a exclusão do arquivo é uma configuração inicial, uma vez que o wordpress regressa à tela de instalação inicial.
Depois de concluído, o atacante pode criar uma nova conta de administrador e assumir o controlo total do website, incluindo a capacidade de executar código arbitrário no servidor.
“Besides the possibility of erasing the whole WordPress installation, which can have disastrous consequences if no current backup is available, an attacker can make use of the capability of arbitrary file deletion to circumvent some security measures and to execute arbitrary code on the web server,” researchers say.
Os administradores de sistemas devem aplicar de imediato o fix fornecido pelos investigadores de segurança na sua publicação.
Temporary Hotfix
The described vulnerability remains unpatched in the WordPress core as the time of writing. Because of this, we have developed a temporary fix provided in the snippet below. The fix can be integrated into an existing WordPress installation by adding it to the functions.php
file of the currently active theme/child-theme.
add_filter( 'wp_update_attachment_metadata', 'rips_unlink_tempfix' ); function rips_unlink_tempfix( $data ) { if( isset($data['thumb']) ) { $data['thumb'] = basename($data['thumb']); } return $data; }
All the provided Hotfix does is to hook into the wp_update_attachement_metadata()
call and making sure that the data provided for the meta-value thumb
does not contain any parts making path traversal possible. Thus, no security relevant files can be deleted.
The provided fix shall ultimately be seen as a temporary fix in order to prevent attacks. We cannot oversee all possible backwards compatibility problems with WordPress plugins and advise to make any modifications to your WordPress files with caution.