Loading…
Reference in new issue
There is no content yet.
Delete Branch 'refactor_auth_spip'
Deleting a branch is permanent. It CANNOT be undone. Continue?
Deleting a branch is permanent. It CANNOT be undone. Continue?
Directement inspiré du plugin chiffrer de g0uz https://git.spip.net/spip-contrib-extensions/chiffrer avec en plus:
23994e0b1
: Ne pas mettre de jeton d’url directement en bdd (cas de l’inscription d’auteur ou du changement de mot de passe)Excellent, merci marcimat pour le dernier commit, j'ai relu et je pense que ça couvre bien les besoins en notifs !
Pour la suite (dans des versions ultérieures) :
Il me semble que pour ça, il faudrait une "table des clés", ou "table des jetons" (je sais pas si cette table ne serait que pour les auteurs, mais au moins pour ça), qui contiendrait à minima : id_auteur, cle, date_creation
Ce qui permettrait bien :
J’ai tenté de suivre les recommandations de g0oZ qui disait que c’était dommage de mettre la clé secret_du_site sur le disque car si qqn·e arrive à l’afficher il peut alors générer certaines clés d’authentifications.
De la même manière si qqn·e peut lire la Bdd il peut aussi finalement…
Du coup, on s’est dit avec @cerdic que découper la clé en 2 était une solution convenable : il faut les 2 parties pour reconstituer la clé valide.
C’est ce que j’ai fait dans
3ba4787877
Cependant…
Il y a un hic.
La table spip_meta se sauvegarde (en clair) dans tmp/meta_cache.php
Et donc qqn·e avec un accès disque peut obtenir les 2 parties quand même pour le momment.
Que faire alors ?
Pour avoir rapidement regardé, la solution la plus propre (pour avancer avec l'existant sans tout revoir) me semble être de ne pas écrire cette valeure dans meta/cache.php.
Ce cas a déjà été prévu mais commenté dans la fonction touch_meta() :
https://github.com/spip/SPIP/blob/master/ecrire/inc/meta.php#L137
J'ai également cherché au sein du core et des plugins les éventuelles utilisations direct de $GLOBALS['meta']['secret_du_site']. Seul le plugin mutualisation devrait être adapté : https://git.spip.net/spip-contrib-extensions/mutualisation/search?q=secret_du_site
Nous avons du mal a comprendre le commentaire et l'impact de la sortie du cache de cette valeur, Cédric tu saurais nous aider ?
Bon.
J’ai vaguement l’impression que ça nécessite des réflexions complémentaires et des tests plus poussés et va être sujet à des corrections encore, et que ça repousserait d’autant la sortie de SPIP 4.1, ce qui me parait là assez dommage compte tenu qu’elle était prête.
Alors proposition : Est-ce que ça peut attendre une 4.2, qui sortirait disons fin avril après avoir validé et testé cette PR et éventuellement celle sur l’introduction de composer #5056 qui a déjà une base intéressante ?
Une version intermédiaire donc avant une éventuelle 4.3 ensuite début de l’été ?
Des avis / envies ou pas ?
Est-il préférable de reporter plutôt la 4.1 pour intégrer (et tester cette partie) ?
23994e0b1
: Ne pas mettre de jeton d’url directement en bdd (cas de l’inscription d’auteur ou du changement de mot de passe)+1 ça serait dommage de continuer à retarder la 4.1 à cause de cette "grosse évolution" qui arrive un peu sur le tard (sans remettre en cause son intérêt).
Je ne vois pas d'inconvénient à ce que cette évolution intègre la 4.2 en juillet prochain. Ce n'est peut-être pas utile de rajouter une 4.3 pour ça
Dommage, a 2 chars du push ^^
Plus sérieusement je vois pas de soucis à repousser.
A coté de ca c'est dommage de différer a cause de l'existence d'un chemin (avec un prérequis important) permettant de retrouver la clé complète. Il y en a certainement d'autres a trouver/fixer ; et amha ce n'est pas l'objectif initial.
Ca pourrait/devrait faire l'objet d'un ticket différent de la refonte du login non (indépendamment du quand) ?
Trouver tous les chemins permettant d'arriver a éxecuter du code avec un pré-requis type "je peux lire les fichiers sur le serveur" risque d'être long :)
Je rappelle que ce n'est pas juste une "évolution" mais un fix de #5059 : si vous voulez repousser cette PR, ça veut dire qu'il faut proposer un autre fix car on va pas décemment releaser une version avec un hash 256 en JS qu'on sait buggué.
Cette course à la release à tout prix me semble un peu ridicule...
Concernant cette PR, après relecture des derniers commentaires, il me semble qu'on est bon jusqu'à
f9424719aa
Si l'on exclue ce commit on a : un fix de #5059, et une remise au propre de l'authentification pour être conforme à l'état de l'art, ce qui traite #4927 #3824 et #2109.
Sur le point particulier du secret_du_site() on ne dégrade rien par rapport à l'existant puisqu'il était dejà stocké sur disque dans
tmp/meta_cache.php
et donc un accès au disque suffisait à obtenir le secret pour forger des contextes ajax et de formulaires.@g0uZ la raison pour laquelle on a remis le secret_du_site dans le cache des meta, est qu'il est utilisé pour calculer les env des formulaires, lesquels sont la plupart du temps dynamique. Ça veut dire que si tu as un formulaire dans la page (par exemple de notation, de forum), le simple affichage du formulaire va requerir une requete en base, et donc on casse la feature de pouvoir afficher une page en cache sans requete en base, ce qui a un gros impact performance également.
Une autre proposition pour protéger globalement tmp/meta_cache.php (ce fichier contient beaucoup d'information qui mériterait d'être protégé) d'un attaquant qui peut lire des fichiers serait de le stocker avec un nom non prédictible (et qui n'implique pas une requête en DB pour le reconstituer).
Est ce qu'on peut trouver une valeure sécrète et constante (qui change rarement) uniquement récupérable via PHP, très rapidement, qu'on pourrait utiliser pour stocker tmp/meta_cache_[md5(mavaleure)].php ?
C'est peut être une très mauvaise idée, je ne sais pas bien :)
Si bonne idée, l'implémentation peut être assez rapide si on conserve tmp/meta_cache.php qui contiendrait uniquement le code suivant :
@g0uZ j'ai répondu dans #5066 pour ne pas mélanger les sujets
À ce que je sache la 4.0 et la 3.2 auront toujours le bug (cette PR ne sera pas reportée). Et des bugs / évolutions à traiter c’est pas ce qui manque à côté non plus.
Je ne cherche pas à minimiser le problème que ça corrige ; juste que les corrections mêmes apportées par ce ticket nécessitent manifestement quelques tests (en passant d’ailleurs on n’a a pas encore fait de TU dessus, ce qui serait pourtant une bonne idée).
gOuZ signale au fur et à mesure des améliorations à apporter, à juste titre, et en soit par conséquent, on voit que ça ne semble pas parfaitement mature. Je ne pense pas avoir manqué de mauvaise volonté sur ce ticket.
Je vois juste que ça va reporter encore, parce que "profitons de cette sortie qui arrive pour faire xxx" (c’est vite fait) :)
Soit.
Je vais essayer de réexprimer mes pensées :
on avait essayé de se mettre d’accord sur un calendrier. J’ai essayé de le tenir, (et d’adapter constamment mes scripts de release entre autres), mais peut être que ça peut pas marcher finalement ? Ou peut être que ça convient pas ?
définir un calendrier évite (normallement) justement ce genre de situation : ne pas intégrer au dernier moment une évolution qui débarque sans prévenir et repousse la sortie : parce que ça peut durer longtemps et être sans fin (c’est pas comme si on savait pas… )
on n’est pas forcé d’avoir toujours des grosses releases avec plein de features dedans. Des petites releases X.Y plus fréquentes avec moins de delta, ça peut aussi fonctionner a priori aussi. C’est pour ça que j’ai tenté de proposer de décaler ce ticket.
Maintenant osef, j’ai pas envie de batailler sur ça, on peut attendre pour de l’intégrer et de tester pour la 4.1
Et sortir la 4.1 «quand elle sera prête». C’est bien cette date là, au moins ça ennuira personne.
Bah vous n’aurez qu’à me dire quand ce sera le cas, quand faut releaser et quoi…
Sinon vous savez aussi où sont mes scripts de release.
L’idée de hacher le chemin tmp/cache/meta/meta_{hash}.php me semble intéressant. Reste à trouver avec quoi calculer le hash par exemple
(mais ça veut dire aussi supprimer les vieux fichiers à un moment dans ce cas non ?)
Je pense qu'il y a une marge entre dire "OK ce bug ne sera pas fixé sur les versions anciennes." et "OK on release une nouvelle version qui contient toujours ce bug"...
Il s'agit pas de reporter sans cesse. Encore une fois, hormis le dernier commit qui traite un problème qu'on peut traiter plus tard, tout semble bon.
Je propose donc d'intégrer sans ce dernier commit et pour ce faire, je peux refaire une passe de tests au préalable et passer en live sur contrib pour vérifier qu'on est bon avant de merger et release...
(et je suis tout à fait d'accord qu'il faudrait aussi faire des tests unitaires, mais considérons que ce n'est pas bloquant et qu'on peut finir ça ensuite)
(pour les anciennes versions 3.2, on peut proposer le palliatif d'utiliser la constante
_AUTORISER_AUTH_FAIBLE
qui permet de ne plus hasher les mots de passe côté client, pour les sites qui seraient embêtés par le bug et qui sont en https)Comme tu le notes judicieusement, ça aurait aussi été une solution en 4.1 sans ce correctif :p
(don’t feed the troll)
Après relecture, on peut même garder le dernier commit qui concerne le secret_du_site: même si il ne corrige pas complètement la remarque initiale de @g0uZ il améliore la sécurité globale puisqu'il faut accèder à la fois à
config/cle.php
ettmp/meta_cache.php
pour avoir le secret.Je viens de faire une série de test :
Je test un upgrade sur dev-contrib et si ok je place la branche en prod sur contrib (je fais un backup de spip_auteurs avant pour pouvoir revert les alea/pass si besoin)
Lors de l'installation, on créé le fichier cles.php ET on fait un backup des cles immediatement sur le compte webmestre créé, donc pas de risque de perdre les cles.
Mais lors de la mise à jour on avait un risque car on créait le fichier de cles au premier login, et on commençait à hasher les password avec même si aucun webmestre ne s'était connecté.
J'ai envoyé
7be4a254e
pour résoudre ça : tant qu'un webmestre ne se loge pas après upgrade, on ne génère pas la nouvelle clé.J'ai testé une mise à jour sur dev-contrib sans soucis, et j'ai mis la branche https://git.spip.net/spip/spip/src/branch/refactor_auth_spip41 (rebase de cette PR en 4.1) en prod, donc on est en test live
Ce soir j'ai voulu me connecter sur contrib->il ne reconnaissait pas mon mot de passe. Et pourtant il n'a pas changé depuis hier, et je l'avais en plus en memoire dans firefox.
Seule solution : reinitialiser mon mot de passe.
je tente de voir en local.
Refus de connexion aussi mais Firefox n'a pas perdu la mémoire.
Bon, en local je ne reproduis pas...
Ah attend c’est peut être ma faute…
Je me demande s’il ne s’est pas remis sur un commit hors de la branche de test
Et donc on était bien sortis de la branche de test sur Contrib tout à l’heure… désolé
23994e0b1
: Ne pas mettre de jeton d’url directement en bdd (cas de l’inscription d’auteur ou du changement de mot de passe)b469db9569
into master 1 year agob469db9569
.