Les compilateurs sont-ils généralement validés pour s’assurer qu’ils ne fonctionneront pas sur la machine utilisateur lors de la compilation d’un morceau de code astucieux?
En général, ils sont trop complexes et souvent écrits en utilisant des langages dans lesquels il n'est pas pratique de prouver cette propriété.
Peut-être pas avec cette intention spécifique, mais la notion de compilateurs de test fuzz est au moins connue ( LLVM peut maintenant effectuer un test fuzz lui-même ). Les tests destinés à intercepter une entrée qui bloque le compilateur à cause de bogues du compilateur auront également tendance à révéler des failles exploitables.
Naturellement, il vous faudrait déterminer si le compilateur qui vous intéresse est testé ou non-fuzz pour détecter les pannes potentielles, et si les bogues ainsi trouvés sont réellement corrigés. La règle de base est que s'il existe des collisions plus graves que des exceptions non mémorisées en mémoire, alors, sans enquêter davantage sur les détails, vous devez envisager la possibilité sérieuse de les utiliser pour exploiter des exploits.
Est-il prudent de compiler un morceau de code d'un inconnu?
Malheureusement, combien de temps dure un bout de ficelle. En principe, l'e-mail peut exploiter votre client de messagerie ou le code source, votre éditeur de texte ou cppcheck, avant même d'atteindre votre compilateur. La suggestion de Sebastian dans les commentaires d'utiliser un compilateur en ligne est une très bonne idée, mais bien sûr, le code doit être sous une forme que le compilateur acceptera.
N'importe quel langage ou compilateur disposant de fonctionnalités permettant l'exécution d'un code général au moment de la compilation est évidemment très suspect. Les modèles C ++ sont fonctionnellement complets, mais n'ont pas accès (prévu) au système, ils présentent donc un risque relativement faible. BЈовић mentionne make
le risque extrêmement élevé (puisqu'il exécute le code de l'inconnu, c'est simplement que le code est écrit dans le make
langage, pas en C ++). Si le compilateur s'exécute, system
vous êtes dans le même bateau. J'avais l'habitude de travailler avec un assembleur qui, si je me souviens bien, pouvait exécuter du code à la compilation de manière arbitraire. Il était destiné aux tables de consultation, mais je ne pense pas que rien vous ait empêché de passer des appels système.
En pratique , si le code me semble correct et si je pense le comprendre, alors je considère qu'il est extrêmement risqué de le compiler, un risque bien moindre que celui de "naviguer sur Internet avec un navigateur verrouillé". Je fais régulièrement des choses plus risquées sur ma machine polyvalente, mais je ne ferais pas beaucoup de choses, par exemple dans un laboratoire de virus ou sur un serveur critique. Si le code est drôle ou évidemment obscurci, je ne risquerais peut-être pas de le compiler car, outre le risque, il pourrait contenir un exploit caché dans une liste illisible, il s'agit d'un code de déchets. Le code sournois est difficile mais possible. Le code sous-jacent utilisé par la machine via un exploit du compilateur doit contenir une charge utile exécutable non triviale, il est donc extrêmement difficile.
Si vous souhaitez approfondir cette question, essayez de demander aux personnes qui hébergent des compilateurs en ligne. Si cela ne leur a pas été fait alors (à moins que vous ne veniez à l'attention de la NSA ou de son équivalent), vous pouvez raisonnablement supposer que cela ne vous sera pas fait. Ils s’efforcent d’exécuter leur compilateur dans un bac à sable approprié, ce qui peut être plus difficile que vous ne le souhaitez, mais ils pourraient au moins être en mesure de vous dire à quelle fréquence ce bac leur évite des problèmes.