Syndrome de Stockholm, exemple »

Branquignoles

02.11.20 | par Le Grincheux | Catégories: Mauvaise humeur, Je hais les politiciens

Cela n'a pu vous échapper, nous sommes à nouveau confinés. Et nous le sommes parce que pas un seul gouvernement n'a le courage d"imposer les mesures qui, justement, devraient s'imposer à nous, à savoir confinement généralisé de la population mondiale durant un mois, sans autre dérogation que d'aller aux services d'urgences hospitalières quel qu'en soit le motif à partir du moment où il s'agit bien d'urgence, et les courses de première nécessité façon drive avec les super et hypermarchés fermés comme les autres magasins. Le confinement actuel est une vaste blague et ne servira pas à grand'chose car, même s'il a une petite efficacité, gageons que sans un traitement curatif, nous serons reconfinés une troisième fois, voire une quatrième. Je parle bien de traitement curatif puisqu'il est désormais acquis que l'immunité à ce virus ne tient pas dans le temps.

Mais préoccupons-nous de notre pseudo-confinement actuel. Nous avons la joie de devoir à nouveau remplir des autorisations de déplacement. Ce matin, je me suis battu durant une demi-heure avec le site officiel et mon navigateur pour avoir cette fichue attestation et pouvoir descendre au village. Une demi-heure ! Les champs étaient bien remplis mais rien ne se passait lorsque j'appuyais sur l'énorme bouton bleu « générer le PDF ». J'ai laissé tomber Seamonkey et je suis passé par Chromium qui semblait un peu mieux fonctionner. Je précise à toutes fins utiles que mon Seamonkey est parfaitement à jour et s'annonce comme Firefox. Passons.

Ou plutôt non, ne passons pas. Cette page est un truc infâme contenant un bout de code JavaScript. Hier, lorsque j'ai téléchargé ce script, j'ai obtenu ceci:

(function() { var z="";var b="766172205f3078323336313d5b275c7837375c7833365c7837
305c7833315c7834355c7836625c7834395c7834315c7837375c7836665c7837335c783364272c27
5c7836325c7837615c7835345c7834345c7836385c7835315c7836615c7834345c7837365c783633
5c7834665c7833325c7835355c7837335c7834665c7832665c7836325c7833385c7834665c783661
5c7837375c7836365c7834345c7837365c7833385c7834625c7837325c7837375c7836665c783266
5c7834345c7833375c7834355c7836665c7836365c7837335c7834665c7833305c7835305c783534
...
2c20275c7837335c7835335c7832345c78323927295d285f30783531343339625b5f307831323336
28273078313665272c20275c7835365c7832385c7837315c78343127295d29293b7d66696e616c6c
797b6966285f3078313132623732295f30783538663239655b5f3078313233362827307831366627
2c20275c7834635c7836355c7834645c78346527295d3d5f30783131326237323b7d7d2829293b";
eval((function(){for (var i=0;i<b.length;i+=2){z+=String.fromCharCode(parseInt(b
.substring(i,i+2),16));} return z;})());})();

Vous ne rêvez pas, il y a des branquignoles quelque part qui s'imaginent que personne ne peut aller voir dans ce blob ce qui est fait. Pour la petite histoire, le code JavaScript est interprété dans votre navigateur, donc fini toujours en clair quelque part. Un petit coup de node.js nous donne quelques informations:

hilbert:[~/qrcode] > node qr.js
var _0x2361=['\x77\x36\x70\x31\x45\x6b\x49\x41\x77\x6f\x73\x3d','\x62\x7a\x54\x4
4\x68\x51\x6f\x66\x73\x4f\x30\x50\x54\x66\x44\x76\x38\x4b\x72\x77\x6f\x2f\x44\x6
9\x4d\x4f\x5a\x44\x76\x63\x4f\x32\x55\x73\x4f\x2f\x62\x38\x4f\x6a\x77\x37\x45\x6
...
43\x6f\x64\x65'](0xff&_0x21f3d7>>(-0x2*_0x4f9997&0x6)):0x0){_0x52464d=_0x31a35c[
'\x69\x6e\x64\x65\x78\x4f\x66'](_0x52464d);}return _0x15ff69;});}());var _0x533c
b4=function(_0x5a5b7c,_0x413260){var _0x546290=[],_0x404c61=0x0,_0x2718b4,_0x1d3
458='',_0x9e7132='';_0x5a5b7c=atob(_0x5a5b7c);for(var _0x3afd5c=0x0,_0x43996e=_0
...
1236('0x16a', '\x6b\x65\x6e\x33')]=_0x4e55fd[_0x1236('0x16b', '\x48\x37\x40\x74'
)](_0x1236('0x16c', '\x75\x64\x40\x47'),_0x13f431[_0x1236('0x16d', '\x73\x53\x24
\x29')](_0x51439b[_0x1236('0x16e', '\x56\x28\x71\x41')]));}finally{if(_0x112b72)
_0x58f29e[_0x1236('0x16f', '\x4c\x65\x4d\x4e')]=_0x112b72;}}());

Vous ne rêvez pas, il y a de l'obfuscation dans l'obfuscation.

Ce matin 2 novembre 2020, la même page nous donne directement:

parcelRequire=function(e,r,t,n){var i,o="function"==typeof parcelRequire&&parcel
Require,u="function"==typeof require&&require;function f(t,n){if(!r[t]){if(!e[t]
){var i="function"==typeof parcelRequire&&parcelRequire;if(!n&&i)return i(t,!0);
if(o)return o(t,!0);if(u&&"string"==typeof t)return u(t);var c=new Error("Cannot
find module '"+t+"'");throw c.code="MODULE_NOT_FOUND",c}p.resolve=function(r){r
eturn e[t][1][r]||r},p.cache={};var l=r[t]=new f.Module(t);e[t][0].call(l.export
s,p,l,l.exports,this)}return r[t].exports;function p(e){return f(p.resolve(e))}}
f.isParcelRequire=!0,f.Module=function(e){this.id=e,this.bundle=f,this.exports={
}},f.modules=e,f.cache=r,f.parent=o,f.register=function(r,t){e[r]=[function(e,r)
{r.exports=t},{}]};for(var c=0;c<t.length;c++)try{f(t[c])}catch(e){i||(i=e)}if(t
.length){var l=f(t[t.length-1]);"object"==typeof exports&&"undefined"!=typeof mo
dule?module.exports=l:"function"==typeof define&&define.amd?define(function(){re
turn l}):n&&(this[n]=l)}if(parcelRequire=f,i)throw i;return f}({"y3A0":[function
...
"./form":"oVPx"}]},{},["d6sW"], null)

Tiens donc ? Un bout de code qui n'est plus chiffré et qui, vraisemblablement, n'est plus le même que celui que j'ai pu voir hier soir. Comme sur la page officielle figure un petit encart indiquant ceci:

Le code source de ce service est consultable sur GitHub.

Je suis allé consulter la page et j'ai même pris la peine de télécharger l'outil en question pour voir jusqu'où on allait se moquer de moi. Je n'ai pas été déçu parce que je ne retrouve pas le code téléchargé ce matin depuis la page officielle dans le code disponible sur GitHub. C'est assez étrange.

Une autre chose me dérange. Le gouvernement indique un peu partout — mais notez-le bien sur aucun site officiel du gouvernement à l'heure où j'écris ces lignes — qu'aucune donnée n'est collectée. Je cite par exemple :

Quid des données personnelles ?

Le Ministère de l'Intérieur indique sur son site que le générateur d'attestation ne stocke aucune donnée personnelle, ce qui semble être corroboré par les analyses du code du formulaire. L'attestation est générée en format PDF accompagnée d'un QR Code qui pourra être scanné par les forces de l'ordre lors d'un contrôle. Ce code contient toutes les informations que vous avez renseignées via le formulaire, il permet à la police de respecter les gestes barrière, cela leur évite d'avoir à s'approcher des personnes en cas de contrôle ou de toucher leurs smartphones (au cas où il faudrait zoomer sur l'attestation par exemple).

(source).

Certes, le JavaScript que j'ai pu consulter ne semble pas enregistrer de données. Mais le code ayant changé entre hier et aujourd'hui, qu'en sera-t-il demain ?

Je me suis penché sur le qr-code généré par mon attestation de ce matin. Je peux le lire sans problème et générer un qr-code strictement identique grâce à la ligne de commande suivante :

hilbert:[~/qrcode] > cat qr_attestation.sh 
qrencode -o covid.png "Cree le: `date +%d/%m/%Y` a 07h00;$(printf '\r\n\r\n')Nom: GRINCHEUX; \
$(printf '\r\n\r\n')Prenom: Le;$(printf '\r\n\r\n')Naissance:01/10/1942 à Chilleurs-au-bois; \
$(printf '\r\n\r\n')Adresse: 45, route de Parmonts, 01100 Éparvaux;$(printf '\r\n\r\n')Sortie:\
`date +%d/%m/%Y` a 08:00;$(printf '\r\n\r\n')Motifs: travail"
# motifs courses famille

Il n'existe aucun moyen d'authentifier ce qr-code qui n'est ni chiffré ni signé par une clef asymétrique. Donc, si j'en crois la description de l'application de vérification fournie à nos forces de l'ordre qui indique dans ses fonctionnalités :

CovidReader est capable de détecter toute attestation falsifiée, c’est-à-dire qui n’aurait pas été générée par le site du ministère de l’Intérieur. À ce moment-là, une alerte rouge met en évidence le faux document.

Ainsi, une application qui n'a accès à aucun système d'authentification dans le qr-code est capable sans que le serveur distant n'ait gardé trace des informations, de garantir que le qr-code a été généré sur la plate-forme officielle. Pour ce faire, sans autre moyen technique, il faut a minima que cette plate-forme ait conservé une somme de hashage des données voire les données complètes.

J'ai alors repris le code fonctionnant sur le site officiel ce matin à 9h30, rien ne permet de générer ne serait-ce qu'une somme de hashage.

Aussi y a-t-il plusieurs informations à tirer :

  1. si l'application CovidReader est capable de trier les qr-codes générés par la page officielle et ceux générés ailleurs alors que ces qr-codes ne contiennent aucune signature numérique, le gouvernement joue sur les mots en disant qu'il ne garde aucune trace des données. Effectivement, les données ne sont peut-être pas conservées telles quelles, mais il faut néanmoins en garder au moins une trace sous la forme de somme de hashage ;
  2. les développeurs de l'application sont des branquignoles car il est nettement plus simple de signer numériquement le qr-code par une clef asymétrique. Si le cahier des charges ne le contient pas, c'est au prestataire d'aiguiller son client vers ce qui peut se faire techniquement parlant en répondant au cahier des charges. Cela permettrait aux forces de l'ordre un contrôle en évitant toute requête sur un serveur distant. Visiblement, la cryptographie n'est pas dans leurs domaines de compétence ou, pire, ils ne sont pas là pour fournir un produit qui réponde au besoin, simplement pour facturer le maximum en se retranchant derrière les inepties d'un cahier de charges griffonné entre la poire et le fromage par un énarque à la cantine de Matignon ;
  3. le code disponible sur github ce matin n'est pas un code permettant de valider le qr-code généré puisque, dans les faits, il ne sauvegarde strictement rien et n'effectue aucun calcul de somme de hashage. Il n'y a même pas de moyen de connexion à une quelconque base de données ;
  4. le code fonctionnant sur le générateur officiel a changé en moins de vingt-quatre heures et ne peut être celui fourni sur github sauf à ce que l'application CovidReader ne puisse authentifier les qr-codes.

Dire qu'après cela notre cher gouvernement s'étonne encore que plus personne ne le croit alors qu'il nous prend ouvertement pour des imbéciles… J'aimerais à ce propos bien entendre les arguments bafouillés de la CNIL sur ce sujet précis.

 

Aucun commentaire pour le moment


Formulaire en cours de chargement...