Le hack du compilateur de Ken Thompson est-il toujours une menace?


156

Ken Thompson Hack (1984)

Ken Thompson a décrit une méthode pour corrompre un binaire du compilateur (et d'autres logiciels compilés, comme un script de login sur un système * nix) en 1984. J'étais curieux de savoir si la compilation moderne avait corrigé ou non cette faille de sécurité.

Brève description:

Réécrivez le code du compilateur pour qu'il contienne 2 failles:

  • Lors de la compilation de son propre binaire, le compilateur doit compiler ces failles
  • Lors de la compilation d’un autre code présélectionné (fonction de connexion), il doit compiler une porte dérobée arbitraire.

Ainsi, le compilateur fonctionne normalement - lorsqu'il compile un script de connexion ou similaire, il peut créer une porte dérobée de sécurité, et lorsqu'il compile de nouvelles versions de lui-même à l'avenir, il conserve les failles précédentes - et les failles n'existeront que dans le compilateur. binaires sont donc extrêmement difficiles à détecter.

Des questions:

Je n'ai trouvé aucune réponse à ces questions sur le Web:

  • Comment cela se rapporte-t-il à la compilation juste à temps?
  • Des fonctions telles que le programme gérant les connexions sur un système * nix sont-elles compilées lors de leur exécution?
  • Est-ce toujours une menace valable, ou existe-t-il des développements dans la sécurité de compilation depuis 1984 qui empêchent que cela soit un problème important?
  • Cela affecte-t-il toutes les langues?

Pourquoi est-ce que je veux savoir?

Je suis tombé sur cette idée en faisant des devoirs. Cela semblait intéressant, mais je n’ai pas suffisamment d’arrière-plan pour comprendre concrètement s’il s’agit d’un problème d'actualité ou d'un problème résolu.

Matériel de référence


6
La stratégie Diverse double compilation est un moyen raisonnablement fiable de détecter la présence d’un compilateur RoTT.
dmckee

3
J'imagine que la NSA a consacré beaucoup de travail à ce type d'attaque.
Paul M

Réponses:


110

Ce hack doit être compris dans son contexte. Il a été publié à une époque et dans une culture où Unix fonctionnant sur tout type de matériel était le système dominant.

Ce qui a rendu l’attaque si effrayante, c’est que le compilateur C était le logiciel central de ces systèmes. Presque tout dans le système passait par le compilateur lors de sa première installation (les distributions binaires étaient rares en raison du matériel hétérogène). Tout le monde compilait des trucs tout le temps. Les gens inspectaient régulièrement le code source (ils devaient souvent faire des ajustements pour le compiler), donc faire injecter le compilateur à l'arrière-plan semblait être une sorte de scénario de "crime parfait" où vous ne pourriez pas vous faire prendre.

De nos jours, le matériel est beaucoup plus compatible et les compilateurs jouent donc un rôle beaucoup moins important dans le fonctionnement quotidien d'un système. Un compilateur compromis n’est plus le scénario le plus effrayant: des rootkits et un BIOS compromis sont encore plus difficiles à détecter et à supprimer.


27
Ou, comme la plupart des gens ne compilent rien à partir de la source (par exemple, sous Windows), votre cheval de Troie moyen suffira :) (je conviens qu'un compilateur compromis est excessif)
Andres F.

16
@ArjunShankar: Un compilateur exclusif binaire propriétaire non libre n'a pas besoin et ne peut pas avoir cette porte dérobée. Cette porte dérobée ne s'applique qu'aux compilateurs que vous compilez vous-même à partir du code source.
Ruakh

12
À l'exception du bureau, Unix et toutes ses variantes constituent toujours le système d'exploitation dominant.
Rob le

7
@ruakh: peut-être que je ne comprends pas votre insistance sur «ceci», mais il se trouve que je ne suis pas d'accord. Si cette porte dérobée a été introduite dans l'entreprise qui possède le compilateur propriétaire non libre et utilise ce compilateur pour compiler de nouvelles versions du même compilateur, cette porte dérobée aurait un impact bien pire que dans le scénario d'origine. Vous aurez besoin d'un seul vecteur d'attaque pour tout infecter.
Orithena

8
Imaginez que quelqu'un compromet un serveur de construction Ubuntu et remplace le compilateur sans changer de source. Cela pourrait prendre un peu de temps avant que cela soit découvert et, à ce moment-là, les images ubuntu seraient diffusées partout avec le compilateur compromis intégré (avec les assemblages de connexion compromis ou ce que vous avez). Je pense que cela reste une préoccupation parfaitement valable.
Jimmy Hoffa

74

Le but de ce discours n'était pas de mettre en évidence une vulnérabilité à traiter, ni même de proposer une vulnérabilité théorique dont nous devons être conscients.

Le but était que, en matière de sécurité, nous ne voulions faire confiance à personne, mais malheureusement, c'est impossible. Vous devez toujours faire confiance à quelqu'un (d'où le titre: "Réflexions sur la confiance")


Même si vous êtes un type paranoïaque qui crypte le disque dur de son ordinateur de bureau et refuse d’exécuter les logiciels que vous n’avez pas compilés vous-même, vous devez toujours faire confiance à votre système d’exploitation. Et même si vous compilez le système d'exploitation vous-même, vous devez toujours faire confiance au compilateur que vous avez utilisé. Et même si vous compilez votre propre compilateur, vous devez toujours faire confiance à ce compilateur! Et cela ne mentionne même pas les fabricants de matériel!

Vous ne pouvez tout simplement pas vous en tirer en ne faisant confiance à personne . C'est le point qu'il essayait de faire passer.


2
Si vous avez un compilateur open-source dont le comportement ne dépend d'aucun comportement défini ou non spécifié par une implémentation, compilez-le à l'aide de divers compilateurs développés indépendamment (approuvé ou non), puis compilez un programme en utilisant les différentes versions compilées de Pour ce faire, chaque compilateur devrait produire exactement le même résultat. S'ils le faisaient, cela suggérerait que la seule façon pour un cheval de Troie d'être dans l'un serait de l'identifier. Cela semblerait plutôt improbable. Une de mes peeves avec beaucoup de .net, cependant ...
Supercat

9
@supercat: Vous semblez manquer le point. Vous dites que le piratage présenté par Ken Thompson peut être corrigé. Je dis que le piratage qu'il a choisi n'a pas d'importance; c'était juste un exemple, pour démontrer son point plus large qu'il faut toujours faire confiance à quelqu'un . C'est pourquoi cette question n'a pas beaucoup de sens - elle manque complètement la forêt pour les arbres.
BlueRaja - Danny Pflughoeft le

9
@supercat: Il est hautement improbable que différents compilateurs produisent le même bytecode pour tout programme non trivial en raison de décisions de conception, d'optimisations, etc. différents. Cela soulève la question suivante: comment sauriez-vous même que les fichiers binaires sont identiques?
Ankit Soni

1
@AnkitSoni: Ma réponse va plus en détail. Si vous compilez différents compilateurs avec un compilateur / éditeur de code source ouvert correctement écrit, vous obtiendrez différents exécutables ayant un comportement identique . Si les exécutables se comportent de manière identique, ils produiront le même résultat si le code du compilateur / éditeur de liens open source leur est transmis. Pour comparer les fichiers, on peut les copier sur une disquette et utiliser un ancien ordinateur pour les comparer.
Supercat

2
Une partie de cette conversation ne signifierait-elle pas simplement que pour les choses que vous avez testées, les fichiers binaires / le matériel se sont déroulés comme prévu? Il pourrait encore y avoir quelque chose que vous n'avez pas testé et dont vous n'êtes pas au courant.
Bart Silverstrim

53

Non

L'attaque, telle que décrite à l'origine, n'a jamais été une menace. Théoriquement, un compilateur pourrait le faire, mais pour en venir à bout de l'attaque, il faudrait le programmer pour qu'il

  • Reconnaître quand le code source en cours de compilation est un compilateur, et
  • Découvrez comment modifier le code source arbitraire pour y insérer le piratage.

Cela implique de déterminer le fonctionnement du compilateur à partir de son code source, afin de pouvoir le modifier sans interruption.

Par exemple, imaginez que le format de liaison stocke les longueurs de données ou le décalage du code machine compilé quelque part dans l'exécutable. Le compilateur devrait déterminer lui-même lequel de ces éléments doit être mis à jour et où, lors de l'insertion de la charge utile de l'exploit. Les versions ultérieures du compilateur (version inoffensive) peuvent changer arbitrairement ce format, de sorte que le code d'exploitation aurait effectivement besoin de comprendre ces concepts.

C'est une programmation auto-dirigée de haut niveau, un problème d'intelligence artificielle difficile (la dernière fois que j'ai vérifié, l'état de l'art produisait du code qui est pratiquement déterminé par ses types). Regardez: peu d'humains peuvent même le faire; il vous faudrait d'abord apprendre le langage de programmation et comprendre la base de code.

Même si le problème de l'IA était résolu, les gens remarqueraient que si compiler leur compilateur minuscule aboutissait à un binaire avec une énorme bibliothèque d'IA liée à celui-ci.

Attaque analogue: amorçage de la confiance

Cependant, une généralisation de l'attaque est pertinente. Le problème fondamental est que votre chaîne de confiance doit commencer quelque part et que, dans de nombreux domaines, son origine pourrait subvertir toute la chaîne de manière difficile à détecter.

Un exemple qui pourrait facilement être tiré dans la vie réelle

Ubuntu Linux, votre système d’exploitation assure la sécurité (intégrité) des mises à jour en vérifiant les packages de mise à jour téléchargés par rapport à la clé de signature du référentiel (à l’aide de la cryptographie à clé publique). Mais cela ne garantit l' authenticité des mises à jour que si vous pouvez prouver que la clé de signature appartient à une source légitime.

Où avez-vous obtenu la clé de signature? Lorsque vous avez téléchargé pour la première fois la distribution du système d’exploitation.

Vous devez avoir la certitude que la source de votre chaîne de confiance, cette clé de signature, n'est pas mauvaise.

Toute personne pouvant disposer de la connexion Internet MITM entre vous et le serveur de téléchargement Ubuntu - qu'il s'agisse de votre fournisseur d'accès à Internet, d'un gouvernement qui contrôle l'accès à Internet (par exemple en Chine) ou du fournisseur d'hébergement Ubuntu - aurait pu détourner ce processus:

  • Détectez que vous téléchargez l'image du CD Ubuntu. C'est simple: vérifiez que la demande est dirigée vers l'un des miroirs Ubuntu (répertoriés publiquement) et demande le nom de fichier de l'image ISO.
  • Envoyez la requête à partir de leur propre serveur, en vous fournissant une image CD contenant la clé publique de l'attaquant et l'emplacement du référentiel au lieu de celui d'Ubuntu.

Dorénavant, vous obtiendrez vos mises à jour en toute sécurité du serveur de l'attaquant. Les mises à jour étant exécutées en tant que root, l’attaquant a le contrôle total.

Vous pouvez empêcher l'attaque en vous assurant que l'original est authentique. Mais cela nécessite que vous validiez l’image CD téléchargée à l’aide d’un hachage ( peu de gens le font réellement ). Le hachage doit lui-même être téléchargé de manière sécurisée, par exemple via HTTPS. Et si votre attaquant peut ajouter un certificat sur votre ordinateur (courant dans un environnement d'entreprise) ou contrôler une autorité de certification (par exemple, la Chine), même le protocole HTTPS ne fournit aucune protection.


47
C'est faux. Le compilateur doit seulement déterminer le moment où il compile un fichier source très spécifique à partir de son propre code source avec un contenu très spécifique, et non le moment où il compile un compilateur !!!
Kaz

14
@Kaz - À un moment donné, les modifications de la carte au compilateur ou au programme de connexion risquent d'aboutir au point où elles neutralisent le compilateur-identificateur / identificateur de connexion de la porte dérobée, et les itérations suivantes perdraient la porte dérobée. Ceci est analogue à une mutation biologique aléatoire conférant une immunité à certaines maladies.
Russell Borogove

12
La première moitié de votre réponse a le problème décrit par Kaz, mais la seconde moitié est tellement bonne que je suis + 1 en tout cas!
Ruakh

7
Un compilateur maléfique qui reconnaît seulement que sa propre source est facile à construire, mais relativement sans valeur dans la pratique - peu de personnes possédant déjà un binaire de ce compilateur l'utilisent pour recréer ledit binaire. Pour que l'attaque réussisse plus longtemps, le compilateur aurait besoin de plus d'intelligence pour patcher de nouvelles sources de sa propre source, ce qui entraînerait les problèmes décrits dans la réponse.
user281377

5
Un identifiant pour un compilateur spécifique pourrait être assez général et peu susceptible de se briser face à la nouvelle version. Prenons l'exemple de gcc: de nombreuses lignes de code dans gcc sont très anciennes et n'ont pas beaucoup changé. Des choses simples comme le nom ne changent presque jamais. Avant que la reconnaissance ne tourne mal, il est probable que le code injecté le serait. Et en réalité, ces deux problèmes sont en grande partie théoriques - en pratique, un auteur de malware n'aurait aucune difficulté à se tenir au courant du rythme (lent) du développement du compilateur.
Eamon Nerbonne

25

Premièrement, mon récit préféré de ce hack s'appelle Strange Loops .

Ce piratage particulier pourrait certainement (*) être fait aujourd'hui dans tous les grands projets de systèmes d'exploitation open source, en particulier Linux, * BSD, etc. Je m'attendrais à ce que cela fonctionne presque à l'identique. Par exemple, vous téléchargez une copie de FreeBSD avec un compilateur exploité pour modifier openssh. A partir de là, chaque fois que vous mettez à niveau openssh ou le compilateur par source, vous continuez le problème. En supposant que l'attaquant ait exploité le système utilisé pour empaqueter FreeBSD en premier lieu (vraisemblablement, étant donné que l'image elle-même est corrompue ou que l'attaquant est en fait le conditionneur), chaque fois que ce système reconstruira les fichiers binaires de FreeBSD, le problème sera réinjecté. Cette attaque peut échouer de nombreuses manières, mais elles ne diffèrent pas fondamentalement de la manière dont l'attaque de Ken aurait pu échouer (**). Le monde n'a vraiment pas beaucoup changé.

Bien entendu, des attaques similaires pourraient tout aussi bien (ou plus facilement) être injectées par leurs propriétaires dans des systèmes tels que Java, le SDK iOS, Windows ou tout autre système. Certains types de failles de sécurité peuvent même être intégrés au matériel (en particulier, affaiblir la génération de nombres aléatoires).

(*) Mais par "certainement", je veux dire "selon le principe". Devriez-vous vous attendre à ce que ce type de trou existe dans un système particulier? Non, je considérerais cela assez improbable pour diverses raisons pratiques. Avec le temps, au fur et à mesure que le code change, la probabilité que ce type de piratage provoque des bogues étranges augmente. Et cela augmente la probabilité que cela soit découvert. Des backdoors moins ingénieux nécessiteraient des complots à maintenir. Bien sûr, nous savons pertinemment que des portes dérobées "d'interception licite" ont été installées dans divers systèmes de télécommunication et de réseau, de sorte que, dans de nombreux cas, ce type de piratage élaboré est inutile. Le hack est installé ouvertement.

Alors toujours, défense en profondeur.

(**) En supposant que l'attaque de Ken ait réellement existé. Il a juste discuté de la façon dont cela pourrait être fait. Il n'a pas dit qu'il l'a réellement fait autant que je sache.


En ce qui concerne votre deuxième note de bas de page, Ken a déclaré "construit et non distribué."
8bittree

15

Cela affecte-t-il toutes les langues?

Cette attaque affecte principalement les langues qui s'auto-hébergent. Ce sont les langues où le compilateur est écrit dans la langue elle-même. C, Squeak Smalltalk et l'interpréteur PyPy Python seraient affectés par cela. Perl, JavaScript et l'interpréteur CPython Python ne le feraient pas.

Comment cela se rapporte-t-il à la compilation juste à temps?

Pas beaucoup. C'est la nature auto-hébergée du compilateur qui permet de masquer le piratage. Je ne connais aucun compilateur JIT auto-hébergé. (Peut-être que LLVM?)

Des fonctions telles que le programme gérant les connexions sur un système * nix sont-elles compilées lors de leur exécution?

Pas habituellement. Mais la question n'est pas quand il est compilé, mais par quel compilateur . Si le programme de connexion est compilé par un compilateur corrompu, il sera corrompu. Si elle est compilée par un compilateur propre, elle le sera.

Est-ce toujours une menace valable, ou existe-t-il des développements dans la sécurité de compilation depuis 1984 qui empêchent que cela soit un problème important?

C'est toujours une menace théorique, mais ce n'est pas très probable.

Une solution consiste à utiliser plusieurs compilateurs. Par exemple, un compilateur LLVM qui est lui-même compilé par GCC ne passera pas par la porte arrière. De même, un GCC compilé par LLVM ne passera pas par une porte dérobée. Donc, si vous êtes inquiet à propos de ce type d'attaque, vous pouvez alors compiler votre compilateur avec un autre type de compilateur. Cela signifie que le pirate malveillant (chez votre fournisseur de système d'exploitation?) Devra souiller les deux compilateurs pour se reconnaître; Un problème beaucoup plus difficile.


Votre dernier paragraphe n'est pas, à proprement parler, vrai. En théorie, le code pourrait détecter le compilateur en cours de compilation et générer la sortie par la porte arrière de manière appropriée. Ceci est bien sûr irréalisable dans le monde réel, mais rien ne l’empêche intrinsèquement. Mais alors, l’idée de départ n’était pas de véritables menaces pratiques mais plutôt une leçon de confiance.
Steven Burnap

Bon point. Après tout, le hack transporte une porte dérobée pour la connexion et un mod pour le compilateur, ce qui lui permet de transporter un mod pour un autre compilateur. Mais cela devient de plus en plus improbable.
Sean McMillan

La compilation juste à temps pourrait être un régal. Si un code présente une vulnérabilité uniquement lorsqu'un morceau particulier est compilé avec JIT, il peut passer inaperçu. (pure pure thoery)
GameDeveloper

12

Il y a une chance théorique pour que cela se produise. Il existe toutefois un moyen de vérifier si un compilateur spécifique (avec le code source disponible) a été compromis, par le biais de la double compilation de David A. Wheeler .

Fondamentalement, utilisez le compilateur présumé et un autre compilateur développé indépendamment pour compiler la source du compilateur suspect. Cela vous donne SC sc et SC T . Maintenant, compilez la source suspecte à l'aide de ces deux fichiers binaires. Si les fichiers binaires résultants sont identiques (à l'exception d'une variété d'éléments qui peuvent légitimement varier, comme des horodatages assortis), le compilateur suspect n'abusait pas réellement de la confiance.


Cela ou le compilateur de confiance ne sont pas aussi fiables que l'utilisateur le pensait. Mais pour deux implémentations indépendantes d'un langage, la probabilité qu'elles contiennent la même porte dérobée est négligeable.
Damian Yerrick

Ou l'outil de diff que vous utilisez pour les comparer a également été compromis;)
iCodeSometime

@kennycoc Cependant, écrire un outil de comparaison "ces deux fichiers sont-ils identiques" n'est-il pas si difficile à prendre en compte (comme dans une référence syscall, il devrait être faisable en 2-16 heures en code machine binaire).
Vatine

3

En tant qu'attaque spécifique, il s'agit toujours d'une menace, qui n'en est quasiment pas une.

Comment cela se rapporte-t-il à la compilation juste à temps?

Je ne sais pas ce que vous entendez par là. Est-ce qu'un JITter est immunisé contre cela? Est-ce plus vulnérable? Pas vraiment. En tant que développeur, VOTRE application est plus vulnérable simplement parce que vous ne pouvez pas valider que cela n’a pas été fait. Notez que votre application encore non développée est fondamentalement à l'abri de cela et de toutes les variantes pratiques. Vous n'avez qu'à vous soucier d'un compilateur plus récent que votre code.

Des fonctions telles que le programme gérant les connexions sur un système * nix sont-elles compilées lors de leur exécution?

Ce n'est pas vraiment pertinent.

Est-ce toujours une menace valable, ou existe-t-il des développements dans la sécurité de compilation depuis 1984 qui empêchent que cela soit un problème important?

Il n'y a pas de réelle sécurité de compilation, et ne peut pas l'être. C'était vraiment le but de son discours, qu'à un moment donné, il faut faire confiance à quelqu'un.

Cela affecte-t-il toutes les langues?

Oui. Fondamentalement, à un moment ou à un autre, vos instructions doivent être transformées en quelque chose que l’ordinateur exécute, et cette traduction peut être mal faite.


-2

David Wheeler a un bon article: http://www.dwheeler.com/trusting-trust/

Moi, je suis plus inquiet pour les attaques de matériel. Je pense que nous avons besoin d’une chaîne d’outils de conception totalement VLSI avec du code source FLOSS, que nous pouvons modifier et compiler nous-mêmes, ce qui nous permet de construire un microprocesseur qui n’a pas de backdoors inséré par les outils. Les outils devraient également nous permettre de comprendre le but de tout transistor sur la puce. Ensuite, nous pourrions ouvrir un échantillon des puces finies et les inspecter avec un microscope, en nous assurant qu'elles avaient le même circuit que celui que les outils disaient être supposées avoir.


3
-1, l'essentiel de votre réponse ne répond pas à la question.

-3

Les systèmes dans lesquels les utilisateurs finaux ont accès au code source sont ceux pour lesquels vous devriez cacher ce type d'attaque. Ce seraient des systèmes open source dans le monde d'aujourd'hui. Le problème est que, même s’il existe une dépendance vis-à-vis d’un compilateur unique pour tous les systèmes Linux, l’attaque devrait toucher les serveurs de compilation pour toutes les principales distributions Linux. Puisque ceux-ci ne téléchargent pas directement les fichiers binaires du compilateur pour chaque version du compilateur, le source de l'attaque aurait dû se trouver sur leurs serveurs de génération dans au moins une version précédente du compilateur. Soit cette version, soit la toute première version du compilateur téléchargée en tant que binaire, aurait dû être compromise.


2
Votre réponse raye la surface de la question, mais ne répond pas vraiment à ce qui est demandé.

-4

Si on a le code source d'un système de compilation / compilation dont la sortie ne devrait dépendre que du contenu des fichiers sources fournis, et si on dispose de plusieurs autres compilateurs et sachant qu'ils ne contiennent pas tous le même hack de compilateur, on peut assurez-vous que vous obtenez un exécutable qui ne dépend que du code source.

Supposons que le paquetage d'un compilateur / éditeur de liens (par exemple, la suite Groucho) ait le code source écrit de telle sorte que sa sortie ne dépende d'aucun comportement non spécifié, ni d'aucun autre contenu que le contenu des fichiers source d'entrée, et on compile / des liens qui codent sur une variété de compilateurs / lieurs produits indépendamment (par exemple, les suites Harpo, les suites Chico et Zeppo), donnant un ensemble d'exeuctables différent pour chacun (appelez-les G-Harpo, G-Chico et G-Zeppo). Il n’est pas surprenant que ces exécutables contiennent différentes séquences d’instructions, mais elles doivent être fonctionnellement identiques. Prouver qu'ils sont fonctionnellement identiques dans tous les cas constituerait toutefois un problème insoluble.

Heureusement, une telle preuve ne sera pas nécessaire si vous utilisez les exécutables résultants dans un seul but: compiler à nouveau la suite Groucho. Si on compile la suite Groucho en utilisant G-Harpo (donnant GG-Harpo), G-Chico (GG-Chico) et G-Zeppo (GG-Zeppo), les trois fichiers résultants, GG-Harpo, GG-Chico , et GG-Zeppo, doivent tous être identiques octet par octet. Si les fichiers concordent, cela impliquerait que tout "virus du compilateur" existant dans l'un d'entre eux doit exister de manière identique dans chacun d'entre eux (les trois fichiers étant identiques octet par octet, il est impossible que leurs comportements diffèrent de quelque manière que ce soit). façon).

En fonction de l'âge et de la lignée des autres compilateurs, il peut être possible de s'assurer qu'un tel virus ne puisse exister de manière plausible dans ceux-ci. Par exemple, si vous utilisez un ancien Macintosh pour alimenter un compilateur écrit à partir de rien en 2007 avec une version de MPW écrite dans les années 1980, les compilateurs des années 1980 ne sauraient pas où insérer un virus dans le compilateur 2007. Il est peut-être possible aujourd'hui pour un compilateur de faire une analyse de code assez sophistiquée pour le comprendre, mais le niveau de calcul requis pour une telle analyse dépasserait de loin le niveau de calcul requis pour simplement compiler le code, et n'aurait peut-être pas passé inaperçu. dans un marché où la vitesse de compilation était un argument de vente majeur.

Je dirais que si on travaille avec des outils de compilation où les octets d'un fichier exécutable à produire ne doivent dépendre d'aucune autre manière que du contenu des fichiers sources soumis, il est possible d'obtenir une immunité relativement bonne d'un Thompson virus de style. Malheureusement, pour une raison quelconque, le non-déterminisme dans la compilation semble être considéré comme normal dans certains environnements. Je reconnais que sur un système multiprocesseur, un compilateur peut fonctionner plus rapidement s’il est autorisé à faire varier certains aspects de la génération de code en fonction de l’un des deux threads qui termine un travail en premier.

D'autre part, je ne vois pas pourquoi les compilateurs / éditeurs de liens ne devraient pas fournir un mode de "sortie canonique" dans lequel la sortie dépend uniquement des fichiers source et d'une "date de compilation" qui peut être remplacée par l'utilisateur. . Même si la compilation de code dans un tel mode prenait deux fois plus de temps qu'une compilation normale, je suggérerais qu'il serait extrêmement utile de pouvoir recréer n'importe quelle "release build", octet pour octet, entièrement à partir de sources, même si cela signifiait les versions de publication prendraient plus de temps que les "versions normales".


2
-1. Je ne vois pas comment votre réponse aborde les aspects fondamentaux de la question.

@ GlenH7: De nombreux outils de compilation plus anciens produisaient systématiquement une sortie identique lorsque l'on recevait une entrée identique (en dehors de TIME , par exemple, ce qui pourrait être modifié pour indiquer un temps de compilation "officiel"]. En utilisant de tels outils, on pourrait très bien se protéger contre les virus du compilateur. Le fait que certains frameworks de développement populaires ne fournissent aucun moyen de compiler le code de manière "déterministe" signifie que les techniques qui auraient pu protéger contre les virus dans des outils plus anciens ne peuvent pas être utilisées efficacement avec des outils plus récents.
Supercat

Avez-vous essayé cela? 1. Dirigez avec votre thèse. 2. Utilisez des paragraphes plus courts. 3. Soyez plus explicite sur la différence entre "fonctionnellement identique" (le résultat de la première étape) et "bit identique" (le résultat de la deuxième), éventuellement avec une liste de tous les fichiers binaires du compilateur générés et leurs relations les uns avec les autres. 4. Citer le document de David A. Wheeler, DDC.
Damian Yerrick
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.