A Introdução:
No final de novembro reparei em uma função de tratamento de arquivos no PHP que estava passando despercebido pelo desenvolvedores, talvez por parecer inofensivo. A função em questão é a unlink, que, para quem não conhece, serve para deleção de um arquivo no filesystem.
É comum se preocupar com funcionalidades de upload de arquivos, até mesmo aquelas que fazem leitura. Infelizmente, esquecem da deleção.
Essa análise foi possível, pois estava trabalhando com mais um projeto meu, o Tintin. Que consiste na análise estática do código com finalidade de achar algum bug de segurança.
Veja a lista no final do post.
O problema:
Quando a função unlink, é utilizada junto com uma entrada de dados por parâmetro (seja do tipo GET, POST, REQUEST). Uma falha de segurança pode existir.
Exemplo simples:
Unlink( $_GET[‘filename’] );
Se passar para o parametro $_GET[‘filename’] arquivos importantes para seu sistema, isso pode ser fatal. Como por exemplo, no caso do WordPress com o wp-config.php:
http://www.target.com/?filename=wp-config.php
Dependendo do uso do unlink você terá que andar para trás nos diretórios com ../ , e possivelmente o arquivo será deletado.
http://www.target.com/?filename=../wp-config.php
http://www.target.com/?filename=../../wp-config.php
E, por padrão no wordpress, ao acessar o sistema após essa ação, você poderá fazer uma nova instalação e apontar para o banco de dados que você quiser.
Bingo!! Attack success.
OBS: A má utilização do unlink não é um problema só do WordPress e sim do PHP em geral.
Números:
Existem mais de 270 mil downloads ativos com este problema. Apesar disso, acredito que somente serão aceitos como bug’s de segurança um pouco mais da metade, ou seja 150 mil (o que não é pouco), a outra parte não serão considerados como bug de segurança, por serem executadas somente com administrador e por terem uma validação contra CRSF.
Apesar dos dois mecanismos de defesa, ainda é uma falha? Para mim sim, considero um bug de segurança de nível baixo ou simplesmente bug, pelo simples fato de efetuar ação no sistema que não era sua finalidade, podendo até reiniciar todo sistema.
Todos os plugins estão reportados, alguns já resolvidos.
Solução:
Como todo problema existem várias soluções eu vou indicar alguns:
Uso de filtros:
PHP/WordPress -> elimine o uso de “../” para navegação entre as pastas. Mas faça da forma correta para não sofrer um bypass no ataque, elimine por partes “..” e “/”.
PHP/WordPRess -> se você possui uma pasta default especifica use o método basename para extrair unicamente o nome do arquivo eliminando o caminho completo da pasta.
WordPress -> crie filtro com o wp_delete_file, esse método serve para apagar o arquivo assim como o unlink mas você pode criar filtros.
Fiz um commit para o core do WordPress melhorando a segurança para essa vulnerabilidade, deixando bloqueadas por default pastas do core e não deixando que arquivos dos diretórios do core sejam excluídos. Mas deixei um mecanismo que libera diretório por diretório, caso realmente precise apagar algo do core. Ainda está em análise para aprovação, bem aqui.
Não foi aceito, mas irei abrir outra novamente explicando alguns questionamentos. Pois o WordPress precisa ter um método que salve as pasta do core.
Pequena resposta a “não”.
É obviu que nunca vou conseguir proibir o uso do unlink, assim como não consigo proibir que façam querys sem usar o $wpdb, nunca vou conseguir inibir métodos default, mas o WordPress tem responsabilidade de ter um método com o mínimo de segurança.
Lista dos plugins:
Os exploits serão liberados de acordo com os ajustes forem sendo feitos.
Title | Level | Type | Data Discovery | Publish | Contact Vendor | Resolved | Possible Targets |
---|---|---|---|---|---|---|---|
Not resolved | low |
|
01/04/2018 | ✗ | ✓ | ✗ | 6k |
Plugin Buddypress Xprofile Custom Fields Type 2.6.3 Arbitrary File Deletion - Unlink | high |
|
12/08/2017 | ✗ | ✓ | ✗ | 7k |
Plugin Media Library Assistant 2.65 RCE - Unlink / Local File Download | medium_low |
|
12/29/2017 | ✓ | ✓ | ✓ | 40k |
Not resolved | low |
|
11/21/2017 | ✗ | ✓ | ✗ | 20k |
Not resolved | medium_high |
|
12/23/2017 | ✗ | ✓ | ✗ | 8k |
Not resolved | low |
|
11/29/2017 | ✗ | ✓ | ✗ | 5k |
Not resolved | medium_low |
|
11/29/2017 | ✗ | ✓ | ✗ | 3k |
Not resolved | low |
|
11/27/2017 | ✗ | ✓ | ✗ | 10k |
Not resolved | low |
|
11/23/2017 | ✗ | ✓ | ✗ | 10k |
Plugin Woo Import Export 1.0 Arbitrary File Deletion - Unlink | medium_high |
|
11/25/2017 | ✗ | ✓ | ✗ | 3k |
Plugin Woocommerce CSV importer 3.3.6 - Arbitrary File Deletion - Unlink | medium_high |
|
11/23/2017 | ✗ | ✓ | ✗ | 20k |
Not resolved | low |
|
11/23/2017 | ✗ | ✓ | ✗ | 80k |
Plugin WPBackItUp Backup 1.15.3 - RCE - Unlink | low |
|
11/28/2017 | ✓ | ✓ | ✓ | 20k |
Plugin Google Drive for WordPress 2.2 - Arbitrary File Deletion - Unlik | high |
|
11/25/2017 | ✗ | ✓ | ✗ | 2 k |
Not resolved | low |
|
11/25/2017 | ✗ | ✓ | ✗ | 10k |
Plugin Synchi 5.1 - Arbitrary File Deletion - Unlink | medium_high |
|
11/22/2017 | ✗ | ✓ | ✗ | 2k |
Not resolved | low |
|
11/22/2017 | ✗ | ✓ | ✗ | 30k |