SecuPress

SecuPress v2.0 aka Python

Blog SecuPress SecuPress v2.0 aka Python
0 commentaire

SecuPress 2.0 est là ! Comme souvent, après un moment sans mise à jour, cette 2.0 est enfin là. Le but de cette version est d’ouvrir la porte aux futures versions 2.x car ce changement de numéro de version majeure signifie que toutes les fonctionnalités vont être revues une par une afin d’être améliorée dans tous les sens du terme.

Python est le nom de code de l’armure Mark XX de Tony Stark. Vous pouvez l’apercevoir dans Iron Man 3 quand il fait appel à toutes ses armures pendant sa house party protocol.

Iron-Man-Python-Armor

Quoi de neuf ?

Cette version a été développée pendant 2 mois complet. Je ne voulais pas faire une 1.5 ni une mini 2.0 ni même encore moins une « simple » mise à jour.

Il fallait que SecuPress passe en v2 car les features aussi bonnes soient-elles pouvaient être améliorées. Et puis comme toujours, des nouveautés, des correctifs et des améliorations.

Le changelog est le plus long que je n’aie jamais fait, 200 tickets ont été traités (WHAT??). En fait, 100 ont été supprimés pour obsolescence, ou s’il s’agit d’un bug qu’on a eu 1 fois en 2017 et pas de nouvelles depuis, ou le ticket ne veut rien dire etc. Puis réellement 105 autres ont été traités dans cette version tout de même, que ça soit des tâches simples qui m’ont pris 30 secondes, ou parfois 2 semaines juste pour 1 ticket. La moitié de ces tickets sont des améliorations, un tiers des fix bugs, une douzaine de nouvelles fonctionnalités et le reste de la traduction modifiée (voir ci-après).

Avant de se lancer dans le détail « visible », parlons rapidement de ce qui ne l’est moins et qui compte beaucoup :

  • La version PHP requise est maintenant 5.6 au lieu de 5.4 et la version WordPress requise passe de 4.0 à 4.9. Nous sommes à la 5.7, ce qui nous laisse le droit à 8 versions majeures de retard, déjà pas mal…
  • Les traductions ont été revues, que ça soit depuis l’anglais, grammaticalement ou des fautes, puis en français même chose. De meilleures tournures de phrases, plus claires, et moins floues à la fois. Les traductions viennent de nos fichiers .po/.mo uniquement, même pour la version gratuite car garder la main sur ce qui est écrit dans notre extension est important, cela évite bien des surprises !
  • Dans la même veine, les sites en canadien français (fr_CA) et belge français (fr_BE) auront par défaut les traductions françaises (fr_FR) par défaut au lieu de l’anglais.
  • La désactivation de SecuPress retire désormais les contenus qui ont été ajoutés dans les fichiers wp-config.php et .htaccess, et si possible, remet votre propre code (tout ça sans faire de backups, juste en commentant en amont, retirant les commentaires en aval). Et lors de la suppression de l’extension, tout disparait enfin.
  • SecuPress bloque moins de méthodes de requêtes car de plus en plus d’extensions (Matomo, Elementor pour ne citer qu’eux) utilisent des méthodes moins conventionnelles mais tout à fait proprement.
  • Les courriels envoyés depuis SecuPress ne viennent plus de la part de noreply@example.com où example.com est votre nom de domaine, mais plutôt de l’adresse email d’administration paramétrée dans les réglages de votre WordPress, ceci afin d’éviter de les retrouver en spam si l’adresse noreply@ n’existe pas.
  • ps : La santé du site a été supprimée en 2.0 et réintroduite en 2.0.1, mauvaise idée 😉

Et aussi étonnant que ça puisse paraitre, mais j’en ai déjà parlé dans un précédent article, il y a un correctif de sécurité dans cette v2.0, elle a été découverte très récemment par un client, la faille permet à un simple visiteur de bannir n’importe quelle IP sur un site qui a SecuPress (free et pro) activé rendant la visite du site impossible. Il s’agit d’une mauvaise lecture de l’adresse IP dans le contexte du module du honeypot dans le robots.txt. Le niveau danger pour votre site est de 0, c’est juste gênant qu’un visiteur puisse pousser des adresses IP à bannir. C’est réglé !

Détail, ou pas, la version gratuite recevra cette mise à jour 2.0 dans une semaine.

Allez, découpons les nouveautés comme se découpe le menu de SecuPress, comme ça on passe en revue module par module, page par page.

Le scanner principal

Le système de grade plait à beaucoup de monde MAIS il peut aussi gêner, surtout des pros comme des agences qui ont des clients pour qui cela est anxiogène de ne pas pouvoir avoir le grade A. Ce graal n’est pas nécessaire pour avoir un site sécurisé, le grade B est déjà très très bon, mais pourtant cela génère du support inutile chez ces pro. C’est à nous de les alléger en proposant de masquer ça.

Le grade A est maintenant un peu plus accessible et les autres grades plus gratifiants, je m’explique. La double authentification n’est pas toujours activable pour diverses raisons, pourtant, si vous ne l’avez pas, vous n’aurez pas le grade A. Certes la 2FA est importante depuis plusieurs années, mais le site peut tout à fait être sécurisé pour la politique de sécurité de l’agence ou du client lui même. L’accès au grade A sans la 2FA devrait être possible, c’est chose faite, le scanner ne prends plus en compte ce test pour le calcul du grade.

Continuons dans le même sens avec la version PHP. Nous sommes actuellement à la 8.0.1 mais ne pas avoir cette version ne fait pas de votre site un site moins sécurisé, si vous êtes en 7.3 ça passe encore puisqu’elle est soutenue pour la sécurité, d’ailleurs les versions mineures ne comptent plus pour le test de scanner, ce qui va aussi réduire le support des hébergeurs qui se voient demander de la part des clients des upgrades de PHP trop rapides quand SecuPress leur fait peur à ce sujet. La version de PHP n’entre donc plus en compte dans ce calcul.

En contrepartie, si vous avez une 2FA et/ou une version de PHP au top, alors votre grade recevra un « + », une sorte de grade bonus !

grade-c-plus

Mon site en local en grade C+

Ha, ce n’est pas suffisant, vous ne voulez plus du système de grade du tout ? Ok, vous pouvez l’enlever en 2.0, une simple cache à décocher et vous aurez ça :

no-grade

Le grade a disparu.

Nouveau Scanner

Non aucun pour cette v2.0 en fait, juste qu’il faudra rescanner celui du wp-config.php car de nouvelles constantes peuvent être déposées pour améliorer la sécurité.

Ce qui m’amène à une amélioration de l’UX, il est maintenant possible de scanner 1 seul élément du scanner sans devoir tout rescanner, il suffit de passer son curseur sur un scan :

new-scan

Relancez ce scanner en cliquant juste sur son bouton !

Les modules

Globalement, seul le tableau de bord a gardé son bouton de réinitialisation des réglages, je le remettrai peut-être sur les autres mais comme ce ne sont pas « juste » des cases à cocher mais l’activation de modules, tout désactiver en 1 clic sur chaque page de module n’est pas forcément une bonne idée, à suivre.

Allez, prenons les dans l’ordre :

Tableau de bord

3 nouveaux paramètres avancés ont été ajoutés dont celui du système de grade qui est désactivable. Le deuxième étant la possibilité de ne pas avoir de menu dans la barre admin. J’avoue que si toutes les extensions dupliquent leur menu là-bas en haut, il n’y a plus de place ! L’avantage du notre c’est qu’il permet un accès plus rapide sur une option précise d’un module alors que le menu de base ne le permet pas, à vous de voir !

no-adminbar

Décocher pour cacher le menu de la barre admin

Enfin le dernier n’est qu’une option qui existait sous la forme d’une constante, le Mode Expert. Un grand mot pour dire que vous pouvez supprimer l’affichage des aides contextuelles afin d’alléger l’interface, mais vous devez donc savoir à quoi tout sert sans aide, alors, expert, experte ou pas ?

mode expert

Le mode expert

Comptes et connexions

Déplacement de la page de connexion

Rien de neuf du côté de Move Login ou presque, j’ai introduit la prise en charge de la langue avec le paramètre natif ?wp_lang=. Il est donc possible maintenant d’avoir la page de connexion déplacée dans la langue de votre choix (si elle est installée dans le site, je ne garde que le natif, je ne réinvente pas la roue).

Erreurs de connexion

SecuPress se basait sur des traductions de WordPress pour remplacer le texte des erreurs, mais si WordPress change ne serait-ce qu’un seul caractère, alors le module ne fonctionne plus, et si une autre extension en rajoute je ne peux pas le savoir donc cela demande une maintenance trop élevée. Les erreurs sont maintenant toutes supprimées tout simplement, ou plutôt remplacées par un message par défaut. Si vous avez besoin qu’elles restent affichées, comme pour WooCommerce m’a-t-on dit, n’activez pas le module.

Changement de mot de passe

Cette option a disparu car sous WordPress 5.7 (mettez vous à jour !) un administrateur peut changer le mot de passe d’un utilisateur sans avoir à connaitre son mot de passe ET cet utilisateur peut ne pas accepter ce reset. Avec l’ancienne option, l’admin devait connaitre le pass de l’utilisateur, bref, pas forcément top, je préfère la retirer.

Verrouillage du rôle par défaut, des inscriptions et du mail de l’admin

3 options

Les 3 nouvelles options

3 nouvelles options qui sont arrivées dans cette 2.0. SecuPress va faire en sorte qu’on ne puisse pas changer ces 3 réglages de WordPress. L’interface ne le permettra plus et même si vous y parvenez via du code et même si vous modifiez en base de données, SecuPress garde la main et empêche que le nouveau réglage soit pris en compte.

Comment ça, à quoi ça sert ? Je vous explique : beaucoup de failles, étrangement surtout dans les thèmes premiums, permettent de modifier des options de WordPress. Il suffit d’une boucle for sur un élément d’un $_POST qui fait tourner un update_option( $name, $value ) et hop, on peut y injecter le réglage des inscriptions (on les ouvre ?) et on change le rôle par défaut (on met admin ?), je vous laisse imaginer la suite ? Oui, l’attaquant peut aller se créer un compte admin en toute légalité, impossible pour un script ou plugin de sécurité d’empêcher ça SAUF maintenant en bloquant en amont des réglages.

J’espère que vous avez paramétré les alertes pour recevoir les notifications de connexion d’un admin à vote site !

Captcha

Le captcha est maintenant activable seulement si le JS ne retourne pas d’erreur lors du chargement de la page des options, cela évite qu’on puisse activer le module alors que sur la page de login il est en erreur à cause d’un mauvais paramétrage d’un .htaccess/.htpasswd ou d’une erreur JS.

Thèmes et Extensions

Rien pour le moment, mais est prévu la refonte rapide (2.1 ?) du module de détection des thèmes et extensions vulnérables ou supprimées du dépôt afin d’être plus pertinent. À suivre.

Coeur de WordPress

Base de données

Auparavant si votre préfixe de base de données était wp_ ou wordpress_ SecuPress pouvait vous corriger ça via son scanner, il utilisait alors une chaine aléatoire. Mais vous n’aviez pas la possibilité de la modifier manuellement. Le cas arrive si vous avez par erreur divulgué votre préfixe, alors impossible via SecuPress de redemander une modif, c’est maintenant possible.

change-prefix

Maintenant vous pouvez !

Fichier de configuration

Gros gros morceau ici, avant nous avions uniquement ALLOW_UNFILTERED_UPLOADS et DISALLOW_FILE_EDIT que SecuPress pouvait sécuriser. Pourtant via le scanner du fichier de configuration, SecuPress pouvait vous en régler d’autres, d’autres que vous ne pouviez plus désactiver et qui, en cas de désactivation de SecuPress restaient en place. Comme je l’ai dit au début, SecuPress se désactive et désinstalle enfin totalement maintenant, ça parait simple à faire, mais c’est bien un point où j’ai mis 2 semaines (je pensais 2 jours…).

Maintenant, chaque constante qui peut être touchée par SecuPress est une option, elle seront cochées via le fix du scanner ou par vous même. Puis lors de la désactivation de SecuPress (pour tester seulement, restez hein !) la constante va disparaitre et votre ancienne valeur restaurée. Ainsi vous avez un meilleur contrôle sur ce qui est inscrit dans le fichier de configuration.

Nous avons donc en bonus dans cette 2.0 : Gestion du debug, des URLs du site, éditeur de fichiers, téléversements non filtrés, réparation de la base de données, valeur du préfix de cookie, et enfin modification & refresh des clés de sécurité.

Sur ce dernier point, je parle du module qui supprime les clés de sécurité du wp-config et de la base de données pour créer un fichier mu-plugin qui va alors en générer aussi aléatoirement. En plus, vous pouvez les générer de nouveau si besoin en 1 clic.

regen-keys

1 clic et on a de nouvelles clés !

D’ailleurs ce fichier a changé et sera remplacé lors du passage en v2.0, vous serez alors déconnecté, désolé pour ça !

Données Sensibles

Interdire la redirection sur des pages publiques non divulguées

Le saviez-tu ? WordPress permet de rediriger un visiteur si la page sur laquelle il doit arriver est une 404 et s’il a mis un certain paramètre en barre d’adresse ? Cela permet à ce visiteur de trouver des pages – publiques certes – qui n’ont pas de lien cliquable depuis le front-office ni ne sont présentes en sitemap.

Exemple, j’ai sur secupress.me une page comme ça, qui permet à qui a le lien d’obtenir une licence gratuite (cherchez pas, même si vous avez le lien, le contenu est protégé par mot de passe). Eh bien avec cette feature native, un visiteur pouvait taper en barre d’adresse /?name=%free% et tombait alors sur ma page car le slug de la page est /secupress-free-license.

anti404

SecuPress empêche désormais cette trouvaille dont, je l’avoue bien, je ne n’ai pas trouvé d’utilité dans le coeur…

Pare-Feu

Bloquer les mauvais référants

Quand on navigue d’un site à un autre, vous transportez habituellement sur le site cible l’information de là où vous venez. Il se peut que vous ne souhaitiez pas que votre site puisse être sur le chemin de certains autres sites, voilà pourquoi vous pouvez utiliser une nouvelle fonctionnalité simplement en listant les URLs des sites que vous voulez ne plus être le référant du votre.

bad-ref

Liste des sites malveillants (en fait non c’est les miens !)

Mauvaises URLs

Le module « Bloquer les tentatives SQL injection » a été supprimé, c’est obsolète, ces hacks ne se font plus de cette façon et même si on tentait, cela ne fonctionnerait que sur de très vieux sites, avec de vieux outils de hackers, bref, devenu inutile, un module doit disparaitre, c’est aussi ça une mise à jour, pas juste ajouter (mais je me répète, je le dit à chaque update !)

Anti Spam

Rien en v2.0, ce module sera aussi revu pour être plus performant encore, (v2.2 ?)

Scanner de virus (Malware Scan)

Ok, ici, gros morceau qui m’a pris bien des semaines aussi (dev que j’avais déjà fait en 2020). Ce module fonctionne actuellement, mais avec le temps, il est de moins en moins précis, la façon dont il a été construit en 2016 reste bonne mais ses détections ne sont plus assez précises ni exhaustives, cela résulte alors en un paquet énorme de faux positifs. Je pense que 90% des retours de ce scanner ont été des faux positifs en 2020 et que la base de détection pourrait être encore mieux remplie.

J’ai alors passé en revue un par un les fichiers de malwares que je garde depuis toujours et que je trouve sur des sites de clients WordPress qui se font pirater. L’ancienne base de détection faisait 6,5ko de données, celle de la v2.0 fait 31,4ko soit 4,8 fois plus grande et aussi plus précise ce qui fait tomber à 5% le taux de faux positifs au lieu de 90.

Côté interface, on ne peut plus supprimer les fichiers détectés, c’était une erreur de ma part d’avoir proposé de faire ça car, étant du métier, je vérifie les fichiers et je les supprime, mais pour vérifier c’est sur le FTP et il faut savoir si c’est effectivement réel ou pas comme menace. Moi même je n’ai JAMAIS utilisé ces cases à cocher pour supprimer les fichiers. Cette suppression a non seulement créé du support, mais surtout je vous laisse imaginer ce qui se passe quand vous supprimez des fichiers de votre site : Erreur Fatale… Oups. Donc maintenant on a plus ce soucis.

À la place a été ajouté le détail pour lequel ce fichier a été détecté par le scanner. Cela ne veut toujours pas dire que le scanner a raison MAIS si vous avez un doute sur le nom du fichier, son emplacement alors ouvrez le depuis le FTP, cherchez dans le fichier les mots retournés par notre scanner et voyez (si vous le pouvez) si cela vous semble être un vrai résultat ou pas. Dans le doute, ouvrez un support avec ces fichiers en pièces jointes et on vous dit ça.

Encore, on peut y voir désormais le scanner en fonctionnement, n’oubliez pas qu’il fonctionne en arrière plan, vous pouvez le lancer et changer de page, fermer l’onglet, éteindre l’ordinateur, déménager ! Ça fonctionne encore.

malware-scan

Le nouveau Scanner de malware en marche !

Et la nouvelle page des résultats avec du détail

Journaux & IP + Sauvegardes

Rien de neuf et je doute qu’il y en ait, pourquoi ? Car les logs ce n’est pas de la sécurité en soit, ni les sauvegardes. Et aussi, ce sont des modules basiques qui font le travail, mais si on veut plus de détails dans les journaux ou mieux trier etc, ou si on veut sauvegarder sur un cloud etc alors il faut aller vers des solutions qui sont faites pour ça, c’est un métier à part entière. Autant je pense que c’est important d’avoir des logs et des sauvegardes, autant je ne peux pas tout faire ni le café. Donc soit vous gardez ces modules comme tel, ou soit on va voir les…

Addons

(Quelle transition magnifique) Les addons est une nouvelle entrée dans le menu principal de SecuPress :

new-addons

2 addons pour remplacer les logs et les backups

Les addons ne sont rien de plus que des recommandations vers d’autres extensions dont nous savons qu’elles font un bon travail.

Alertes

Encore un bon point ici, actuellement les alertes se font par email, c’est le minimum, je viens d’y ajouter les notifications sur Slack ! Ce qui permet aux agences par exemple de recevoir les alertes de leurs clients, ou à un webmaster les alertes des sites qu’il maintient au lieu d’avoir des emails sur une seule boite, bien moins consultable par un groupe.

accept-screen

Dans Slack je dois d’abord valider mon webhook

slack notifs

Mon webhook est accepté

notifs-slack

Je reçois maintenant les notifs dans Slack !

Planifications

Rien en v2.0 et rien de prévu, cela fonctionne bien non ?

La suite !?

  • Ajout d’un nouveau mode de 2FA, le fameux « Google Auth » like, compatible avec n’importe quelle application mobile d’authentification de type OTP (One Time Password), je vous recommande sous Android « Free OTP » qui est sans pub, open source, free.
  • Refonte du module de détection des thèmes et extensions vulnérables ou supprimées du repo.
  • Refonte de l’API de l’antispam.
  • Ajout des CSP basiques.
  • Meilleure marque blanche (prise en charge des logos partout).
  • Fix du bug du .htaccess comme dit précédemment.

Etc, des idées ? J’en ai plein moi 😉

Si vous souhaitez comparer de nouveau les fonctionnalités Pro vs Free, notre page des fonctionnalités est disponible et à jour.

Changelog (un peu) détaillé

Fix Bugs

  • Certaines règles htaccess n’étaient pas inscriptibles à cause du fichier qui n’était pas trouvé, c’est corrigé, mais je vais refaire un autre système pour la 2.1 car il reste un bug connu dans cette 2.0. Si vous avez plusieurs .htaccess, alors les suivants dans l’arborescence écrasent nos règles et supprimant les protections, le but sera de cibler le .htaccess le plus correct.
  • L’émoji ⚠️  a été supprimé du message d’erreur dans la module de déplacement de la page de connexion. Pourquoi ? Car lors d’un import des réglages, il posait parfois un problème d’encodage rendant les réglages vierges…
  • Depuis la version 5.3 de WordPress, il vous est demandé de temps en temps si l’adresse email de l’administration est correcte. Si vous aviez activé le module de déplacement de la page de connexion, vous pouviez alors l’avoir à chaque connexion.
  • Si vous êtes en marque blanche, le lien des réglages dans la page des extensions n’était pas valide.
  • Les liens vers la doc sont maintenant en https.
  • Ajout du support de l’extension « Unikname Connect » en tant que 2FA, je ne recommande pas cette extension, le code ne me semble pas propre ni sécure… Je vais regarder ça de plus près.
  • Google était parfois bloqué selon la méthode de requête qu’il utilisait, mais aucun impact en SEO, cela avait plutôt rapport à des APIs ou services tiers de sa part.
  • Si vous aviez PasswordLess et que votre role n’est pas touché, alors le champ de login restait visible en étape 2 au lieu de disparaitre.
  • Les champs de la licence ne pouvaient plus être cachés via la constante prévue : SECUPRESS_HIDE_API_KEY
  • La mise en jour de la base des GeoIP pouvait provoquer, lors d’un CRON, une erreur fatale, pas de mal pour le site en front.

Améliorations

  • Les mails de rapport de scan incluent dans le sujet le grade et ne sont envoyés que si le grade est moins bon. Moins de spam, plus de précision, gain de temps !
  • Possibilité de changer les clés de sécurité en 1 clic sans toucher au fichier sur le serveur. Aussi, elles ne changent plus toutes seules tous les mois, certains développeurs ont eu la mauvaise idée de caler leur clé API distante en fonction des clés de WordPress au lieu de créer la leur…
  • Dans les journaux, les liens des actions se voyaient ajouter ceux des autres extensions comme « Purger le cache », alors que ce n’est pas un CPT public, nous avons retiré ça.
  • Le scanner principal se refresh tout seul au bout de 3 minutes afin d’éviter que des personnes ne pensent être coincées sur la page, sans refresh, de peur de casser quelque chose.
  • Le scanne de malware fonctionne même si l’Ajax est cassé, une balise meta refresh prends le relai. ps : corrigez votre JS quand même !
  • Le hotlink sert d’une meilleure façon l’image remplacée pour éviter des URLs en 404.
  • La fonction secupress_die() prends maintenant en compte le code http de retour demandé comme le fait wp_die().
  • Amélioration globale du module de blocage de l’énumération des comptes.
  • Compatibilité PHP8.
  • SecuPress n’indique plus que les fichiers wp-config.php et .htaccess ne sont pas inscriptibles blabla, pas grave.
  • SCRIPT_DEBUG n’est plus pris en compte dans le scanner de wp-config.
0 commentaire