Confiance et sécurité

Ce qui protège vos preuves, et ce que nous ne revendiquons pas

C-NDA existe pour produire des preuves qui tiennent sans que personne n'ait à nous croire sur parole. La même exigence s'applique à cette page : ci-dessous figurent les mesures qui sont dans le code, les endroits où les données résident réellement, et, en termes simples, les certifications que nous ne détenons pas.

Où résident les données
Union européenne (base de données à Francfort)
Accès à la base de données
Sécurité au niveau des lignes sur chaque table
La preuve
Recalculable par n'importe qui, sans notre logiciel
Certifications
Aucune. Nous n'en détenons aucune, et nous n'en affichons aucune.

Où résident vos données

Rien ne se trouve « dans le cloud » comme une abstraction. Chaque catégorie de données a un lieu, et un lieu est une juridiction.

Base de données, connexion et documents

Supabase, Union européenne, région de Francfort. La région n'est pas un paramètre que quelqu'un peut basculer : elle est inscrite dans les règles du projet comme non déplaçable, car la déplacer déplacerait le fondement juridique sous chaque enregistrement.

Enregistrements et captures d'écran d'une session

Cloudflare R2, dans un bucket créé avec une juridiction UE. Sur R2, la juridiction est choisie lors de la création du bucket et ne peut pas être modifiée ensuite (il n'existe aucun paramètre pour la corriger plus tard, seulement un bucket à reconstruire), donc notre configuration vérifie le point de terminaison qui lui est fourni et refuse de rester silencieuse lorsqu'il ne s'agit pas du point de terminaison européen.

Le portail et le témoin

Le portail fonctionne sur Vercel. Le témoin qui rejoint une réunion et l'enregistre s'exécute dans un conteneur hébergé par Railway, à Amsterdam.

Rapports d'erreur

Sentry, région UE. Les en-têtes d'autorisation, les cookies, les corps de requête, les liens de réunion et les codes à usage unique sont supprimés avant que quoi que ce soit ne quitte le processus, et nous n'enregistrons pas les sessions de navigation.

Données de carte bancaire

Jamais chez nous. La gestion des paiements et des abonnements se fait sur les pages de Stripe elles-mêmes ; un numéro de carte n'atteint jamais nos systèmes.

La liste complète des sous-traitants, avec ce que chacun reçoit et pourquoi, figure dans la Politique de confidentialité. Lire la Politique de confidentialité

Comment il est protégé

Trois questions décident de la sécurité d'un système comme celui-ci : qui peut lire quoi, comment nous savons qui vous êtes, et ce qui arrive aux éléments qui traversent le réseau.

Qui peut lire quoi

  • La sécurité au niveau des lignes est activée pour chaque table. Lorsqu'une table est accessible par un navigateur, ses politiques sont limitées au propriétaire : la requête d'un autre compte ne renvoie pas une version filtrée de vos données, elle ne renvoie rien.
  • La table contenant les participants n'a aucune politique client : pas même une restrictive, aucune. Les jetons d'invitation et les hachages de codes à usage unique ne sont accessibles que via des points de terminaison serveur, et même le propriétaire d'un protocole obtient zéro ligne en l'interrogeant depuis un navigateur.
  • Sur la table de profil, les autorisations sont par colonne : un navigateur ne peut pas écrire son propre plan, son identifiant de facturation ou sa date d'expiration, même en possession d'une session parfaitement valide.
  • Les fichiers (certificats, NDA téléversés, enregistrements, logos) résident dans des buckets privés. Aucun d'eux n'est jamais une URL publique : chaque téléchargement est un lien signé à durée de vie courte, émis par le serveur après avoir vérifié qui le demande.

Comment nous savons qui vous êtes

  • Un lien d'invitation porte un secret de 32 octets. Nous ne stockons que son hachage, il fonctionne une seule fois et il expire après sept jours.
  • Le code à usage unique envoyé par e-mail est salé par invitation, stocké haché, comparé en temps constant, expire au bout de dix minutes et se verrouille après trois tentatives erronées. Ce verrouillage ne dépend d'aucune limite de débit, c'est pourquoi il tient toujours si le limiteur de débit passe une mauvaise journée.
  • L'authentification à deux facteurs est facultative, et une fois activée, elle est appliquée dans le middleware, pas dans l'interface : un mot de passe seul ouvre une session mais pas le tableau de bord, et une réinitialisation de mot de passe ne permet pas de contourner le second facteur.

Ce qui traverse le réseau

  • Chaque événement que le témoin envoie au portail est signé HMAC-SHA256 sur le corps brut, refusé en dehors d'une fenêtre de cinq minutes, et traité exactement une fois : un événement rejoué ne change rien.
  • Les événements de facturation sont vérifiés avec la signature propre à Stripe, stockés bruts avant que quiconque ne les interprète, et sont idempotents sur l'identifiant de l'événement.
  • Les points de terminaison publics qui pourraient être martelés (invitations, codes à usage unique, vérification publique) sont limités en débit dans la base de données plutôt qu'en mémoire, car en serverless deux requêtes consécutives peuvent ne pas être la même machine et un compteur en mémoire ne serait qu'une limite de nom.
  • Ce qui atteint votre navigateur après un échec est un code de domaine. Le message de la base de données, le message du stockage et le message du fournisseur restent dans les journaux, où ils sont utiles et inoffensifs.
  • Les réponses portent une politique de sécurité du contenu qui interdit catégoriquement l'encadrement, ainsi que nosniff, une politique de référent stricte, une politique de permissions et HSTS, et le serveur n'annonce pas avec quoi il est construit.

Le lien qui n'existe pas

C'est l'invariant autour duquel tout le produit est construit, et c'est une propriété de sécurité avant d'être une propriété juridique.

  1. 01

    Dans une réunion protégée, le lien de réunion est chiffré au repos dans la base de données.

  2. 02

    Tant qu'un participant ne s'est pas identifié et n'a pas accepté le NDA, ce lien ne lui est pas caché, ni masqué, ni grisé : il n'est jamais envoyé. Il est absent des charges utiles d'API, du HTML, des événements en temps réel, des journaux et des messages d'erreur. Aucune inspection de la page ne révèle ce qui n'a jamais été transmis.

  3. 03

    La seule réponse qui le renvoie est celle qui enregistre l'acceptation, et uniquement tant que la session est encore ouverte. Une fois qu'une session est fermée, expirée ou certifiée, même un participant qui a accepté ne reçoit rien.

Un test de navigateur ouvre la page d'invitation et vérifie que le lien est absent du document. Ce n'est pas un commentaire dans le code : c'est un verrou, et il fait passer la suite au rouge.

Intégrité des preuves

Un certificat vaut exactement autant que la difficulté de modifier après coup ce qu'il certifie.

  1. 01

    Forme canonique

    Le paquet de preuves est sérialisé sous forme canonique RFC 8785. Canonique signifie déterministe : le même contenu produit les mêmes octets, dans le même ordre, sur n'importe quelle machine, aussi longtemps que la norme existe. Sans cela, « recalculer le hachage » serait une invitation plutôt qu'une procédure.

  2. 02

    L'empreinte

    SHA-256 sur ces octets exacts constitue le hachage du paquet. Modifiez un seul caractère n'importe où dans le paquet et le hachage devient différent au point d'être méconnaissable.

  3. 03

    L'ancrage

    Le hachage est inscrit sur Polygon PoS dans une transaction publique. À partir de ce moment, l'enregistrement échappe à notre portée : nous ne pouvons ni le déplacer, ni le modifier, ni le retirer, et personne d'autre ne le peut non plus.

  4. 04

    L'ordre, qui ne varie jamais

    Lien protégé, identité et accord, réunion, preuves scellées, vérification. Aucune étape n'est sautée, réordonnée ou exécutée en parallèle de la suivante : ni pour accélérer un écran, ni en test.

Altérations détectables, avec des révisions plutôt que des modifications

Après l'ancrage, le paquet ne peut pas être modifié. Une correction émet un nouveau certificat qui se déclare révision du précédent, et les deux subsistent. Il n'y a pas de changements silencieux, par construction plutôt que par politique.

Les lacunes sont déclarées, jamais dissimulées

Lorsque le témoin n'a pas pu couvrir quelque chose (une interruption dans l'enregistrement, un participant qu'il n'a pas pu identifier), le certificat le dit. Une lacune déclarée reste une preuve ; une lacune dissimulée rendrait tout le document sans valeur.

Chaque empreinte peut être reconstruite à partir des données

Nous tenons un audit qui reconstruit le paquet de chaque certificat à partir de la base de données et recalcule son empreinte, avec les mêmes fonctions qui l'ont produite. Il fait échouer l'exécution plutôt que d'imprimer un avertissement, et un certificat qui ne se reproduit pas est réémis en tant que révision, jamais modifié.

Vérifiez-le vous-même, avec les outils que vous avez déjà

Tout ce qui précède est notre description de notre propre système. C'est la section où vous n'avez plus besoin d'en croire quoi que ce soit.

01

Recalculer l'empreinte

L'archive de preuves contient evidence.json déjà sous forme canonique, donc un simple SHA-256 de ce fichier est le hachage du paquet. Comparez-le avec le hachage imprimé sur le certificat : ils concordent, ou les preuves ne sont pas ce qui a été certifié.

02

Lire l'ancrage sur la chaîne

Ouvrez la transaction d'ancrage sur un explorateur de blocs public et examinez l'événement Anchored. Le hachage dans cet événement doit être celui que vous venez de calculer. Rien de chez nous ne participe à cette étape.

Première étape, sur votre propre machine

shasum -a 256 evidence.json

Le contrat d'ancrage : Polygon PoS, chaîne 137

0x5CceC6F5806b7C949eB90D61fB9D13Cb639AC203

Source vérifiée sur Polygonscan. Il émet Anchored(hash, timestamp, sender) pour une transaction dédiée ; il définit aussi BatchAnchored(merkleRoot, …) pour un lot quotidien, pas encore utilisé.

Ouvrir le contrat sur Polygonscan

À propos du vérificateur de référence

Nous maintenons aussi un vérificateur en ligne de commande qui automatise les deux étapes, y compris les preuves de Merkle pour les certificats regroupés. Il est sous licence MIT, et il n'est pas encore publié sur un registre public, donc aujourd'hui il n'existe aucun moyen pour vous de l'obtenir, et la procédure de cette page n'utilise délibérément rien de chez nous. Quand le vérificateur sera publié, cette page indiquera où l'obtenir, et pas un jour avant.

La vérifiabilité ne coûte rien à la vie privée

La vérification publique lit une vue de base de données dédiée qui ne contient ni noms, ni titres, ni adresses. Un tiers peut confirmer qu'un paquet existe et que son empreinte correspond, et n'apprend rien sur qui a signé quoi.

Comment fonctionne la vérification, étape par étape

Les limites, déclarées

Une page de sécurité qui ne liste que des points forts est une publicité. Voici les limites. Elles sont ici parce que l'alternative est que vous les découvriez plus tard.

Nous ne détenons aucune certification de sécurité

Nous ne sommes pas SOC 2 Type II. Nous ne sommes pas ISO 27001. Nous ne sommes pas conformes HIPAA. Aucun auditeur ne nous a évalués au regard de ces référentiels, et nous n'afficherons pas un badge que nous ne détenons pas. Le RGPD est d'une autre nature : une loi que nous sommes tenus de respecter, pas un certificat que quiconque décerne, c'est pourquoi vous trouverez ici une page de protection des données et aucun sceau.

Le produit n'est pas open source ; la partie qui nous contrôle est censée l'être

Vous ne pouvez pas lire notre code serveur, et vous ne devriez pas avoir à le faire. Ce qui doit être digne de confiance, c'est la capacité de vérifier notre résultat sans nous, et cette capacité repose aujourd'hui sur une norme publiée et une blockchain publique plutôt que sur l'une de nos promesses.

Le limiteur de débit échoue en mode ouvert

Si le compteur lui-même est injoignable, la requête passe et l'anomalie est journalisée. C'est délibéré : une panne du compteur bloquerait sinon des signataires légitimes, et la défense qui compte réellement contre les tentatives de deviner le code, le verrouillage après trois tentatives, n'en dépend pas.

La suppression de votre compte ne supprime pas les certificats émis

Elle supprime vos données personnelles, vos brouillons et votre travail en attente. Les certificats déjà émis restent vérifiables, car ils constituent aussi les preuves de l'autre partie : les détruire à la demande d'un signataire irait à l'encontre de la raison même de leur existence.

La destruction d'un enregistrement n'est pas instantanée partout

Nous supprimons les fichiers. Pendant une heure au maximum, un cache de stockage peut encore servir une copie, et les copies déjà téléchargées par des personnes qui y avaient droit restent là où elles sont. Ce qui n'est jamais affecté, c'est la preuve : le hachage audio, le paquet de preuves et l'ancrage restent intacts, donc détruire un enregistrement ne change jamais ce qui a été certifié.

Il n'y a pas de prime aux bogues

Nous lisons chaque signalement et corrigeons ce qui est réel, mais nous ne gérons pas de programme rémunéré et nous préférons que vous n'en attendiez pas.

Nous préférons que vous les lisiez ici plutôt que de les découvrir plus tard. Aucune ne touche à la partie qui compte le plus, à savoir si un certificat peut être vérifié sans nous, et cette partie se trouve ci-dessus, avec les commandes pour le faire.

Signaler une vulnérabilité

Si vous avez trouvé quelque chose, nous voulons l’apprendre de vous avant de l’apprendre de quelqu’un d’autre.

  • Écrivez à hub@witup.ai. Dites-nous ce que vous avez fait, ce qui s’est passé et comment le reproduire. Une ligne sur l’impact aide davantage qu’un rapport de scanner.
  • Testez uniquement avec votre propre compte et vos propres données. Ne touchez pas aux protocoles, sessions ou certificats d’autres personnes et ne lancez pas de tests de charge ni de déni de service contre le service.
  • Nous ne publions pas d’engagement de délai de réponse, car nous ne sommes pas encore en mesure d’en garantir un. Nous préférons le dire plutôt que de promettre un chiffre que nous risquerions de ne pas tenir.
hub@witup.ai

Où aller ensuite