La vulnérabilité de Linux aux erreurs de sécurité d’Apple
La vulnérabilité de Linux aux erreurs de sécurité d’Apple


Mac OS X présentait deux énormes failles de sécurité qui ont été rapidement corrigées par Apple. La première concernait l'implémentation de JavaScript dans WebKit, qui ouvrait le système à des vulnérabilités d'exécution de code à distance. Ce vecteur d'attaque particulier, appelé vulnérabilité "use-after-free", est l'un des plus graves qu'un pirate puisse exploiter. Tout ce qu'un attaquant doit faire, c'est inciter un utilisateur à visiter un site Web contenant un code malveillant. S'il réussit, le code s'exécute, qu'il y ait ou non des restrictions sur l'exécution du code sur Mac OS X. La deuxième faille concerne la façon dont macOS gère l'allocation de mémoire. Par conception, macOS alloue de la mémoire à la première utilisation, puis la libère lorsqu'elle n'est plus nécessaire. Dès que vous ouvrez plusieurs applications à la fois sur votre Mac, ce processus devient plus lent car davantage d'allocations sont nécessaires pour garder la trace de tout. En réponse à ce problème, Apple a ajouté la prise en charge de la mémoire virtuelle dans Mac OS X Leopard (10.5) mais ne l'a pas rendue totalement transparente afin d'éviter que les applications ne deviennent plus lentes au fil du temps même si elles disposent de plus de mémoire. Cependant, un problème majeur subsistait : comment scriptKit allait-il gérer ces demandes de réserve ?



JavaScript dans WebKit

Une faille d'exécution JavaScript dans WebKit a été la première faille de sécurité dans le système d'exploitation d'Apple. Afin de comprendre l'impact de cette faille, il est important de comprendre JavaScript et la façon dont WebKit rend ce langage. JavaScript est un langage qui s'exécute dans le navigateur et peut être intégré dans un site web. Ses mauvaises performances dans WebKit et Safari résultent de la manière dont JavaScript est implémenté dans ces navigateurs. L'un des moyens d'améliorer les performances de JavaScript est l'utilisation d'un ramasse-miettes, un système qui empêche un programme d'allouer récursivement de la mémoire et de la désallouer lorsqu'elle n'est plus utilisée. De nombreux moteurs JavaScript disposent d'un système qui peut être activé ou désactivé en fonction des besoins. Le problème se pose lorsque JavaScript est activé par défaut dans WebKit (et Safari sur Mac OS X) et que le ramasse-miettes est également activé, ce qui signifie qu'une fois le code exécuté, il continue à allouer de la mémoire, ce qui peut entraîner un plantage du navigateur ou d'autres problèmes graves. Pour résoudre ce problème, Apple a supprimé la fonction JavaScript par défaut dans Safari 7.


Mac OS X gère l'allocation de mémoire trop lentement

Un autre problème majeur de Mac OS X était la façon dont les allocations de mémoire étaient gérées. Le système était capable d'allouer de la mémoire une seule fois, puis de la libérer lorsqu'elle n'était plus utilisée, ce qui est la bonne chose à faire. Cependant, pour garder la trace de toutes les allocations, Mac OS X devait conserver un enregistrement du moment où chaque allocation était effectuée. Cet enregistrement nécessitait de la mémoire, ce qui entraînait un ralentissement des performances car davantage d'allocations étaient nécessaires au fil du temps. Pour résoudre ce problème, Apple a ajouté la prise en charge de la mémoire virtuelle dans Mac OS X Leopard (10.5) mais ne l'a pas rendue totalement transparente afin que les applications ne puissent pas devenir plus lentes au fil du temps même si elles disposent de plus de mémoire.


Les demandes de réserve ne sont pas transparentes pour les scripts.

JavaScript est le seul langage qui s'exécute dans un navigateur indépendamment du système d'exploitation hôte. Tout ce qui est exécuté côté client (aussi bien dans un navigateur qu'en PHP ou Java sur un serveur) s'exécute à l'intérieur d'un binaire appelé l'interpréteur de script. L'interpréteur de script est un programme qui convertit un langage comme JavaScript en quelque chose que la machine hôte peut exécuter. L'interpréteur de script s'exécute dans un bac à sable, ce qui signifie qu'il est soumis à certaines restrictions qui l'empêchent d'accéder à la mémoire de l'hôte et que l'hôte n'a accès qu'à sa propre mémoire. Cette séparation entre l'interpréteur de script et la machine hôte est cruciale pour la sécurité des applications web : si un script exploite une faille dans l'interpréteur de script, la machine hôte ne risque pas d'être attaquée.


Déboguer des scripts sur un serveur de production

Une fois qu'un script est déployé, il ne peut pas être débogué facilement, ce qui constitue un problème pour un serveur de production. Un serveur est un ordinateur qui stocke et traite des données dans un but précis. Par définition, il doit être stable, ce qui signifie que personne ne peut y apporter de modifications afin de tester une nouvelle fonctionnalité ou de corriger un problème. Mais dès qu'un serveur est retiré de la production et remis en service, il doit être déployé aussi rapidement que possible, ce qui signifie qu'il doit être cassé. Tout retard supplémentaire dans le déploiement entraîne le risque de manquer une échéance. C'est pourquoi les meilleurs ingénieurs sont ceux qui peuvent s'adapter à toutes sortes de situations et exécuter un changement aussi rapidement que possible, même s'il est cassé. C'est aussi pourquoi un bon ingénieur de test prête attention au code de l'équipe de développement, écrit des tests unitaires et les exécute lorsqu'ils sont prêts, et non lorsqu'ils sont terminés.


Conclusion

Les vulnérabilités de sécurité font partie de la vie. On ne peut y faire face qu'en mettant à jour son système d'exploitation et ses logiciels. Heureusement, Linux est très bien protégé contre les deux failles les plus courantes de Mac OS X, du fait qu'il s'agit d'un système d'exploitation fonctionnant au-dessus d'un autre système d'exploitation (le noyau Linux et le système Unix). Ces deux problèmes ont été rapidement corrigés par les principaux acteurs, Apple et Google, et n'ont pas eu d'impact sur Linux. Cependant, Linux présente des vulnérabilités qui peuvent être exploitées par des attaquants. Ces dangers sont principalement dus à la façon dont Linux gère la mémoire, qui peut être résolue en rendant les entités qui allouent la mémoire totalement transparentes. Ces problèmes sont également gérables car la plupart d'entre eux peuvent être résolus en apportant des modifications au noyau. La bonne nouvelle est que ces problèmes seront corrigés avec le nouveau noyau Linux.