Headline
CVE-2021-44122: spip
SPIP 4.0.0 is affected by a Cross Site Request Forgery (CSRF) vulnerability in ecrire/public/aiguiller.php, ecrire/public/balises.php, ecrire/balise/formulaire_.php. To exploit the vulnerability, a visitor must visit a malicious website which redirects to the SPIP website. It is also possible to combine XSS vulnerabilities in SPIP 4.0.0 to exploit it. The vulnerability allows an authenticated attacker to execute malicious code without the knowledge of the user on the website (CSRF).
Browse Source
Balise #FORMULAIRE : nettoyer du code mort qui ne sert plus, ameliorer la securite en ajoutant une signature des arguments du formulaire dès que l’auteur identifié.
A la reception on refuse un formulaire non signé si on a une session ou un formulaire signé si on a pas de session. Si on a une session, la signature doit etre identique. En absence de session on ne signe pas les arguments du formulaire car tout le monde a le droit de l’afficher, et ca permet de garder un cache identique commun a tous les hits anonymes (perf issue)
pull/4922/head
3 changed files with 37 additions and 1 deletions
13
ecrire/balise/formulaire_.php
23
ecrire/public/aiguiller.php
2
ecrire/public/balises.php
@ -252,6 +252,11 @@ function balise_FORMULAIRE__contexte($form, $args) {
$action = parametre_url($action, 'formulaire_action_args', '');
}
/**
* @deprecated
* servait pour poster sur les actions de type editer_xxx() qui ne prenaient pas d'argument autrement que par _request('arg') et pour lesquelles il fallait donc passer un hash valide
*/
/*
if (isset($valeurs['_action'])) {
$securiser_action = charger_fonction('securiser_action', 'inc');
$secu = $securiser_action(reset($valeurs['_action']), end($valeurs['_action']), '', -1);
@ -259,6 +264,7 @@ function balise_FORMULAIRE__contexte($form, $args) {
"<input type='hidden' name='arg' value='" . $secu['arg'] . "' />"
. "<input type='hidden' name='hash' value='" . $secu['hash'] . "' />";
}
*/
// empiler la lang en tant que premier argument implicite du CVT
// pour permettre de la restaurer au moment du Verifier et du Traiter
@ -269,6 +275,13 @@ function balise_FORMULAIRE__contexte($form, $args) {
$valeurs['action'] = $action;
$valeurs['form'] = $form;
$valeurs['formulaire_sign'] = '';
if (!empty($GLOBALS['visiteur_session']['id_auteur'])) {
$securiser_action = charger_fonction('securiser_action', 'inc');
$secu = $securiser_action($valeurs['form'], $valeurs['formulaire_args'], '', -1);
$valeurs['formulaire_sign'] = $secu['hash'];
}
if (!isset($valeurs['id'])) {
$valeurs['id'] = 'new';
}
@ -195,9 +195,30 @@ function traiter_formulaires_dynamiques($get = false) {
return false;
} // le hit peut continuer normalement
// verifier que le post est licite (du meme auteur ou d'une session anonyme)
$sign = _request('formulaire_action_sign');
if (!empty($GLOBALS['visiteur_session']['id_auteur'])) {
if (empty($sign)) {
spip_log("signature ajax form incorrecte : $form (formulaire non signe mais on a une session)", 'formulaires' . _LOG_ERREUR);
return false;
}
$securiser_action = charger_fonction('securiser_action', 'inc');
$secu = $securiser_action($form, $args, '', -1);
if ($sign !== $secu['hash']) {
spip_log("signature ajax form incorrecte : $form (formulaire signe mais ne correspond pas a la session)", 'formulaires' . _LOG_ERREUR);
return false;
}
}
else {
if (!is_null($sign)) {
spip_log("signature ajax form incorrecte : $form (formulaire signe mais pas de session)", 'formulaires' . _LOG_ERREUR);
return false;
}
}
include_spip('inc/filtres');
if (($args = decoder_contexte_ajax($args, $form)) === false) {
spip_log("signature ajax form incorrecte : $form");
spip_log("signature ajax form incorrecte : $form (encodage corrompu)", 'formulaires' . _LOG_ERREUR);
return false; // continuons le hit comme si de rien etait
} else {
@ -2532,6 +2532,8 @@ function balise_ACTION_FORMULAIRE($p) {
value=\'' . $_form . '\' />' .
'<input name=\'formulaire_action_args\' type=\'hidden\'
value=\'' . @\$Pile[0]['formulaire_args']. '\' />' .
'<input name=\'formulaire_action_sign\' type=\'hidden\'
value=\'' . @\$Pile[0]['formulaire_sign']. '\' />' .
(!empty(\$Pile[0]['_hidden']) ? @\$Pile[0]['_hidden'] : '') .
'</span>'";