Une nouvelle méthode simplifie le processus de compilation Java
Une nouvelle approche simplifie la compilation des changements dans les projets Java, renforçant la sécurité.
― 9 min lire
Table des matières
- Défis actuels de la compilation de code Java
- L'approche proposée
- Évaluation de l'approche
- Étapes du processus de compilation
- Identification d’entrée et de cible
- Marquage et résolution
- Réduction
- Génération de stubs
- Compilation
- Résultats de l'évaluation
- Comparaison avec les approches existantes
- Limitations de la méthode
- Conclusion
- Source originale
- Liens de référence
Les applis Java comptent souvent sur des bibliothèques tierces, mais certaines d'entre elles peuvent avoir des problèmes de sécurité. Des chercheurs ont bossé sur des outils pour aider à identifier ces vulnérabilités et à les corriger. Mais, pour bien repérer ces failles, il faut avoir le bon bytecode après avoir appliqué un Patch. Ça peut être galère parce que le code est souvent dans un format qui n’est pas facile à recompiler en bytecode. Cet article présente une nouvelle méthode pour ne compiler que le code qui a changé dans un commit spécifique, rendant plus simple le maintien de la sécurité et de l’intégrité des applis Java.
Défis actuels de la compilation de code Java
Les projets Java incluent généralement plein de Dépendances en bytecode plutôt qu'en code source. S'il y a une vulnérabilité dans une de ces dépendances, il faut un patch pour réparer le problème. Ces patchs sont stockés dans des bases de données en tant que fix-commits, mais compiler le projet entier pour obtenir le bytecode nécessaire peut être super compliqué. C'est encore plus vrai pour les versions plus anciennes du code. De plus, tous les dépôts de code ne suivent pas les mêmes pratiques de développement, ce qui rend encore plus difficile la recherche de la bonne version du projet à compiler.
Le processus actuel d’identification des vulnérabilités repose souvent sur des Métadonnées associées aux dépendances incluses. Cependant, ces métadonnées peuvent être inexactes ou manquantes, ce qui entraîne des erreurs dans l'identification des vulnérabilités. Par exemple, de nombreux outils ne se basent que sur les métadonnées et les comparent à des vulnérabilités connues dans une base de données. Ce n'est pas suffisant, car beaucoup de ces vulnérabilités sont enfouies plus profondément dans le code réel.
Il est important de noter que les bases de données de vulnérabilités existantes donnent généralement juste un aperçu du dépôt où un fix a été appliqué. Elles ne fournissent pas la version de sortie qui inclut le patch. Pour identifier efficacement si une vulnérabilité existe dans un morceau donné de bytecode, il faut que les patchs soient compilés correctement en bytecode qui reflète ces correctifs.
L'approche proposée
Pour relever ces défis, une nouvelle méthode a été proposée. Cette méthode se concentre sur la compilation uniquement des parties pertinentes du projet Java qui ont changé dans un certain commit. Le processus commence avec le code source du projet Java, qui est ensuite réduit pour n'inclure que les informations nécessaires pour compiler ces changements spécifiques. Cela simplifie non seulement le processus, mais minimise aussi le risque d'erreurs lors de la compilation.
L'approche utilise une technique de marquage-et-purges. Au départ, le code marque les parties qui sont pertinentes pour les changements. Ensuite, il identifie les références essentielles dans le code, ne gardant que celles nécessaires pour compiler les changements ciblés. Les parties inutiles sont éliminées, ne laissant que ce qui est nécessaire.
Un défi est que ce marquage pourrait entraîner des erreurs si des noms d’entités nécessaires pour compléter la compilation sont manquants. Pour régler ce problème, la méthode génère automatiquement des stubs pour ces références manquantes. Ces stubs permettent au compilateur de comprendre ce qui est nécessaire, même si le code réel est absent.
Évaluation de l'approche
La nouvelle méthode a été testée sur 347 projets Java populaires provenant de GitHub. L'évaluation a impliqué 32 970 méthodes et constructeurs, et il a été constaté que 72 % d'entre eux pouvaient être compilés isolément. Parmi ceux-ci, 89 % produisaient un bytecode identique à l'original.
Dans des tests où des scripts de build traditionnels étaient utilisés, seulement 8 % des fichiers modifiés par les fix-commits pouvaient être compilés. En revanche, la nouvelle méthode a pu compiler 73 % de tous les fichiers modifiés sans compter sur aucun script de build.
Cela montre que l'approche compile efficacement les changements tout en maintenant un haut niveau de similitude avec le bytecode d'origine. La méthode conserve le code pertinent et donne juste assez d'informations au compilateur pour faire son travail sans le fouillis de code inutile.
Étapes du processus de compilation
Identification d’entrée et de cible
Le processus commence par les signatures des méthodes qui doivent être compilées. Les fichiers source contenant ces méthodes sont fournis en entrée. En plus de cela, tous les autres fichiers de code source disponibles dans le projet et les fichiers JAR de dépendance récupérables sont également inclus.
Marquage et résolution
L'étape suivante consiste à marquer la méthode, indiquant qu'elle doit être conservée intacte pendant le processus de réduction. Ensuite, le code vérifie toutes les références dans la méthode pour voir ce dont il pourrait avoir besoin du projet. Si ces références sont trouvées dans le code, elles sont marquées pour être conservées.
Réduction
Après marquage, la méthode procède à la réduction des parties du code qui ne sont pas nécessaires à la compilation. Cela inclut la suppression des dépendances et du code non nécessaire pour compiler la méthode cible.
Génération de stubs
Pour les références qui restent encore non résolues après le marquage et la réduction, la méthode génère des stubs. Les stubs servent de placeholders et fournissent des informations sur les types de classes et de méthodes nécessaires, sans avoir besoin de leur mise en œuvre complète.
Compilation
Enfin, le compilateur Java est utilisé pour compiler le code réduit avec les fichiers stub générés. Le résultat est un bytecode qui devrait soit correspondre à, soit être très similaire au bytecode original obtenu à partir d'une compilation complète du projet.
Résultats de l'évaluation
Les résultats de l'application de la nouvelle méthode ont montré des améliorations significatives dans le taux de réussite de la compilation par rapport aux méthodes traditionnelles. La capacité à compiler 72 % des méthodes ciblées en isolation est remarquable, surtout compte tenu des difficultés généralement rencontrées lors de la compilation de projets Java.
En se concentrant uniquement sur le code pertinent et en générant des stubs pour les parties manquantes, la méthode a pu réduire considérablement le temps nécessaire pour compiler. Cette efficacité est particulièrement utile lorsqu'il s'agit de grandes bases de code où trouver et corriger des vulnérabilités peut être un processus fastidieux.
Comparaison avec les approches existantes
Les outils existants s'appuient souvent fortement sur l'analyse de l'ensemble des bases de code, ce qui peut ralentir les performances et entraîner des inexactitudes. Cependant, la méthode proposée contourne une grande partie de cela en se concentrant sur les changements spécifiques apportés dans un commit. Cette approche ciblée conduit à des temps de compilation plus rapides et à une identification plus précise des vulnérabilités.
De plus, les méthodes traditionnelles ont tendance à avoir des difficultés avec des métadonnées incomplètes ou obsolètes, ce qui peut entraîner des vulnérabilités manquées. La nouvelle approche s'attaque à ce problème en inférant les types nécessaires et en générant des stubs dynamiquement, garantissant même que du code incomplet puisse être compilé avec succès.
Limitations de la méthode
Bien que la méthode montre des résultats prometteurs, il y a encore quelques limitations à prendre en compte. Le taux de réussite de la compilation dépend beaucoup de l’intégralité du code source d’origine. Si d'importantes parties de la base de code sont manquantes ou cassées, cela peut impacter l'efficacité de la méthode.
De plus, le taux de réussite peut varier selon la complexité du projet et les schémas utilisés dans les pratiques de développement. Certaines fonctionnalités Java peuvent ne pas être entièrement prises en charge par la méthode, entraînant des compilations incomplètes ou un bytecode qui n'est pas aussi similaire que désiré.
Conclusion
La nouvelle approche présentée pour compiler les changements de commit dans les projets Java représente une solution efficace à un problème courant rencontré par les développeurs traitant des vulnérabilités dans les dépendances. En se concentrant spécifiquement sur les parties pertinentes du code qui ont changé et en générant les stubs nécessaires, la méthode simplifie le processus de compilation des applications Java et aide à maintenir la sécurité.
Alors que le développement logiciel continue d'évoluer, des outils comme celui-ci seront essentiels pour aider les équipes à garantir l'intégrité de leur code tout en rendant le processus plus efficace. Les résultats de l'évaluation indiquent que cette méthode pourrait avoir un impact positif considérable sur la manière dont les projets Java sont maintenus et sécurisés contre les vulnérabilités. L'avenir du développement logiciel reposera sur des outils et des méthodes améliorés qui facilitent une meilleure gestion du code et la détection des vulnérabilités.
Titre: Compilation of Commit Changes within Java Source Code Repositories
Résumé: Java applications include third-party dependencies as bytecode. To keep these applications secure, researchers have proposed tools to re-identify dependencies that contain known vulnerabilities. Yet, to allow such re-identification, one must obtain, for each vulnerability patch, the bytecode fixing the respective vulnerability at first. Such patches for dependencies are curated in databases in the form of fix-commits. But fixcommits are in source code, and automatically compiling whole Java projects to bytecode is notoriously hard, particularly for non-current versions of the code. In this paper, we thus propose JESS, an approach that largely avoids this problem by compiling solely the relevant code that was modified within a given commit. JESS reduces the code, retaining only those parts that the committed change references. To avoid name-resolution errors, JESS automatically infers stubs for references to entities that are unavailable to the compiler. A challenge is here that, to facilitate the above mentioned reidentification, JESS must seek to produce bytecode that is almost identical to the bytecode which one would obtain by a successful compilation of the full project. An evaluation on 347 GitHub projects shows that JESS is able to compile, in isolation, 72% of methods and constructors, of which 89% have bytecode equal to the original one. Furthermore, on the Project KB database of fix-commits, in which only 8% of files modified within the commits can be compiled with the provided build scripts, JESS is able to compile 73% of all files that these commits modify.
Auteurs: Stefan Schott, Wolfram Fischer, Serena Elisa Ponta, Jonas Klauke, Eric Bodden
Dernière mise à jour: 2024-07-25 00:00:00
Langue: English
Source URL: https://arxiv.org/abs/2407.17853
Source PDF: https://arxiv.org/pdf/2407.17853
Licence: https://creativecommons.org/licenses/by/4.0/
Changements: Ce résumé a été créé avec l'aide de l'IA et peut contenir des inexactitudes. Pour obtenir des informations précises, veuillez vous référer aux documents sources originaux dont les liens figurent ici.
Merci à arxiv pour l'utilisation de son interopérabilité en libre accès.