Accueil > Release > Sortie de SPIP 4.1.0-rc

Sortie de SPIP 4.1.0-rc

samedi 5 mars 2022, par La team

SPIP 4.1.0-rc sifflote ! Cette version de SPIP à tester, est compatible de PHP 7.4 à PHP 8.1.

Qu’y a-t-il de nouveau depuis SPIP 4.0 ?

Voir les articles 4.1.0-alpha et 4.1.0-beta.
Particulièrement, cette version de SPIP est compatible de PHP 7.4 à 8.1. Le support de PHP 7.3 est abandonné.

Et ce n’est pas tout !

Qu’y a-t-il de nouveau depuis la beta ?

Un changement important :  une refonte des authentifications (logins et actions) et du stockage des mots de passes en base de données. Cela a permis de fermer plusieurs tickets d’un coup tout en améliorant sensiblement certains enjeux liés à la sécurité de ces authentifications.

Autant le dire tout de suite : 

  • HTTPS (qui chiffre les données transmises entre le navigateur et le serveur) est fortement conseillé sur les sites. Effectivement le mot de passe est maintenant toujours envoyé en clair par le navigateur lors du login (SPIP auparavant, dans son comportement par défaut, chiffrait le mot de passe directement en Javascript) ;
  • Le hachage du mot de passe en base a été revu pour être encore plus sécurisé, mais c’est un aller simple : une fois la mise à jour SPIP 4.1.0-rc appliquée, la base de données ne sera plus compatible avec une version SPIP 4.0 antérieure (pensez donc à faire des sauvegardes avant au cas où).

On vous explique tout cela en détail plus loin dans l’article.

Autres évolutions

  • Mise à jour des traductions ;
  • Les variantes de critères de date (age_xx, mois_xx, ...) ne nécessitent pas qu’un champ date soit déclaré sur la table en question ;
  • Vérifier à l’installation la version max de PHP utilisable ;
  • Une icône (d’objet) générique est utilisée avec certaines fonctions (comme icone_base()) si l’objet en question n’a pas d’icône prévue ;
  • Ajout d’un fichier .editorconfig ;
  • Divers nettoyages de code.

Corrections

  • supprimer_tags() acceptait des array contrairement à ce que supposait son phpdoc ;
  • SVP : télécharger et activer un plugin fonctionne bien en 1 étape (comme avant).

Authentification & Chiffrement

Cette version SPIP 4.1.0-rc apporte des changements sur les authentifications et chiffrements. Nous avons repris en l’adaptant et complétant le travail de g0uZ sur le plugin Chiffrer, afin d’améliorer grandement la sécurité des sites sous SPIP.

Le formulaire de login

HTTPS est fortement conseillé

Côté navigateur, SPIP ne cherche plus à chiffrer le mot de passe des auteurs en Javascript depuis le formulaire de login.

Il existait effectivement certains rares cas où la librairie Javascript utilisée ne produisait le hash exact attendu. De plus les navigateurs indiquaient (en http, pas en https) que le mot de passe allait circuler en clair et que c’était dangereux (ce qui n’était pas forcément vrai dans le cas de SPIP donc, mais les navigateurs ne le savaient pas).

Mais surtout HTTPS s’est grandement démocratisé : ce protocole chiffre les données transmises entre le navigateur et le serveur (et donc dans ce cas précis le mot de passe envoyé n’est pas lisible lorsqu’il transite sur le réseau).

Comme SPIP 4.1.0-rc ne chiffre plus le mot de passe en Javascript, il est donc fortement recommandé (encore plus qu’avant) d’avoir son site en https (et non http), pour que ça soit directement le protocole qui se charge du chiffrement.

En conséquence la constante _AUTORISER_AUTH_FAIBLE n’est plus utilisée et supprimée. Elle permettait de forcer l’envoi du mot de passe en clair (sans chiffrement en Javascript), ce qui est maintenant toujours le cas.

Poivre, sel & hash du mot de passe

L’essentiel des changements se trouve dans le traitement côté serveur, dans SPIP et sa base de données.

Le mot de passe d’un auteur est maintenant haché dans SPIP en utilisant un poivre (une clé unique spécifique pour le site). La fonction password_hash de PHP s’occupe ensuite de trouver le meilleur algorithme de hachage et de créer un sel dedans. password_verify est utilisé pour le vérifier.

Les « aléas » rotatifs des auteurs sont toujours créés, mais ne sont plus utilisés pour saler le mot de passe vu que la fonction PHP password_hash gère cela très bien toute seule. Par contre, l’application supplémentaire d’un poivre est une nouveauté.

Comme avant, à chaque authentification réussie d’un auteur, on enregistre dans la base un nouveau hash du mot de passe, avec password_hash : cela applique un nouveau sel sur celui-ci, et éventuellement PHP en profite pour utiliser un algorithme de hachage plus performant si besoin.

Clés de chiffrement

Pour mener à bien ce poivre, et d’autres actions dans SPIP, des clés de chiffrement sont utilisées et stockées dans config/cles.php. Il y en a 2 par défaut :

  • secret_des_auth : elle sert à poivrer le mot de passe des auteurs. C’est une nouvelle clé donc.
  • secret_du_site : elle sert pour moitié au calcul du « secret du site ». L’autre moitié provenant de la base de données dans l’entrée secret_du_site de la table spip_meta. Ce secret du site (combiné) permet de signer et/ou chiffrer certaines parties de SPIP (contextes ajax, actions d’auteurs).

Lorsqu’une webmestre se connecte, les clés sont sauvegardées dans le nouveau champ backup_cles de la table spip_auteurs, en le chiffrant avec le mot de passe en clair de l’auteur.

Ceci permet de restaurer les clés du site lors de l’authentification d’un webmestre, si le fichier cles.php a été effacé.

La classe \Spip\Chiffrer\SpipCles permet de manipuler les clés au besoin.

Password

SPIP fournit deux méthodes qui sont utilisées dans ecrire/auth/spip.php

 \Spip\Chiffrer\Password::verifier($clair, $hash, $key = null): bool
 \Spip\Chiffrer\Password::hacher($clair, $key = null): string

La clé par défaut est celle de secret_des_auth, utilisée pour poivrer.

Chiffrement

Trois méthodes sont aussi fournies pour chiffrer et déchiffrer (chiffrage symétrique) des contenus.
Dedans nous utilisons la librairie Sodium (fournie par défaut dans PHP >= 7.2).

 \Spip\Chiffrer\Chiffrement::chiffrer($message, $key): ?string
 \Spip\Chiffrer\Chiffrement::dechiffrer($encoded, $key): ?string
 \Spip\Chiffrer\Chiffrement::keygen(): string

La méthode keygen produit simplement une clé de chiffrement à la longueur adaptée.

Les méthodes chiffrer() et dechiffrer() seront très lentes si la clé transmise n’a pas la bonne longueur : on considère alors la clé de chiffrement comme étant un mot de passe nécessitant un traitement supplémentaire lourd (avec sodium_crypto_pwhash).

Chiffrement des jetons en base

SPIP n’enregistre plus les jetons d’auteurs (qui permettent par exemple de changer son mot de passe) tels quels en base de données, mais les chiffre auparavant en utilisant le « secret du site » :
Chiffrement::chiffrer($jeton, SpipCles::secret_du_site()) .

Cela évite et limite certaines failles potentielles.

Signature des actions

Les actions sont authentifiées maintenant en utilisant hash_hmac et hash_equals (et les aléas d’auteurs et/ou le secret du site)

Retours sur la beta

Deux petits bugs ont été remontés concernant SVP ou le plugin Archiviste que nous avons pu corriger dans cette version 4.1.0-rc.

Calendrier

Nous prévoyons la sortie de SPIP 4.1.0 (stable) pour début mars s’il n’y a pas de problème majeur rencontré avec la RC.

La version 4.0 sera maintenue jusque fin juin (peut être jusqu’à la sortie de SPIP 4.2).

Nous vous rappelons que SPIP 3.2 sera maintenue pour des correctifs de sécurité uniquement jusque fin décembre 2022 et que nous prévoyons une version 4.2 pour le début de l’été.

Tester les plugins

Les plugins n’auront probablement pas encore de version prévue pour cette toute nouvelle version de SPIP. Pour les tester afin de vérifier leur compatibilité, vous pouvez utiliser la configuration (constante) suivante dans votre fichier config/mes_options.php

Cela permet d’activer n’importe quel plugin compatible avec SPIP 4.0.


Mettre à jour en utilisant le spip_loader

Vous pouvez aussi mettre à jour au moyen de la dernière version du spip_loader (version 5.1.0).
https://www.spip.net/spip-dev/INSTALL/spip_loader.php

Résumé des versions de SPIP

Branche Version Suivi Compatibilité PHP
SPIP 4.1 SPIP 4.1.0-rc Branche test PHP 7.4 à PHP 8.1
SPIP 4.0 SPIP 4.0.5 Branche stable PHP 7.3 à PHP 8.0
SPIP 3.2 SPIP 3.2.14 Branche stable PHP 5.4 à PHP 7.4

Les versions SPIP 3.1 et antérieures ne sont plus maintenues.

Pour connaître le détail des versions maintenues :
https://www.spip.net/fr_article6500.html

Comment être tenu au courant de ces annonces ?

C’est simple, inscrivez-vous sur la mailing liste https://discuter.spip.net/c/spip-ann/13

Bien sûr les réseaux sociaux sont de la partie :

Une question, besoin d’aide ?

En cas de problème ou de difficultés, il y aura certainement quelqu’un pour vous aider sur IRC, N’hésitez pas à venir poser vos questions https://irc.spip.net

Vous pouvez aussi poster un message et échanger sur :

Nous vous rappelons que pour signaler une faille, il suffit d’envoyer un mail à spip-team@rezo.net

Messages

  • Merci. Pas encore testé mais je le ferai avec plaisir dès la sortie de la finale

  • Bonjour,

    J’ai commencé (quasiment fini en fait) une dépêche sur LinuxFr.org en prévision de la sortie de SPIP 4.1, elle est là (il faut être connecté et donc avoir un compte), si vous avez des remarques. La dépêche ne sera, évidemment, pas envoyée en modération avant la sortie de la version finale de SPIP 4.1.

    J’avais déjà annoncé SPIP 4 cet été. J’ai également envoyé l’info sur discuter-spip.

  • Bonjour je viens de faire un test en local sur Wamp en intégrant dans mes_option.php la syntaxe indiquée et grosse erreur [Erreur d’exécution ../prive/squelettes/body.html [|] File C :\wamp64\www\monsite\ecrire\src\Chiffrer\Chiffrement.php Line 68 : Call to undefined function Spip\Chiffrer\sodium_crypto_secretbox_keygen()]

  • Je me réponds, sur Wamp il faut cocher l’extension php sodium.

Un message, un commentaire ?

Qui êtes-vous ?
Se connecter
Votre message

Ce formulaire accepte les raccourcis SPIP [->url] {{gras}} {italique} <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.