Les navigateurs ont-ils fait évoluer le niveau de sécurité de leur gestionnaire de mot de passe ?

Dans ce billet de blogue, je vais vous parler de mot de passe et de gestionnaires de mots de passe qui permettent de les conserver tous au même endroit.

Vous avez surement eu l’occasion d’entendre parler des mots de passe. Ces suites de caractères que nous devons saisir pour nous authentifier sur les sites Web (et autre application ou ordinateurs) que nous visitons.
Vous avez peut-être entendu parler également des gestionnaires de mot de passe ; ces logiciels spécialisés dans la gestion et la synchronisation de vos informations sensibles (identifiant, mot de passe, carte bleue, etc.).

Nos navigateurs Web intègrent eux aussi un gestionnaire de données personnelles sensibles (identifiant/mot de passe, carte bleue, adresse postale, saisie courante), mais qu’en est-il de la protection de nos données par défaut ?

J’ai réalisé un petit test sur la gestion des mots de passe uniquement sur différent système d’exploitation et différent navigateur. Côté navigateur voici la liste retenue :

  • Firefox de la fondation Mozilla.
  • Chromium la base libre d’un grand nombre de navigateurs (Google + la communauté).
  • Google Chrome, le navigateur de Google basé sur Chromium.
  • Opera, un navigateur basé également sur Chomium et édité par Opera Software.
  • Brave, un navigateur basé également sur Chomium et édité par Brave Software qui met l’accent sur le respect de la vie privée.
  • Tor Brower, un navigateur basé sur Firefox et orienté sur l’anonymisation de la navigation et le respect de la vie privée.

Le premier test a été réalisé sur Linux via la distribution Ubuntu en version 19.04. Le second a été réalisé sur Windows 10 (1903) enfin le dernier a été réalisé sur macOS (10.13.6).

Voici le résumé de la situation.

Tous les navigateurs intègrent un outil pour la gestion des mots de passe. Cependant seul Tor Browser le bloque complètement.

Unable to change Marger Password.
Erreur affiché lors de la définition d’un mot de passe maître sur Tor Browser

Les mots de passe sont donc par défaut stocké chiffré sur le disque dur avec une clé non protégés par un mot de passe. Étant donné que la sécurité n’est pas dans les algorithmes, trouver l’emplacement de la clé et pouvoir déchiffrer les mots de passe sera donc possible.

Il est donc important de pouvoir verrouiller ce coffre-fort numérique. Sur Linux, Firefox est les seuls à proposer une solution.

Paramètre par défaut de Firefox pour la gestion des identifiants de connexion.

Les navigateurs basés sur Chromium ne proposent rien (ai-je mal cherché ?) pour Linux.

Sur Windows et macOS, Firefox propose les mêmes options, mais les navigateurs basés sur Chromium utilisent le mot de passe du compte local pour protéger votre coffre-fort.

Chrome sur macOs demande me mot de passe du compte pour afficher un mot de passe sauvegardé.

C’est déjà mieux tant que vous avez défini un mot de passe pour votre compte sur votre ordinateur. Si ce n’est pas le cas, je vous conseille vivement de le faire.

J’ai noté une petite particularité sur Safari, même avec un compte sans mot de passe, un mot de passe vide est réclamé pour accéder à la liste des mots de passe enregistrés.

Safari sur macOs demande un mot de passe pour afficher les informations sauvegardées même si le mot de passe est vide.

En conclusion, la situation sur les gestionnaires de mot de passe des navigateurs n’a pas changé depuis que j’ai décidé de désactiver toutes les fonctionnalités de gestions de mot de passe, carte bleue et saisie semi-automatique de mes navigateurs. Continuerait donc d’utiliser un vrai gestionnaire de mot de passe et je vous conseille de faire de même.

Voici quelques exemples :

Et vous, comment configurez-vous votre navigateur ? Ai-je oublié quelque chose dans mon comparatif ? Si votre navigateur préféré n’est pas dans la liste, donnez-moi son nom dans les commentaires pour que je regarde.

There comes the time to upgrade.

I want to reflect on the past to propel to the future!

At that time, my goal was only to update this extension for PHP 7.0.
At that time, I have written a couple of little programs in C, most in C++, and so many in PHP since its version 3.

I have taken out the Win32Service extension from the oldest SVN repository on May 29 2016. The most recent SVN commit is on July 26 2011.

It is hard work to understand how to write a PHP extension, but with time, documentation, books, friends and labor, I released version 0.1.2-dev on October 16 2016.

At that time, some ground-work was done.

  • The AppVeyor service was set on the project.
  • The DLL are built for x86 and amd64
  • The DLL are available with (TS) and without (NTS) Thread Safe mode.

But the work was far from done, and the first version really usable for PHP 7.0 was version 0.2.0, released on March 23 2017.

The work for version 0.2 span over 10 months during my free time. I’m really proud of my work.

Since the 0.2 version, I have released one other version in 2017, two in 2018, three in 2019 (four versions soon)…

I have added some features asked by users in the old PHP documentation comments, on the PHP bug tracker or directly.

However, I have just received a little bit of feedback despite my calls for it.

Of course, I use Twitter to send my calls and the world is not only on Twitter, however, my network is so small, and my contacts don’t have an interests to forward my calls…

One can ask who in 2017, 2018, 2019, works on the Windows platform to write a PHP application when needing to run a script in the background? Who?

You would be surprised by the amount of people on Windows running PHP scripts, it is far greater than what you imagine.

The download statistics available from the Pecl web site show the interest for this extension.

The most downloaded version (v0.1. excluded) is version 0.2.1. The next one is 0.3.0, not 0.3.1 nor the last one: 0.3.2. Why? Surely because version 0.3.0 is the last version available for PHP 7.0!

Dear PHP developers, why don’t you update PHP? (This is a genuine question, please answer in the comments.)

So, as version 7.4 of PHP will be coming soon and I will release a new version. It is time to migrate to the latest version!

I need to thank you for your trust and if you want some help to upgrade your application, you can contact me in the comments.

Win32Service 0.4 pour PHP 7.4

Peut-être savez-vous que la prochaine version de PHP sortira en novembre 2019 ! Il s’agit de la version 7.4 !

La bonne nouvelle c’est que l’extension Win32Service (que je gère) compile avec la version de développement de cette future version !

Cependant, il ne m’est pas possible de réaliser des tests plus poussés, car j’ai maintenant un accès limité à Windows.

Pour ceux que cela intéressent, vous pouvez télécharger la version alpha1 snapshot (ou plus récent) de PHP 7.4 puis le dernier artéfact généré par AppVeyor pour la version actuelle de l’extension Win32Service.

Un grand merci pour vos retours (via les issues de GitHub ou les commentaires) qui me sont bien utiles pour améliorer l’extension.

Modification du 15 juin : La DLL disponible sur github n’est utilisable qu’avec les versions récentes des constructions de PHP 7.4 disponibles dans la section snapshot du site de PHP ou la version 7.4alpha2 qui sortira prochainement.

Win32Service 0.4 for PHP 7.4

Do you know the time to release the next PHP version ? Yes, the PHP version 7.4 will be released in November 2019 !

I have some good news for the extension Win32Service. The latest version built for the next PHP version.

Otherwise, I have a restricted access to Windows and I cannot test more the build.

If you want, you can download the PHP 7.4 alpha1 snapshot (or newer) and the last artifact generated by AppVeyor for the actual version of Win32Service extension.

A big thanks for your feedback (in GitHub issues or in comment here). It’s very useful to enhance this extension.

June 15 update: The DLL available from github can be working only with the recent snapshots releases available from the snapshot section of the PHP website or the PHP 7.4 alpha2 coming soon.

[Win32Service] PHP 7.0 and 7.1 support

For all popular free software project, it is necessary to manage the supported versions.

The community (or the editor) in charge of the project release a new version for fix bugs and security vulnerabilities only for the supported versions.

For PHP, all supported version by the community is available here.

What is the link with Win32Service? The link is easy, to build the extension for each change the project uses the AppVeyor service. This service allows building, run automated tests, and keep the DLL for download. The DLL is used by you to test your projects with the new version and send feedback from the result of your tests.

But, to build this extension, I need to use some tools necessary for the PHP build on Windows. There tools are managed by the PHP community. In fact, I can build this extension only for the supported PHP version with build tools.

Otherwise, you can download the older extension versions from the pecl.php.net website or the releases page from the GitHub project.

If you want the new version of this extension for an unsupported PHP 7 version, you must build yourself this extension.

[Win32Service] Support de PHP 7.0 et PHP 7.1

Comme pour tout projet libre et populaire, il est nécessaire de mettre en place une gestion des versions supportées.

Les versions supportées sont les versions dont l’éditeur ou la communauté chargés du projet propose des mises à jour pour corriger des dysfonctionnements (bugs) ou des vulnérabilités (failles de sécurité).

Pour le projet PHP, c’est le cas et vous pouvez en voir une représentation graphique et tabulaire sur la page dédiée.

Quel est le rapport avec Win32Service ? Le rapport est très simple, l’extension utilise le service en ligne AppVeyor pour construire et tester automatique l’extension pour toutes les modifications réalisées sur le projet. Il permet également le téléchargement des DLL pour les utiliser sur vos environnements et ainsi me fournir des retours d’expérience.

Pour que la construction de l’extension soit réalisée à chaque modification il est nécessaire de récupérer les outils nécessaires pour la compilation de PHP. Ces outils sont gérés par la communauté en charge du projet PHP. Ce fait ne me permet de construire l’extension que pour les versions de PHP actuellement supportées ayant les outils de construction disponible.

Cependant, vous avez toujours la possibilité de télécharger les anciennes versions de l’extension via le site pecl.php.net ou via le projet sur GitHub.

Si vous souhaitez disposer de la dernière version de l’extension sur une version de PHP 7 non supportée, vous avez la possibilité de réaliser vous-même la construction de l’extension.

[DIY] Transformation d’une alimentation ATX

Voici un n-ième tutoriel sur la façon de transformer une alimentation ATX en une alimentation de laboratoire ! Heuu, non !

C’est effectivement ce que j’ai réalisé mais je ne compte pas vous faire un tutoriel, il y en a suffisamment sur Internet.

L’ai réalisé une alimentation une un peu différente de toute celle qu’il est possible de voir sur la toile. J’ai décidé d’ajouter pour quasiment toutes les sorties un Voltmètre et un Ampèremètre. Pourquoi ? Pour contrôler ce qu’il se passe lors de l’utilisation de l’alimentation.

Voici à quoi ressemble la facade :

4 tension de sortie ! +3.3 Volts, 5 Volts, 12 Volts et le -12 Volts. Ce dernier est parfois utile avec certain composant (ex: écran LCD) et évite l’utilisation d’un inverseur.

Sur l’alimentation j’ai pris soin de reporter les indications de la fiche signalétique d’origine concernant les tensions et intensités maximales :

Montage

Dans mon cas, j’ai complètement démonté l’alimentation d’origine pour l’intégrer dans un nouveau boitier qu’il a fallu préparer pour accueillir tous les composants. L’avantage de l’ABS est la facilité de travail avec une mini perceuse ou même avec une perceuse standard et des mèches à bois.

Les premières connexions

Le câble vert (allumage) et noir (moins) son reliés ensemble pour permettre l’allumage de l’alimentation. Pour l’instant le bouton n’est pas encore utilisé !

Ici les appareils sont en cours de connexion aux borniers. Attention, il est nécessaire de réfléchir aux connexion et de bien respecter le schéma de connexion des appareils. Vous aurez remarqué que le bornier noir (moins) de chaque tension est relié à l’appareil de mesure ainsi que le câble noir (moins). C’est pour la mesure de l’intensité (ampères). Le câble vert qui va du bornier de couleur à l’appareil de mesure est pour la tension (volts). Les câbles fins noirs et rouges permettent l’alimentation de l’appareil de mesure en 5 Volts.

Rangement des câbles

Ici aussi il est nécessaire de ranger les câbles. Des petits serre-câbles sont très pratique pour permettre de tout placer dans les meilleurs conditions. Tous les éléments présents sur la façade sont collés pour garantir leur maintiens. L’élément à droite est le shunt pour la mesure des fortes intensité (ici le +5 Volts jusqu’à 25 Ampères). La connexion de cet appareil est très important et peu poser des problèmes électrique s’il est mal réalisé.

Schéma de connexion utilisé pour l’alimentation

Tests de l’alimentation

Premier allumage

Avant de ranger tous les éléments dans le boitier, il est prudent de tester son bon fonctionnement.

Premier test de charge

Le premier test de charge fût réalisé avec une barre de LED qui consomme environs 0.22 ampère en 3.3 Volts.

Arrière de l’alimentation

La connectique au 240 Volts (secteur) a été conservé telle quelle pour plus de sécurité. Tout comme le ventilateur. Le bouton d’allumage a été ajouté.

Coût de l’alimentation

Faisons un petit tour du côté du matériel nécessaire pour la réalisation :

Le tableau parle de lui même ! Le prix est imbattable pour une alimentation proposant 4 tensions de sortie en simultanée !

Cela vous tente de faire la même ? Avez-vous déjà réalisé une opération similaire ?

[Win32Service] Comment utiliser les paramètres de Récupération

Vous avez des services Windows écrit en PHP ? Il utilise l’extension Win32Service ? La version 0.4 apporte la gestion des options de récupération des services.

Ces paramètres permettent de définir des actions à réaliser dans le cas ou votre service défaille. Il existe 3 situations et donc 3 actions possibles qui sont :

  1. Action à réaliser lors de la première défaillance
  2. Action à réaliser lors de la seconde défaillance
  3. Action à réaliser lors des défaillances suivantes

Comment le gestionnaire des services compte-t-il les défaillances ?
Une défaillance est comptée si le programme exécuté sort en indiquant au gestionnaire de service un code retour différent de 0 (zéro).

Avant la version 0.4, quelle que soit la raison de la fin de l’exécution de PHP, la sortie était toujours avec un code égale à 0. Pour permettre de sortir avec une erreur, deux fonctions ont été ajoutées : win32_set_service_exit_mode et win32_set_service_exit_code.

« win32_set_service_exit_mode » permet de modifier le mode de sortie en passant l’argument à faux. PHP informera le gestionnaire des services que la sortie n’est pas correcte.

« win32_set_service_exit_code » permet de définit un code d’erreur lié a l’erreur rencontrée dans votre code. Ce numéro sera converti en « raison de l’erreur » puis enregistré dans le journal d’évènement de Windows.

Il est conseillé d’utiliser ces deux fonctions dès le lancement de votre service pour définir les paramètres de sortie. Ainsi la moindre erreur générée par PHP ou votre code déclenchera la gestion des défaillances.

Maintenant que nous pouvons signaler au gestionnaire des services que notre service défaille, il est intéressant de savoir comment sont utilisées les actions liées aux défaillances. Le gestionnaire de service tient un compteur des défaillances. Ce compteur est remis à zéro après un certain délai (1 jour pas défaut, il est configurable avec le paramètre ‘recovery_reset_period‘ lors de l’enregistrement du service) selon ce compteur, les actions sont exécutées.

Comment les actions en cas de défaillance sont-elles configurées ?
Pour cela il y a deux moyens : soit lors de l’enregistrement du service via la fonction ‘win32_create_service‘ soit en utilisant l’interface graphique du gestionnaire des services.
Avec la fonction ‘win32_create_service’, il existe plusieurs options de configuration liée à la gestion des défaillances. Le nom de toutes ces options commence par ‘recovery_’.

Dorénavant, notre service se relance s’il défaille, mais à quoi correspond le paramètre ‘recovery_delay’. Ce paramètre contient le délai entre la défaillance et l’exécution de l’action à exécuter suite à la défaillance. Il est exprimé en milliseconde et vaut 60000 millisecondes par défaut (soit 1 minute).

Comment réagit le service si la demande d’arrêt est demandée par le gestionnaire de service ?
Pour que la sortie soit correcte et que le gestionnaire de service ne considère pas que l’arrêt est une défaillance, il faut avoir informé le gestionnaire des services que votre service est stoppé via cette fonction ‘win32_set_service_status‘.

Nous avons fait le tour de cette nouvelle fonctionnalité. À vous d’expérimenter. Si vous avez des questions ou des remarques, les commentaires sont là !

Win32Service Bundle

Avec la sortie de la version 0.4 de l’extension Win32Service pour PHP, un nouveau bundle a été rendu disponible. Le but de ce bundle est de faciliter l’intégration de la librairie PHP « service-library » dans Symfony.

Ce bundle permet de limiter le travail nécessaire pour utiliser l’extension et ainsi rendre le travail plus rapide.

Voici un exemple. Vous disposez actuellement d’une commande Symfony exécutée via les tâches planifiées toutes les 2 minutes. Cette commande contient une boucle qui répète x fois le même traitement.

Voici les étapes pour transformer votre commande en service:
1 – ajouter le bundle à votre projet.
2 – ajouter la configuration pour votre service dans le fichier ‘config/package/win32_service.yaml’
3 – écrire une classe qui étant la classe abstraite « Win32Service\Model\AbstractServiceRunner »
4 – placer dans la fonction « run » le code nécessaire pour l’exécution d’un traitement.
5 – définir votre classe comme un service dans la configuration de Symfony avec le tag « win32service.runner » et un alias contenant la même valeur que la clé ‘service_id’ définit dans la configuration du bundle.

Afin de vous guider, voici un exemple concret d’un projet Symfony configuré.
1 – Le bundle a été ajouté dans le fichier ‘composer.json‘ et activé dans le fichier ‘config/bundles.php‘.
2 – Le fichier de configuration ‘config/packages/win32_service.yaml‘ a été ajouté avec un service.
3 – La classe ‘App\WindowsService\FirstService‘ étant la classe abstraite.
4 – La classe est présente dans un dossier dont toutes les classes seront considérées comme des services par Symfony. Il est uniquement nécessaire d’ajouter le tag pour ce service dans le fichier ‘config/services.yaml‘.

Il ne reste plus qu’à écrire le code et faire en sorte que la durée d’exécution de la méthode ‘run’ ne dépasse pas 30s. Cette limite est imposée par Microsoft pour toutes les actions d’un service. Le délai est également de 30 secondes pour le démarrage, la mise en pause, la reprise et l’arrêt d’un service.

Si vous avez des questions ou des suggestions, ou tout simplement un commentaire, je serai content de vous lire.

Nouveautés de Win32Service 0.4

Cette version apporte quelques nouveautés. La plus importante me semble être la gestion des défaillances du service.

Votre service fonctionne normalement et une erreur viens perturber son fonctionnement. PHP sort avec une erreur, mais vous devez relancer le service à la main.

Avec la version 0.4 de l’extension, il est possible de prédéfinir le type de sortie avec un code. Le mode de sortie par défaut est un mode gracieux qui informe juste le gestionnaire de service de l’arrêt de votre service quelques soit la cause réelle du service.

Avec ces nouvelles fonctions (win32_set_exit_mode, win32_set_exit_code), vous pouvez personnaliser le mode de sortie et le code de sortie. Ainsi si votre code lève une exception ou une erreur PHP, il est possible de la récupérer, de l’enregistrer dans un journal d’évènement puis de réaliser une sortie en erreur du service. Ainsi, le gestionnaire des services peut être configuré pour réaliser des actions lié aux défaillances.

Lors de l’arrêt du service, le gestionnaire déclenchera donc l’une des actions possibles selon le nombre de défaillances du service. Relancer le service sera surement votre premier choix. Ainsi à l’issue d’un délai d’attente, le service sera relancera correctement. Il pourra reprendre son travail sans votre intervention.

Dans cette version, quelques paramètres de configuration ont été ajoutés pour configurer le service lors de l’enregistrement auprès du gestionnaire de service.

Premier élément de configuration concerné justement la stratégie de gestion des défaillances. Quelles sont les actions à réaliser lors de la première défaillance, la seconde, les suivantes…

Ainsi, il vous est possible de définir le comportement du service lors de son enregistrement, mais également de déclarer la défaillance du service lors d’une sortie brutale pendant son exécution.

Un dernier élément de configuration apporté par cette version est la gestion des dépendances. Votre service dépend surement d’un autre service (par exemple le service de gestion du réseau). Vous pouvez maintenant déclarer ces dépendances lors de l’enregistrement du service pour que votre service soit démarré après toutes ses dépendances.

Comme à mon accoutumé, la documentation de l’extension a été mise à jour sur le site officiel de PHP tant en anglais qu’en français.

A vous de jouer avec cette nouvelle version. Je suis toujours ouvert à vos retours d’expérience, mais également a vos suggestions d’améliorations.