Petite introduction à l’auto-défense numérique

Présentation effectuée pour la première fois samedi 5 novembre pour la CNT Lille :

Services de renseignement des États, multinationales du web (GAFAM), employeurs voir proches indiscrets… à l’heure de l’omniprésence du web dans nos vies, nous sommes tous fichés et surveillés. Cependant, il existe des méthodes (plus ou moins efficaces) qui permettent de limiter les dégâts.
Au cours d’un atelier pratique destiné aux débutants, nous découvrirons les principes généraux des techniques de fichage et de surveillance puis manipulerons quelques outils permettant de s’en protéger sur ordinateur et sur téléphone mobile.

 

Generate a Symfony password hash from the command line

There is an easy way to generate a Symfony compliant password hash from the command line. Assuming you’re using the bcrypt algorithm (the preferred choice according to Symfony’s security best practices), the default cost (13) and you have PHP >= 5.5 installed, just run the following command:

 It will output something like:  $2y$13$7mBTrD0lgdgBxt1.YbdvOOeSOrPUYOBfeC1Ra2osPs9lpCHdplw1m

You can directly use this value in your app/config/security.yml  file:

Thanks to Sarah Khalil, a built-in Symfony command will be available in a next release (and that command will support all installed algorithms).

Fuite de données personnelles à Pôle emploi ? Revente d’informations ? Piratage ?

Pôle Emploi

Voici la première contribution externe de ce blog, un article écrit par une amie qui révèle un problème de confidentialité important chez Pôle emploi : les données personnelles des usagers seraient dans la nature, utilisées pour envoyer du spam et probablement pour tenter des usurpations d’identité.

Après une rapide analyse des en-têtes de l’email en question, la piste Pôle emploi se confirme : l’adresse mail du destinataire est écrite entièrement en majuscule, ce qui est un usage peu courant… sauf dans l’interface de gestion des cordonnées du site de Pôle emploi.

Ce sont potentiellement des dizaines de milliers de noms, d’adresses postales et d’adresses emails qui sont dans la nature. Les plaintes d’usagers commencent à se répandre sur la toile, gageons que Pôle emploi aura une réaction adapté à l’ampleur du problème.

Cela fait plusieurs jours que des demandeurs d’emploi reçoivent des mails plutôt louches. Un blog alerte de ces faux entretiens d’embauche, et à voir le nombre de commentaires, on peut penser que de nombreux demandeurs d’emploi sont concernés.

Et j’en fais moi-même partie…

J’ai reçu un mail étrange hier. Il m’indique que suite à ma réponse à une annonce, je suis convoquée à un entretien pour un poste de chargée de clientèle. Le hic, c’est que je n’ai répondu à aucune annonce et qu’en plus je ne cherche absolument pas un poste de chargée de clientèle ! Passée ma surprise, je regarde avec un peu plus d’attention ce mail et plusieurs détails me sautent aux yeux : les tournures de phrase ne sont pas adaptées à ce type de démarche ; les fonctions de la personne que je dois rencontrer et de la personne qui m’envoie le mail ne sont pas précisées ; le mail d’envoi est un mail SFR… et surtout, le cabinet de recrutement qui me contacte n’existe pas, pas plus que l’entreprise qui souhaite si promptement me recruter.

Après m’être beaucoup interrogée sur le pourquoi d’une telle démarche et avoir parcouru les commentaires sur le blog cité ci-dessus, je me dis que l’hypothèse de l’usurpation d’identité est probable. Faire venir des individus en galère à un entretien, leur demander leur carte d’identité pour préparer le contrat qu’il reviendront signer le lendemain et ne jamais les revoir… bref profiter de la situation de galère des chômeurs. Même si ça me paraît quand même carrément tordu…

De toute façon, je n’avais pas prévu d’y aller. En fait, ce qui m’inquiète surtout c’est comment nos données personnelles ont été récupérées. En effet, nos nom, prénom, adresse mail, numéro de téléphone (pour certains), lieu d’habitation (habitant à Lille, je suis convoquée à Roubaix et non à Paris) et situation de chômage sont associés.
A part Pôle Emploi, aucun autre organisme ne dispose de l’ensemble de ces informations (pas la peine de me contredire, j’ai bien réfléchi à la question et, disposant de plusieurs adresses mail, il ne m’est pas difficile de savoir quels organismes disposent de quelles informations).

Alors fuites de la part de Pôle emploi ? Piratage de leur système informatique (suite aux différentes “affaires” qui ont mis en question sa fiabilité, on peut se poser très sérieusement la question) ? Ou même revente de données ?
D’après les témoignages des demandeurs d’emploi concernés par ces démarches, il semblerait que ni Pôle emploi, ni les flics ne s’intéressent au problème… Moi ça m’inquiète, ça m’inquiète que des données personnelles me concernant soient utilisées de manière frauduleuse, surtout quand ces données viennent d’une administration comme Pôle emploi.
Alors quoi ?

En dessous le fameux mail.

De : <annie.afchain@sfr.fr>
Date : 21 mars 2014 14:24
Objet : Proposition d’entretien chez f 2f, Roubaix
À : xxx@xxx.com

UTF-8
Convocation: xxx xxx
Bonjour,

Suite à votre réponse à l’annonce, nous vous demandons de bien vouloir vous présenter chez f 2f pour rencontrer Mr Hurand au 35, Avenue Jean Baptiste Lebas,2ème étage (entre gare SNCF et Mairie), 59100 Roubaix.

Nous fixons donc un rendez-vous de principe pour mercredi 26 mars 2014 à 16h15, mais vous avez la possibilité bien évidemment de le fixer avant Vendredi 28 mars , dernier jour d’entretien pour ce poste de chargé de clientèle, en répondant à mon email.

Nous comptons vivement sur votre présence à l’heure prévue avec votre CV imprimé pour cet entretien individuel.

A. AFCHAIN
SH recrutement

Courriel transmis par le logiciel EMA http://www.emamailing.com
EMA est gratuit pour une utilisation non commerciale

Ce courrier électronique ne contient aucun virus ou logiciel malveillant parce que la protection Antivirus avast! est active.

DunglasTodoMVCBundle compatible with Symfony 2.4

I’m pleased to announce the release of DunglasTodoMVCBundle 1.1.0.

Screenshot Symfony Todomvc

DunglasTodoMVCBundle is an implementation of TodoMVC, the popular site providing the same todo app implemented in a ton of different JavaScript frameworks.

This bundle provides a REST / JSON API built with Symfony and Doctrine, and an API client built with Chaplin.js and Backbone.js.

In this new release:

Enjoy!

DunglasAngularCsrfBundle: protect your Symfony / AngularJS apps against CSRF attacks

I create and I see more and more web applications sharing the same powerful architecture:

 These components share the same philosophy (built on top of dependency injection and MVC-like patterns, designed to be intensively tested) and play very well together.

This stack allows to create awesome blazing-fast web applications. Better, the client part and the server part of the app are loosely coupled, can evolve separately and can even be maintained by different teams.

However, this kind of apps often suffer of security problems, and especially Cross-site Request Forgery (CSRF or XSRF) vulnerabilities.

Both Symfony and AngularJS provide their own CSRF protection mechanisms, but by default they are not interoperable and not enabled. Thanks to a recent refactoring of the Symfony’s security component, it’s now possible and clean to make both systems working together, and I’ve just released an open source bundle to do that: DunglasAngularCsrfBundle.

This bundle provides out of the box CSRF protection for AngularJS apps interacting with a Symfony-backed app.

Despite it’s name, it does not depend of AngularJS and can also be used with Chaplin.js / Backbone.js, jQuery or even raw JavaScript. To do so, install and configure the bundle, then just add to XHR requests a HTTP header called X-XSRF-TOKEN containing the value of the token set by a cookie on the first HTTP request. The bundle will automatically check the validity of the provided token. If it is not valid, an Access Denied error (HTTP 401) will be thrown.

The bundle is fully tested with phpspec and obtain a platinum medal on the brand new (awesome) SensioLabs Insight quality monitoring system.

Internals documentation and installation instructions are provided on the GitHub page of the bundle. Check it, test it, star it and tell me what you think of it!

Download DunglasAngularCsrfBundle on GitHub. 

Sécuriser tant bien que mal une application Symfony installée dans un sous-répertoire

Souvent, pour des raisons de coups liées aux certificats SSL, il n’est pas possible d’installer une application Symfony dans son propre virtual host. L’application se retrouve alors dans un sous-répertoire du DocumentRoot, ouverte à tous vents et c’est une catastrophe en terme de sécurité !

Imaginons que notre DocumentRoot soit /home/web et que l’application Symfony soit installée dans le répertoire /home/web/my-sf-app/. Ainsi l’URL de l’application est https://example.com/my-sf-app/web. Si un utilisateur mal intentionné accède à https://example.com/my-sf-app/app/config/config.yml il obtient le fichier de configuration principal de l’application qui contient entre-autre les identifiants d’accès à la base de données… Mauvaise idée.

Sécurisons tant bien que mal tout ça (en partant du principe que votre serveur est Apache) grâce aux fichiers de configuration .htaccess :

Le premier, à créer, sera /home/web/my-sf-app/.htaccess et servira à interdire l’accès à tous les fichiers de l’application :

Order allow,deny
Deny from all

Le second, /home/web/my-sf-app/web/.htaccess, existe normalement déjà dans notre application Symfony (il est utilisé pour l’URL rewriting), ajoutons-y au début :

Order allow,deny
Allow from all

Ce n’est toujours pas la panacée, il est toujours aisée de reconnaitre quelle est la technologie employée à la structure des répertoires, mais c’est déjà mieux !

Installer un stack LAMP sur un dédié OVH avec Ubuntu 12.10

Petit mémo pour configurer un serveur web LAMP sur un dédié OVH fraichement livré. La distro choisie est Ubuntu 12.10.

Apache, PHP, MySQL

Commençons par mettre à jour la liste des paquets :

# apt-get update

Puis la distribution elle même :

# apt-get dist-upgrade

Installons Apache, PHP, MySQL, phpMyAdmin et les extensions qui vont bien pour faire tourner Symfony 2, WordPress, Prestashop

# apt-get install phpmyadmin mysql-server php5-intl php5-mcrypt php5-xsl php5-cli php5-sqlite php5-memcached php5-curl php-apc php-pear

L’installateur nous demande de rentrer un mot de passe root pour le serveur MySQL (tant mieux) et le serveur web à configurer pour phpMyAdmin. Choisir apache2.

Donnons ensuite à dbconfig-common les mots de passe nécessaire pour qu’il configure les bases de données utiles à phpMyAdmin.

Beaucoup d’applications PHP utilisent le module rewrite de Apache Activons-le :

# a2enmod rewrite

Notre serveur web est prêt à l’emploi !

Un zeste de sécurité

Commençons par éditer /etc/apache2/conf.d/security pour rendre Apache plus discret. Passons ServerTokens à Prod et ServerSignature à Off.

Au tour de PHP. C’est dans /etc/php5/apache2/php.ini que ça se passe, expose_php doit être à Off. Profitons-en pour régler notre fuseau horraire : date.timezone = Europe/Paris.

Ubuntu 12.10 est fournie avec PHP 5.4. Plus besoin de s’occuper de register_globals et des Magic Quotes, ces “fonctionnalités” ont été supprimées upstream. Bon débarras !

Si vous n’utilisez pas d’applications PHP antédiluviennes, passez short_open_tag à Off .

Redémarrons Apache pour que nos réglages soient pris en considération :

# service apache2 restart

Appliquons les bons conseils de Marion et installons un système de sauvegarde automatisée, disons Backup Manager :

# apt-get install backup-manager

Ajoutons /var/lib aux répertoires sauvegardés quand l’installateur nous le propose (ce répertoire contient entre-autre les base de données binaires MySQL).

Si vous avez opté pour un dédié OVH vous disposez peut-être d’un espace de sauvegarde FTP gratuit (ce service ne semble malheureusement plus exister sur certaines offres Kimsufi). Pour l’activer rendez-vous dans le manager : section Services puis Backup Ftp. Une fois le mail avec les identifiants reçu éditons /etc/backup-manager.conf pour les indiquer à l’utilitaire.

Et le courrier ?

Au cas ou nos applications aient besoin d’envoyer des emails :

# apt-get install postfix

Choisissez le type de configuration “Site internet”.

Note : la configuration d’un serveur mail qui envoi des courriers qui ne finissent pas dans “Spam” nécessiterait un article complet.

De l’inutilité de la fonction PHP sleep pour protéger des attaques brute force (exemple avec Prestahop)

Le couple adresse email / mot de passe est le sésame permettant d’accéder à presque l’ensemble des activités numériques d’un individu : messagerie, réseaux sociaux, documents, extranets, interface client des boutiques en-ligne…

Les applications web se doivent de garantir la sécurité de leurs utilisateurs. En plus du minimum exigible (hachage et salage des mots de passe en base de données, protections contre les injections SQL, les attaques de type XSS et CSRF…), les développeurs tentent souvent de trouver des astuces permettant de protéger mieux les utilisateurs de leurs programmes.

Tenter de se protéger des attaque par force brute…

Ainsi, on trouve le code suivant dans le système de connexion à l’interface client de Prestashop, la très populaire plateforme e-commerce open-source :

Comme le commentaire l’indique, les développeurs de Prestashop tentent de protéger leurs utilisateurs d’une attaque par force brute.
L’idée est que pour obtenir un accès à l’interface client, le pirate va utiliser un robot qui va tester méthodiquement et à très grande vitesse tous les mots de passe possibles (dans les faits, ce types de robots testent dans un premier temps les mot de passe les plus communs grâce à des listes pré-établies).
Bien que le concept soit bon, l’appel à sleep est inutile. Les serveurs web sont multithreads et les robots d’attaque le sont aussi. Ces derniers lanceront de nombreuses connexions parallèles et n’attendront pas de savoir si le mot de passe est correct ou non pour en tester un nouveau.

Pire cette implémentation est dangereuse car, en plus de ralentir l’affichage de la page indiquant une erreur de saisie aux utilisateurs légitimes, elle bloquera le thread le temps du sleep (ici une seconde) et favorisera ainsi les attaques par déni de service. Un attaquant souhaitant engorger le site (ce qui aura pour conséquence de le ralentir voir de le rendre inaccessible) lancera de très nombreuses requêtes de connexion avec un mauvais mot de passe. L’effet sera plus important et l’attaque d’autant plus efficace sur cette page grâce au blocage du à l’appel à la fonction sleep.

Se protéger efficacement

Commençons par supprimer de nos codes sources ces appels à sleep aussi inutiles que dangereux. Les développeurs de Prestashop ont pris les devants et à l’heure ou j’écris ces lignes la version de développement de la plateforme e-commerce ne contient plus le code incriminé.

Adaptons maintenant l’idée d’empêcher les tentatives de connexion trop fréquentes à l’environnement multithreads des serveurs web. Commençons par stocker chaque erreur de connexion ainsi que la date à laquelle elle se produit et l’utilisateur qu’elle concerne dans une base de données ou mieux avec memcached. Si pour un même utilisateur une tentative de connexion arrive trop rapidement après l’une ayant échouée, disons au bout d’une seconde après le premier échec, de 5 après le deuxième, de 10 après le troisième…, exigeons que l’utilisateur prouve qu’il est bien humain (ex. : en ajoutant un CAPTCHA en plus des champs login et password). Si les echecs provenant d’une même adresse IP sont systématiques, on peut blacklister cette adresse car elle est probablement utilisée par un assaillant.

Dernier point, inciter voir exiger que vos utilisateurs optent pour un mot de passe fort diminue drastiquement les risques de compromission par force brute. N’hésitez pas à afficher des jauges de sûretés auprès du champ de saisie de mot de passe du formulaire d’inscription.

Add reCAPTCHA widgets to Symfony forms

I’ve wrote a new Symfony plugin to add reCAPTCHA widgets and validation to Symfony new forms. reCAPTCHA is a free CAPTCHA service that helps to digitize books, newspapers and old time radio shows.

To install: checkout it from http://selfpublish.googlecode.com/svn/trunk/plugins/sfAnotherReCaptchaPlugin/ and put it in your Symfony plugins directory.

Next, get a reCAPTCHA key and put the following lines in your app.yml:

Clear the cache with the symfony cc and check that the plugin activated in projectConfiguration.class.php.
You are now able to add reCAPTCHA widgets and validators.

See the plugin’s README file or this register form with reCAPTCHA enabled to learn how to use it.

This plugin is distributed under the MIT license and is based on Arthur Koziel work.

La faille de sécurité touchant MessengerFX semble corrigée

Il y’a quelques temps, j’avais découvert une vulnérabilité de type Cross Site Scripting dans MessengerFX, un client web populaire pour le réseau Windows Live Messenger, qui pouvait avoir de fâcheuses conséquences : en plus de pouvoir faire planter le navigateur de n’importe quel utilisateur du service, elle permet d’accéder à toutes les fonctionnalités implémentées par Messenger FX ce qui signifie entre autre : récupérer la liste de contact de l’utilisateur, envoyer des messages en son nom, supprimer, bloquer et débloquer des personnes de sa liste de contact et lui en ajouter, lire les messages, bref : de prendre le contrôle complet du compte MSN de la victime.

Vendredi, j’ai reçu un email de l’équipe MessengerFX m’indiquant que le problème est corrigé :

Hi Kevin,
First of all i want to thank you for your warn. We fixed that problem and
now its working correctly.
[…]

La correction actuelle ne permet plus d’envoyer de code Javascript via MessengerFX à un ami et éxecute toujours le dis code en local (sur l’ordinateur de celui qui l’envoi). L’équipe indique que la prochaine version, bientôt disponible, inclura une meilleure gestion de l’envoi de code via l’application internet.