
Externaliser l'accès des applications Java aux ressources protégées sous forme de messages de journal.
Documentation | Modifications depuis l'amont | Blog du projet
JVMXRay surveille les applications Java en temps réel via l'injection de bytecode, détectant les vulnérabilités et les activités suspectes sans modification de code. 19 capteurs modulaires suivent l'accès aux fichiers, les connexions réseau, les requêtes SQL, les opérations cryptographiques, l'authentification, l'exécution de processus, etc. — générant des événements de sécurité structurés et lisibles par machine, avec une corrélation automatique entre les capteurs.
git clone https://github.com/spoofzu/jvmxray.git
cd jvmxray
mvn clean install
Pendant la phase de test de Maven, un petit programme appelé Turtle s'exécute sous l'agent JVMXRay fraîchement construit. Turtle effectue des opérations d'E/S de fichiers, de cryptographie, d'exécution de processus, de sérialisation, de réflexion et d'autres activités qui déclenchent les capteurs — ainsi une construction réussie vous donne déjà des journaux d'événements de sécurité réels à explorer dans ./target/test-jvmxray/. Une base de données SQLite est également créée à l'emplacement ./target/test-jvmxray/common/data/jvmxray-test.db pour une expérimentation rapide. Consultez la documentation pour plus de détails.
Déployez comme un agent Java dans vos propres applications :
java -javaagent:target/jvmxray-0.0.1-agent.jar -jar yourapp.jar
trace_id et scope_chain permettent aux équipes SOC de tracer un incident depuis la requête HTTP jusqu'à l'injection SQL et l'exfiltration de données en une seule requête.Gardez à l'esprit que JVMXRay est une source de vérité sur ce que fait une application Java, et non un moteur d'analyse. L'analyse est fournie par votre solution de journalisation centralisée et/ou vos projets d'outillage IA.
Chaque événement de capteur comprend des champs de corrélation pour reconstruire les chaînes d'attaque :
Une chaîne de portée comme HTTP>Serialization>Reflection>Process est une signature d'attaque de désérialisation en un coup d'œil. La colonne TRACE_ID est indexée dans la base de données pour des requêtes de corrélation rapides.
java -javaagent:jvmxray-agent.jar -jar app.jar
|
AgentBootstrap (isolated classloader)
|
ByteBuddy installe les intercepteurs de capteurs
|
Les capteurs se déclenchent à l'entrée/sortie des méthodes
|
LogProxy fusionne le contexte de corrélation MCC
|
+----------+----------+----------+
| SQLite | File | Socket |
| Appender | Appender | Appender |
+----------+----------+----------+
Ce projet a été développé en utilisant des idées, une architecture et du code dans certains cas provenant des sources suivantes :
Milton Smith — Créateur et leader du projet
Divulgation : JVMXRay n'est ni approuvé, ni parrainé, ni affilié à Oracle Corporation.
| Capteur | Ce qu'il surveille |
|---|
| E/S Fichiers | Lectures, écritures, suppressions, permissions, liens symboliques avec résolution de chemin et statistiques d'E/S agrégées |
| Réseau | Connexion/acceptation/liaison/fermeture de socket avec détection TLS, classification IP privée, chronométrage |
| SQL | Capture de requêtes avec détection de paramétrisation, type d'opération, durée, métadonnées de connexion |
| HTTP | Requête/réponse avec analyse des en-têtes de sécurité, corrélation utilisateur/session |
| Processus | ProcessBuilder.start() et Runtime.exec() avec arguments de commande, durée, statut de sortie |
| Crypto | Cipher/KeyStore/MessageDigest/SSL avec détection d'algorithmes faibles et validation de la force des clés |
| Authentification | Opérations de session, connexion JAAS, authentification Spring Security, requêtes de principal avec suivi succès/échec |
| Appel API | HttpClient.send() avec URI, méthode, hôte, TLS, statut de réponse, chronométrage |
| Moteur de script | ScriptEngine.eval() avec identification du moteur, hachage du contenu, détection de motifs suspects, niveau de risque |
| Sérialisation | Désérialisation Java native, Jackson, Gson, XStream avec détection de chaîne gadget |
| Réflexion | Class.forName, Method.invoke, accès aux champs, setAccessible avec classification des menaces |
| Configuration | Propriétés système, variables d'environnement, fichiers Properties, Preferences avec annotations de sécurité |
| Bibliothèque | Chargement statique et dynamique de JAR avec SHA-256, coordonnées Maven, inventaire des packages |
| Moniteur | Santé de la JVM : mémoire, threads, GC, CPU, fichiers ouverts, détection d'interblocage (intervalle 60s) |
| Exception non interceptée | Diagnostics de crash : pile complète, état mémoire, vidage de threads, chaîne de causes, ID d'incident |
| Initialisation de l'application | Capture unique au démarrage : version JVM, OS, détection de conteneur, variables d'environnement (masquées) |
| Transfert de données | Comptage d'octets InputStream.read() (actuellement désactivé — trop large) |
| Thread | Surveillance du cycle de vie des threads (actuellement désactivé — correction de journalisation récursive nécessaire) |
| Mémoire | Suivi de l'allocation mémoire (actuellement désactivé — correction de journalisation récursive nécessaire) |
| Champ | Exemple | Objectif |
|---|
trace_id | a1b2c3d4e5f6 | Lie tous les événements dans le même contexte d'exécution |
scope_chain | HTTP>SQL>FileIO | Chemin des capteurs imbriqués — la « stacktrace de sécurité » |
parent_scope | SQL | Parent immédiat pour la reconstruction de l'arbre |
scope_depth | 3 | Niveau d'imbrication — profondeur 6+ justifie une enquête |