On peut juste faire une capture d'écran du qr code, et la présenter à l'application.
Si vous êtes prêt à partager ces informations, vous pouvez m'envoyer le PDF sur contact arobase ophir point dev et je regarderai si cela peut être corrigé dans l'application.
Le passe contient un nom et un prénom, et l'invitation aussi. C'est comme ça que se fait le lien.
À l'arrivée sur le lieu de l'événement, les organisateurs demandent toujours l'identité des invités, comme ils l'ont toujours fait.
Sanipasse ne conserve pas ni la date, ni le résultat du test de dépistage si il est positif. Il n'y a pas de différence entre quelqu'un qui n'a pas répondu à l'invitation, et quelqu'un qui a essayé de répondre mais n'a pas pu parce que son test était positif.
J'ai conscience que le sujet des passes sanitaires est sensible. Je ne suis moi-même pas pour leur généralisation, et j'espère de tout mon cœur que sanipasse.fr deviendra totalement inutile d'ici quelques mois.
Mais en attendant, entre :
ne pas organiser d'événements culturels du tout,
repartir pour des mois de confinements parce que le COVID se propage dans les grands événements,
devoir montrer ses infos médicales personnelles aux organisateurs d'événements, qui les scannent avec une application propriétaire et qui n'a pas subi d'audit de sécurité indépendant,
Oh, et autre chose que je n'ai pas mentionné dans la dépêche:
Si vous vous intéressez à la sécurité informatique, n'hésitez pas à venir vous attaquer à Sanipasse.
Pour une telle application, la sécurité est critique. Contrairement à celle du gouvernement, mon application est ouverte à tous, et plus il y aura d'yeux sur le code, mieux ce sera.
Je n'ai pas les moyens d'ouvrir un bug bounty rémunéré, mais si vous trouvez une faille, vous serez crédité dans l'application.
Tracim a ouvert une demande de fonctionnalité sur github, à propos du déplacements des entités existantes. Mais ils n'ont pas offert de financer le développement, ni de contribuer au code, et cette fonctionnalité n'est actuellement pas dans mes priorités, donc je suppose que l'intégration n'est pas pour tout de suite. Mais si quelqu'un est motivé pour financer ça ou pour travailler là-dessus lui-même, ce sera un plaisir pour moi de l'aider !
Bravo et merci à vous pour votre travail sur gimp! Glimpse sera très vite oublié, alors que Gimp fait déjà partie de l'Histoire. Ne vous laissez pas décourager par ces communicants qui ne codent pas grand chose !
La requête serveur ne contient aucune des informations rentrées dans le formulaire, elle n'est là que pour télécharger le document PDF vierge qui sera rempli ensuite. Elle pourrait aussi bien être faite avant la saisie des informations. Et le code n'est pas libre, mais il est open-source, puisqu'un sourcemap est fourni. Le code est clair et correctement commenté.
Je pense que ce journal est un bel exemple la loi de futilité de Parkinson: un million de commentaires sur trois caractères dans la première phrase du journal, et deux commentaires sur le fait qu'un gros jeu de données est mis à disposition sous licence libre.
Non, bien sûr ! La faille de sécurité est dans l'utilisation de .format() sur une chaîne de caractères contrôlée par l'utilisateur, pas dans la génération du secret.
Pour pouvoir prédire la sortie des nombres générés par random, il faudrait déjà avoir accès à un grand nombre de valeurs générées précédemment, ce qui n'est pas le cas ici. Si ce sujet vous intéresse, vous pouvez aller voir Python-random-module-cracker, un module qui permet de prévoir les nombres sortis par random.
Ah ! J'ai cru qu'il y avait un problème de compréhension dû au fait que le script sur github était légèrement différent. Voilà le lien vers l'ancienne version, pour que le commentaire regagne toute sa valeur humoristique.
Les f-strings sont au contraire plus sûres que .format() ! Comme on marque explicitement la chaîne à formater, elle ne peut pas être contrôlée par un attaquant. Ici, la faille de sécurité vient du fait que l'on appelle .format() sur une chaîne qui est en partie contrôlée par l'utilisateur.
On peut très bien remplacer la f-string par :
to_format="""Printing a {width}-character wide box:[Age: {{self.age:{width}}} ]""".format(width=self.width)
Oui, la difficulté est que width doit être à la fois un spécificateur de formatage valide et une chaîne valide à passer à str.format. La documentation du fonctionnement des chaînes de formatage listée dans la dépêche donne une piste.
Le but du défi, c'est de trouver le mot de passe depuis l'intérieur du programme. La réponse au défi est une valeur ou une suite de valeurs à donner au programme pour récupérer le mot de passe. Vous n'avez pas accès à la machine qui exécute le programme en dehors du programme lui-même.
[^] # Re: Erreur Aucun code QR ou 2D-DOC détecté dans le document.
Posté par lovasoa (site web personnel) . En réponse à la dépêche Sanipasse : le déconfinement libre !. Évalué à 2.
On peut juste faire une capture d'écran du qr code, et la présenter à l'application.
Si vous êtes prêt à partager ces informations, vous pouvez m'envoyer le PDF sur contact arobase ophir point dev et je regarderai si cela peut être corrigé dans l'application.
[^] # Re: Lien entre l'invité et le passe
Posté par lovasoa (site web personnel) . En réponse à la dépêche Sanipasse : le déconfinement libre !. Évalué à 2.
Le passe contient un nom et un prénom, et l'invitation aussi. C'est comme ça que se fait le lien.
À l'arrivée sur le lieu de l'événement, les organisateurs demandent toujours l'identité des invités, comme ils l'ont toujours fait.
[^] # Re: Erreur Aucun code QR ou 2D-DOC détecté dans le document.
Posté par lovasoa (site web personnel) . En réponse à la dépêche Sanipasse : le déconfinement libre !. Évalué à 2.
Vous avez essayé de recadrer le document pour que le code apparaisse clairement et dans une taille raisonnable ? ;)
[^] # Re: Données contenues dans le QR Code
Posté par lovasoa (site web personnel) . En réponse à la dépêche Sanipasse : le déconfinement libre !. Évalué à 4.
Sanipasse ne conserve pas ni la date, ni le résultat du test de dépistage si il est positif. Il n'y a pas de différence entre quelqu'un qui n'a pas répondu à l'invitation, et quelqu'un qui a essayé de répondre mais n'a pas pu parce que son test était positif.
[^] # Re: Trolldi ?
Posté par lovasoa (site web personnel) . En réponse à la dépêche Sanipasse : le déconfinement libre !. Évalué à 10.
J'ai conscience que le sujet des passes sanitaires est sensible. Je ne suis moi-même pas pour leur généralisation, et j'espère de tout mon cœur que sanipasse.fr deviendra totalement inutile d'ici quelques mois.
Mais en attendant, entre :
je préfère sanipasse 😀
# Sécurité
Posté par lovasoa (site web personnel) . En réponse à la dépêche Sanipasse : le déconfinement libre !. Évalué à 10.
Oh, et autre chose que je n'ai pas mentionné dans la dépêche:
Si vous vous intéressez à la sécurité informatique, n'hésitez pas à venir vous attaquer à Sanipasse.
Pour une telle application, la sécurité est critique. Contrairement à celle du gouvernement, mon application est ouverte à tous, et plus il y aura d'yeux sur le code, mieux ce sera.
Je n'ai pas les moyens d'ouvrir un bug bounty rémunéré, mais si vous trouvez une faille, vous serez crédité dans l'application.
https://sanipasse.fr/security.txt
[^] # Re: Données contenues dans le QR Code
Posté par lovasoa (site web personnel) . En réponse à la dépêche Sanipasse : le déconfinement libre !. Évalué à 10. Dernière modification le 17 mai 2021 à 08:28.
On voit toutes les données en scannant sur sanipasse: https://sanipasse.fr/import/file
Et la liste des champs est dans la spécification officielle du format par l'ANTS: https://ants.gouv.fr/content/download/516/5665/version/11/file/Specifications-techniques-des-codes-a-barres_2D-Doc_v3.1.3.pdf
Pour un test
Pour un vaccin
Après les champs de données, le code contient une signature ECDSA
[^] # Re: Intégration dans Tracim ?
Posté par lovasoa (site web personnel) . En réponse au journal Regain d'activité sur WBO. Évalué à 1.
Tracim a ouvert une demande de fonctionnalité sur github, à propos du déplacements des entités existantes. Mais ils n'ont pas offert de financer le développement, ni de contribuer au code, et cette fonctionnalité n'est actuellement pas dans mes priorités, donc je suppose que l'intégration n'est pas pour tout de suite. Mais si quelqu'un est motivé pour financer ça ou pour travailler là-dessus lui-même, ce sera un plaisir pour moi de l'aider !
[^] # Re: Déjà vu
Posté par lovasoa (site web personnel) . En réponse au journal Glimpse, un fork de Gimp. Évalué à 2.
Bravo et merci à vous pour votre travail sur gimp! Glimpse sera très vite oublié, alors que Gimp fait déjà partie de l'Histoire. Ne vous laissez pas décourager par ces communicants qui ne codent pas grand chose !
# pas de danger
Posté par lovasoa (site web personnel) . En réponse au journal Covid19 et attestation numérique. Évalué à 4.
La requête serveur ne contient aucune des informations rentrées dans le formulaire, elle n'est là que pour télécharger le document PDF vierge qui sera rempli ensuite. Elle pourrait aussi bien être faite avant la saisie des informations. Et le code n'est pas libre, mais il est open-source, puisqu'un sourcemap est fourni. Le code est clair et correctement commenté.
# Loi de la trivialité
Posté par lovasoa (site web personnel) . En réponse au journal Vélib' et open data. Évalué à 3. Dernière modification le 27 février 2020 à 14:39.
Je pense que ce journal est un bel exemple la loi de futilité de Parkinson: un million de commentaires sur trois caractères dans la première phrase du journal, et deux commentaires sur le fait qu'un gros jeu de données est mis à disposition sous licence libre.
[^] # Re: J'ai moinssé
Posté par lovasoa (site web personnel) . En réponse au journal Vélib' et open data. Évalué à 1.
Je suis désolé si j'ai choqué certain•e•s lecteur•ice•s !
[^] # Re: ValueError: Too many decimal digits in format string
Posté par lovasoa (site web personnel) . En réponse au journal Petit défi Python. Évalué à 3.
Bravo ! Et je ne connaissais pas
coproc
en bash, je viens de regarder la doc et ça a l'air super utile. Merci ![^] # Re: ValueError: Too many decimal digits in format string
Posté par lovasoa (site web personnel) . En réponse au journal Petit défi Python. Évalué à 3.
Oui, j'ai fait une branche "solution" qui contient une solution, et une pull request qui va avec.
[^] # Re: ValueError: Too many decimal digits in format string
Posté par lovasoa (site web personnel) . En réponse au journal Petit défi Python. Évalué à 3.
Voilà, j'ai fait un petit dépôt github qui permet de tester sa solution:
https://github.com/lovasoa/pyformat-challenge
[^] # Re: Random
Posté par lovasoa (site web personnel) . En réponse au journal Petit défi Python. Évalué à 1.
Non, bien sûr ! La faille de sécurité est dans l'utilisation de
.format()
sur une chaîne de caractères contrôlée par l'utilisateur, pas dans la génération du secret.Pour pouvoir prédire la sortie des nombres générés par
random
, il faudrait déjà avoir accès à un grand nombre de valeurs générées précédemment, ce qui n'est pas le cas ici. Si ce sujet vous intéresse, vous pouvez aller voir Python-random-module-cracker, un module qui permet de prévoir les nombres sortis parrandom
.[^] # Re: Indices
Posté par lovasoa (site web personnel) . En réponse au journal Petit défi Python. Évalué à 3.
Pour éviter les interactions manuelles, on peut faire un script
Et ensuite, on peut exécuter le script avec :
[^] # Re: Random
Posté par lovasoa (site web personnel) . En réponse au journal Petit défi Python. Évalué à 3. Dernière modification le 14 janvier 2020 à 17:16.
Si vous arrivez à exploiter le manque d'entropie de
random
pour trouver le mot de passe en un temps raisonnable, alors vous avez bon…En tout cas, je ne connaissais pas
secrets
, visiblement introduit dans python 3.6. Merci pour la découverte ![^] # Re: Je sais !
Posté par lovasoa (site web personnel) . En réponse au journal Petit défi Python. Évalué à 2.
Ah ! J'ai cru qu'il y avait un problème de compréhension dû au fait que le script sur github était légèrement différent. Voilà le lien vers l'ancienne version, pour que le commentaire regagne toute sa valeur humoristique.
[^] # Re: Erreur de syntaxe
Posté par lovasoa (site web personnel) . En réponse au journal Petit défi Python. Évalué à 2.
Les f-strings sont au contraire plus sûres que
.format()
! Comme on marque explicitement la chaîne à formater, elle ne peut pas être contrôlée par un attaquant. Ici, la faille de sécurité vient du fait que l'on appelle.format()
sur une chaîne qui est en partie contrôlée par l'utilisateur.On peut très bien remplacer la f-string par :
Et la faille de sécurité sera toujours présente.
[^] # Re: Indices
Posté par lovasoa (site web personnel) . En réponse au journal Petit défi Python. Évalué à 2.
Oui, la difficulté est que width doit être à la fois un spécificateur de formatage valide et une chaîne valide à passer à str.format. La documentation du fonctionnement des chaînes de formatage listée dans la dépêche donne une piste.
[^] # Re: Erreur de syntaxe
Posté par lovasoa (site web personnel) . En réponse au journal Petit défi Python. Évalué à 4.
Python 3.5 n'est plus supporté depuis 2017. Si vous n'avez pas de version récente de python sur votre ordinateur, vous pouvez exécuter le script en ligne sur https://repl.it/repls/SimultaneousLonelyTransformation
[^] # Re: Fonctionne pas
Posté par lovasoa (site web personnel) . En réponse au journal Petit défi Python. Évalué à 2.
Si vous n'avez pas de version récente de python sur votre ordinateur, vous pouvez faire tourner le script en ligne: https://repl.it/repls/SimultaneousLonelyTransformation
[^] # Re: Indices
Posté par lovasoa (site web personnel) . En réponse au journal Petit défi Python. Évalué à 2. Dernière modification le 14 janvier 2020 à 12:48.
Bravo ! Je ne pensais pas que quelqu'un trouverait si vite.
[^] # Re: Je sais !
Posté par lovasoa (site web personnel) . En réponse au journal Petit défi Python. Évalué à 1.
Le but du défi, c'est de trouver le mot de passe depuis l'intérieur du programme. La réponse au défi est une valeur ou une suite de valeurs à donner au programme pour récupérer le mot de passe. Vous n'avez pas accès à la machine qui exécute le programme en dehors du programme lui-même.