Version in base suite: 3.2.11-3+deb11u5 Base version: spip_3.2.11-3+deb11u5 Target version: spip_3.2.11-3+deb11u6 Base file: /srv/ftp-master.debian.org/ftp/pool/main/s/spip/spip_3.2.11-3+deb11u5.dsc Target file: /srv/ftp-master.debian.org/policy/pool/main/s/spip/spip_3.2.11-3+deb11u6.dsc changelog | 9 patches/0046-fix-verifier-le-format-de-oups-avant-de-le-passer-ob.patch | 41 ++++ patches/0047-Fix-5021-et-5022.patch | 98 ++++++++++ patches/0048-fix-ne-pas-permettre-de-changer-le-mot-de-passe-d-un.patch | 82 ++++++++ patches/series | 3 5 files changed, 233 insertions(+) diff -Nru spip-3.2.11/debian/changelog spip-3.2.11/debian/changelog --- spip-3.2.11/debian/changelog 2022-07-22 18:07:47.000000000 +0000 +++ spip-3.2.11/debian/changelog 2023-01-17 12:07:09.000000000 +0000 @@ -1,3 +1,12 @@ +spip (3.2.11-3+deb11u6) bullseye-security; urgency=medium + + * Backport security fixes from 3.2.17 + - SQL injection + - SQL sanitization + - Deny access to author without login + + -- David Prévot Tue, 17 Jan 2023 13:07:09 +0100 + spip (3.2.11-3+deb11u5) bullseye-security; urgency=medium * Backport security fixes from 3.2.16 diff -Nru spip-3.2.11/debian/patches/0046-fix-verifier-le-format-de-oups-avant-de-le-passer-ob.patch spip-3.2.11/debian/patches/0046-fix-verifier-le-format-de-oups-avant-de-le-passer-ob.patch --- spip-3.2.11/debian/patches/0046-fix-verifier-le-format-de-oups-avant-de-le-passer-ob.patch 1970-01-01 00:00:00.000000000 +0000 +++ spip-3.2.11/debian/patches/0046-fix-verifier-le-format-de-oups-avant-de-le-passer-ob.patch 2023-01-17 12:03:08.000000000 +0000 @@ -0,0 +1,41 @@ +From: Cerdic +Date: Thu, 25 Aug 2022 14:45:37 +0200 +Subject: =?utf-8?q?fix=3A_verifier_le_format_de_oups_avant_de_le_passer_?= + =?utf-8?q?=C3=A0_objet=5Fassocier?= + +Refs: https://git.spip.net/spip-team/securite/issues/4836 + +Origin: upstream, https://git.spip.net/spip/spip/commit/d8a262bba546276904ee266a538a3ba0b366fa90 +--- + prive/formulaires/editer_liens.php | 18 ++++++++++++++---- + 1 file changed, 14 insertions(+), 4 deletions(-) + +diff --git a/prive/formulaires/editer_liens.php b/prive/formulaires/editer_liens.php +index c6ded18..3088241 100644 +--- a/prive/formulaires/editer_liens.php ++++ b/prive/formulaires/editer_liens.php +@@ -236,10 +236,20 @@ function formulaires_editer_liens_traiter_dist($a, $b, $c, $options = array()) { + $objet_source = objet_type($table_source); + include_spip('action/editer_liens'); + foreach ($oups as $oup) { +- if ($objet_lien == $objet_source) { +- objet_associer(array($objet_source => $oup[$objet_source]), array($objet => $oup[$objet]), $oup); +- } else { +- objet_associer(array($objet => $oup[$objet]), array($objet_source => $oup[$objet_source]), $oup); ++ // verifier le contenu de $oup ++ foreach ($oup as $champ => $valeur) { ++ if (!is_string($champ) ++ or preg_match(',\W,', $champ) ++ or !is_scalar($valeur)) { ++ unset($oup[$champ]); ++ } ++ } ++ if (!empty($oup[$objet]) and !empty($oup[$objet_source])) { ++ if ($objet_lien == $objet_source) { ++ objet_associer(array($objet_source => $oup[$objet_source]), array($objet => $oup[$objet]), $oup); ++ } else { ++ objet_associer(array($objet => $oup[$objet]), array($objet_source => $oup[$objet_source]), $oup); ++ } + } + } + } diff -Nru spip-3.2.11/debian/patches/0047-Fix-5021-et-5022.patch spip-3.2.11/debian/patches/0047-Fix-5021-et-5022.patch --- spip-3.2.11/debian/patches/0047-Fix-5021-et-5022.patch 1970-01-01 00:00:00.000000000 +0000 +++ spip-3.2.11/debian/patches/0047-Fix-5021-et-5022.patch 2023-01-17 12:03:08.000000000 +0000 @@ -0,0 +1,98 @@ +From: Cerdic +Date: Thu, 3 Feb 2022 12:38:29 +0100 +Subject: Fix #5021 et #5022 : - mieux decouper les chaines y compris dans le + cas des simples quote echappes par sqlite - echapper le % dans la chaine + pour eviter la confusion de sprintf - remplacer les chaines 1 par 1 via + substr_replace() en commencant par la fin + +Origin: upstream, https://git.spip.net/spip/spip/commit/e0422948cc3cf83763daaf297e2d841ba9b6d241 +--- + ecrire/base/connect_sql.php | 63 +++++++++++++++++++++++++-------------------- + 1 file changed, 35 insertions(+), 28 deletions(-) + +diff --git a/ecrire/base/connect_sql.php b/ecrire/base/connect_sql.php +index 6ea2935..f9e3bdb 100644 +--- a/ecrire/base/connect_sql.php ++++ b/ecrire/base/connect_sql.php +@@ -433,7 +433,7 @@ function query_echappe_textes($query, $uniqid=null) { + $uniqid = uniqid(); + } + $uniqid = substr(md5($uniqid), 0, 4); +- $codeEchappements = ["\\\\" => "\x1@#{$uniqid}#@\x1", "\\'" => "\x2@#{$uniqid}#@\x2", '\\"' => "\x3@#{$uniqid}#@\x3"]; ++ $codeEchappements = ['\\\\' => "\x1@#{$uniqid}#@\x1", "\\'" => "\x2@#{$uniqid}#@\x2", '\\"' => "\x3@#{$uniqid}#@\x3", '%' => "\x4@#{$uniqid}#@\x4"]; + } + if ($query === null) { + return $codeEchappements; +@@ -449,38 +449,45 @@ function query_echappe_textes($query, $uniqid=null) { + + $query_echappees = str_replace(array_keys($codeEchappements), array_values($codeEchappements), $query); + if (preg_match_all("/('[^']*')|(\"[^\"]*\")/S", $query_echappees, $textes)) { +- $textes = reset($textes); // indice 0 du match +- switch (count($textes)) { +- case 0: +- $replace = array(); +- break; +- case 1: +- $replace = array('%1$s'); +- break; +- case 2: +- $replace = array('%1$s', '%2$s'); +- break; +- case 3: +- $replace = array('%1$s', '%2$s', '%3$s'); +- break; +- case 4: +- $replace = array('%1$s', '%2$s', '%3$s', '%4$s'); +- break; +- case 5: +- $replace = array('%1$s', '%2$s', '%3$s', '%4$s', '%5$s'); +- break; +- default: +- $replace = range(1, count($textes)); +- $replace = '%' . implode('$s,%', $replace) . '$s'; +- $replace = explode(',', $replace); +- break; ++ $textes = reset($textes); ++ ++ $parts = array(); ++ $currentpos = 0; ++ $k = 0; ++ while(count($textes)) { ++ $part = array_shift($textes); ++ $nextpos = strpos($query_echappees, $part, $currentpos); ++ // si besoin recoller ensemble les doubles '' de sqlite (echappement des ') ++ while (count($textes) and substr($part, -1) === "'") { ++ $next = reset($textes); ++ if (strpos($next, "'") === 0 ++ and strpos($query_echappees, $part . $next, $currentpos) === $nextpos) { ++ $part .= array_shift($textes); ++ } ++ else { ++ break; ++ } ++ } ++ $k++; ++ $parts[$k] = array( ++ 'texte' => $part, ++ 'position' => $nextpos, ++ 'placeholder' => '%'.$k.'$s', ++ ); ++ $currentpos = $nextpos + strlen($part); ++ } ++ ++ // et on replace les parts une par une en commencant par la fin ++ while ($k>0) { ++ $query_echappees = substr_replace($query_echappees, $parts[$k]['placeholder'], $parts[$k]['position'], strlen($parts[$k]['texte'])); ++ $k--; + } +- $query_echappees = str_replace($textes, $replace, $query_echappees); ++ $textes = array_column($parts, 'texte'); + } else { + $textes = array(); + } + +- // si il reste des quotes simples ou doubles, c'est qu'on s'est emmelles les pinceaux ++ // si il reste des quotes simples ou doubles, c'est qu'on s'est emmelle les pinceaux + // dans le doute on ne touche a rien + if (strpbrk($query_echappees, "'\"") !== false) { + return [$query, []]; diff -Nru spip-3.2.11/debian/patches/0048-fix-ne-pas-permettre-de-changer-le-mot-de-passe-d-un.patch spip-3.2.11/debian/patches/0048-fix-ne-pas-permettre-de-changer-le-mot-de-passe-d-un.patch --- spip-3.2.11/debian/patches/0048-fix-ne-pas-permettre-de-changer-le-mot-de-passe-d-un.patch 1970-01-01 00:00:00.000000000 +0000 +++ spip-3.2.11/debian/patches/0048-fix-ne-pas-permettre-de-changer-le-mot-de-passe-d-un.patch 2023-01-17 12:03:08.000000000 +0000 @@ -0,0 +1,82 @@ +From: Cerdic +Date: Thu, 20 Oct 2022 10:41:43 +0200 +Subject: =?utf-8?q?fix=3A_ne_pas_permettre_de_changer_le_mot_de_passe_d=27u?= + =?utf-8?q?n_auteur_dont_le_login_est_vide_+_passer_par_=60auth=5Fidentifie?= + =?utf-8?q?r=5Flogin=28=29=60_pour_verifier_son_droit_=C3=A0_=C3=AAtre_log?= + =?utf-8?q?=C3=A9_avant_de_le_loger_effectivement?= + +Refs: https://git.spip.net/spip-team/securite/issues/4837 + +Origin: upstream, https://git.spip.net/spip/svp/commit/fea556846bfe99e25de06710bddffab840f74e33 +--- + squelettes-dist/formulaires/mot_de_passe.php | 14 ++++++++++---- + squelettes-dist/formulaires/oubli.php | 4 ++-- + 2 files changed, 12 insertions(+), 6 deletions(-) + +diff --git a/squelettes-dist/formulaires/mot_de_passe.php b/squelettes-dist/formulaires/mot_de_passe.php +index cb2217c..57f5477 100644 +--- a/squelettes-dist/formulaires/mot_de_passe.php ++++ b/squelettes-dist/formulaires/mot_de_passe.php +@@ -21,13 +21,14 @@ function retrouve_auteur($id_auteur, $jeton = '') { + return sql_fetsel( + '*', + 'spip_auteurs', +- array('id_auteur=' . intval($id_auteur), "statut<>'5poubelle'", "pass<>''") ++ array('id_auteur=' . intval($id_auteur), "statut<>'5poubelle'", "pass<>''", "login<>''") + ); + } elseif ($jeton) { + include_spip('action/inscrire_auteur'); + if ($auteur = auteur_verifier_jeton($jeton) + and $auteur['statut'] <> '5poubelle' + and $auteur['pass'] <> '' ++ and $auteur['login'] <> '' + ) { + return $auteur; + } +@@ -140,7 +141,7 @@ function formulaires_mot_de_passe_traiter_dist($id_auteur = null, $jeton = null) + $res = array('message_erreur' => $err); + } else { + auteur_effacer_jeton($id_auteur); +- ++ + // Par défaut, on rappelle de s'identifier avec son email s'il existe + // et qu'il n'est PAS utilisé par quelqu'un d'autre + if ( +@@ -165,8 +166,13 @@ function formulaires_mot_de_passe_traiter_dist($id_auteur = null, $jeton = null) + '
' . _T('pass_rappel_login', array('login' => $identifiant)); + + include_spip('inc/auth'); +- $row = sql_fetsel('*', 'spip_auteurs', 'id_auteur=' . intval($id_auteur)); +- auth_loger($row); ++ $auth = auth_identifier_login($row['login'], $oubli); ++ if (!is_array($auth)) { ++ spip_log("Erreur identification ".$row['login']." après changement de mot de passe: $auth", _LOG_ERREUR); ++ } ++ elseif ($auth['id_auteur'] == $id_auteur) { ++ auth_loger($auth); ++ } + } + } + +diff --git a/squelettes-dist/formulaires/oubli.php b/squelettes-dist/formulaires/oubli.php +index 42ff5ad..eae03e4 100644 +--- a/squelettes-dist/formulaires/oubli.php ++++ b/squelettes-dist/formulaires/oubli.php +@@ -24,7 +24,7 @@ function formulaires_oubli_charger_dist() { + // https://code.spip.net/@message_oubli + function message_oubli($email, $param) { + $r = formulaires_oubli_mail($email); +- ++ + if (is_array($r) and $r[1] and $r[1]['statut'] !== '5poubelle' and $r[1]['pass'] !== '') { + include_spip('inc/texte'); # pour corriger_typo + +@@ -108,7 +108,7 @@ function formulaires_oubli_mail($email) { + + return array( + $declaration, +- sql_fetsel('id_auteur,statut,pass', 'spip_auteurs', 'email =' . sql_quote($declaration['mail'])) ++ sql_fetsel('id_auteur,statut,pass', 'spip_auteurs', "login<>'' AND email =" . sql_quote($declaration['mail'])) + ); + } + } diff -Nru spip-3.2.11/debian/patches/series spip-3.2.11/debian/patches/series --- spip-3.2.11/debian/patches/series 2022-07-22 18:07:47.000000000 +0000 +++ spip-3.2.11/debian/patches/series 2023-01-17 12:03:08.000000000 +0000 @@ -43,3 +43,6 @@ 0043-fix-securisation-du-formulaire-d-upload-d-un-plugin-.patch 0044-fix-Les-champs-password-sont-obligatoires.-Suite-de-.patch 0045-fix-D-placer-le-champ-password-en-t-te-pour-viter-qu.patch +0046-fix-verifier-le-format-de-oups-avant-de-le-passer-ob.patch +0047-Fix-5021-et-5022.patch +0048-fix-ne-pas-permettre-de-changer-le-mot-de-passe-d-un.patch