Prouver cryptographiquement le code source open source du serveur

Sep 30 2020

Je veux prouver que le code source que j'utilise est le même que la version open-source, qui est accessible au public. Mon idée était de publier un hachage de la version open-source et de le comparer au hachage du serveur déployé au démarrage. Cependant, étant donné que le hachage open-source est disponible avant le déploiement, il est possible pour un mauvais acteur de coder en dur le hachage dans le serveur et d'éviter la fonction de hachage.

Y a-t-il un moyen d'empêcher que cela se produise? J'ai trouvé que Heroku utilise une approche similaire où ils récupèrent le hachage de validation. Est-ce inviolable? Et si oui, en quoi est-ce différent de mon approche?

Réponses

2 MechMK1 Sep 30 2020 at 17:20

C'est essentiellement une tâche impossible.

Si vous avez lu " Reflections on Trusting Trust " de Ken Thompson , alors vous savez déjà tout ce que je vais dire. Sinon, continuez à lire:

Imaginez que je publie un projet open-source, qui est écrit dans une langue, et prend simplement l'entrée et renvoie l'entrée inchangée - comme une version très simple de echo. Vous téléchargez mon code source, lisez tout cela (il ne fait que quelques lignes de toute façon) et ensuite vous le compilez. Vous pouvez être sûr que votre programme fait exactement ce que vous pensez, n'est-ce pas?

Faux.

Comment savez-vous que votre compilateur n'a ajouté aucune instruction supplémentaire, telle que vérifier si le hachage sha-256 de l'entrée est ou non e257f6eccac764b6cea785a0272e34d3dbc56419eac2ad436b9fb4bddcd10494et si c'est le cas, faites quelque chose d'inattendu.

Vous pourriez dire que c'est peu probable, mais vous ne pouvez jamais en être totalement certain. Mais peut - être que vous voulez être pleinement certain, non? Après tout, vous voulez prouver par cryptographie que le logiciel que vous utilisez fait exactement ce que le code source dit qu'il doit faire. Vous inspectez donc le binaire avec un outil de rétro-ingénierie, comme Ghidra ou IDA Pro. Mais ... comment pouvez-vous être sûr que ces outils font ce que vous pensez qu'ils font? Bien sûr, à première vue, ils peuvent sembler vous montrer le binaire tel qu'il est, mais comment pouvez-vous être sûr qu'ils ne vous cachent pas le code inséré de manière malveillante?

Vous pouvez complètement renoncer aux compilateurs existants et écrire le vôtre en bytecode, octet par octet, instruction pour instruction, mais comment feriez-vous cela? Vous avez besoin d'un programme qui écrit ces octets sur le disque. Comment savez-vous que ceux -ci ne sont pas infectés et écrivent des octets supplémentaires?

Et même si vous renoncez complètement aux programmes et utilisez simplement une aiguille magnétisée et une main ferme , comment pouvez-vous être sûr que votre CPU exécute réellement les instructions que vous voulez qu'il exécute et n'exécute pas des instructions supplémentaires? Après tout, les processeurs exécutent un microcode de nos jours, ce qui est difficile à inspecter.

En résumé...

... il est extrêmement difficile de prouver qu'un ordinateur fait ce que nous pensons qu'il fait. Pouvez-vous afficher un hachage d'un code source ou d'un état de déploiement pour montrer quelque chose à vos clients? Bien sûr vous pouvez. Mais cela ne veut vraiment rien dire.

1 reed Sep 30 2020 at 21:11

Si je comprends bien votre question, ce que vous demandez est impossible car un serveur agit comme une sorte de "boîte noire" et les utilisateurs normaux n'ont aucun moyen d'inspecter ce qui se passe réellement.

Vous n'avez pas simplement à prouver que vous avez quelque chose ou que vous savez quelque chose: vous auriez en fait besoin de prouver que vous utilisez quelque chose exactement comme prévu, y compris chaque étape et chaque détail du processus. Prouver le comportement exact d'une boîte noire implique de nombreuses analyses et inspections que les utilisateurs normaux ne peuvent pas être autorisés à faire.

En d'autres termes, pour donner un exemple simple, StackExchange ne peut vraiment pas nous convaincre qu'il stocke réellement les mots de passe en toute sécurité, en utilisant une implémentation spécifique d'une fonction de hachage sécurisée. Certaines choses pourraient cependant nous aider à nous convaincre: par exemple, disposer d'un système d'audit continu et approfondi, réalisé par des autorités de confiance externes. Ensuite, si nous pouvons faire confiance aux auditeurs externes, nous pouvons considérer ce qu'ils rapportent comme une preuve. La pleine conformité n'est cependant jamais entièrement garantie (les auditeurs peuvent être corrompus). Comme vous pouvez le voir, le problème est assez compliqué.

1 RichardM Oct 01 2020 at 21:45

Excellente question!

Ce n'est peut-être pas une preuve à 100%, mais vous pouvez essayer de vous rapprocher de la transparence. Ce qui pourrait être fait, c'est autoriser un certain niveau d'audit de la pile. Par exemple, pour autoriser publickly see processess (shell en lecture seule?) Et quels binaires (ftp en lecture seule?) Ils exécutent. Ensuite, n'importe qui peut télécharger le binaire, faire la somme de contrôle et comparer avec le fournisseur-un.