Giorno 2 Aprile è stato rilasciato un aggiornamento di sicurezza per il noto plugin WordPress User Role Editor con in attivo più di 300.000 download. Il plugin consente di creare dei ruoli custom rispetto a quelli che di default vengono rilasciati dalla piattaforma WordPress ed in più consente anche di stabilire per ogni ruolo i vari permessi.

Una vulnerabilità è stata riscontrata nel metodo update della classe URE_User_Other_Roles, il quale si occupa di aggiornare i ruoli utente aggiuntivi al salvataggio del profilo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// save additional user roles when user profile is updated, as WordPress itself doesn't know about them
public function update($user_id) {
 
    if (!current_user_can('edit_user', $user_id)) {
	return false;
    }
    $user = get_userdata($user_id);
 
    if (empty($_POST['ure_other_roles'])) {
	return false;
    }
 
    $ure_other_roles = explode(',', str_replace(' ', '', $_POST['ure_other_roles']));
    $new_roles = array_intersect($user->roles, $ure_other_roles);
    $skip_roles = array();
    foreach ($new_roles as $role) {
	$skip_roles['$role'] = 1;
    }
    unset($new_roles);
    foreach ($ure_other_roles as $role) {
	if (!isset($skip_roles[$role])) {
	    $user->add_role($role);
	}
    }
 
    return true;        
}

Il bug sta proprio nel passaggio del parametro $user_id alla funzione current_user_can, in quanto tutti gli utenti hanno la capacità di modificare se stessi e quindi la condizione viene verificata, permettendo all’utente la possibilità di ottenere i privilegi di amministratore e prendere così il controllo pieno del sito.

Il bug è stato risolto nella versione 4.25 aggiungendo il controllo per il permesso edit_users (con la s finale).