What Info is Transmitted Between Your System and Azul Intelligence Cloud
Azul Intelligence Cloud is a combination of applications running within your environment combined with an analysis and data collection solution provided by Azul as Software as a Service (SaaS). This means there is an exchange of JVM Meta Data from your environment to the Azul system. This document describes what data are exchanged exactly and how the security of your JVM Meta Data is handled at every level involved.
Components Within the System
To be able to provide vulnerability information, three components are involved:
-
Within your environment
-
Java Runtimes
-
Forwarder(s)
-
-
Provided by Azul
-
Azul Intelligence Cloud Web UI and APIs
-
Java Runtime
The Java Runtime (being Azul Zulu, Azul Zing, or any other runtime with the Intelligence Cloud Agent) runs within your environment and never needs access to the public internet to exchange data with Azul Intelligence Cloud. The runtime collects information about the libraries inside the application using the Connected Runtime Service (CRS), a component inside the JVM. But only when the argument -XX:AzCRSMode=on
or environment variable AZ_CRS_ARGUMENTS
are added (for more info, see Connect to Azul Intelligence Cloud via the Forwarder), the runtime collects information about the libraries inside the application using the Connected Runtime Service (CRS), a component inside the Azul JVM or Intelligence Cloud Agent. CRS transmits these data via the Forwarder.
An isolated processing log is also collected, unrelated to standard application logging. This can be used by Azul support to assist you.
Note
|
Our runtimes only send data regarding the Java runtime and libraries for this very specific functionality, and the isolated processing log. There is no other information exchanged with Azul, and all collected JVM Meta Data in the Saas environment is available to you via our Web UI and API. In contrast to distributions from other providers, Azul doesn’t, and can’t, use this information to check licenses. |
Forwarder
The Forwarder is a separate application provided by Azul to be installed within your environment (at least once, for more info, see One-time Setup), that transmits the JVM Meta Data provided by the runtimes to Azul Intelligence Cloud. It requires access to the public internet. Rotating certificates secure the connection between the Forwarder and Azul Intelligence Cloud.
Azul Intelligence Cloud
Our SaaS solution to detect vulnerabilities in your applications, uses an internal knowledge base containing "fingerprints" (hashes) as described on How CVEs are Detected. At this point, Azul doesn’t have any other reference to your code or applications except the info related to the Instance ID.
APIs Between Java Runtime and Forwarder
The Forwarder is the "gateway" between the runtimes within your environment and the Azul Intelligence Cloud SaaS solution. All data flowing through the Forwarder is transmitted via an API approach.
API | Method | Description |
---|---|---|
/crs/instance/{vmId} |
POST |
Report new VM instance events. |
/crs/auth/rt/token |
GET |
Get new runtime token. |
/crs/auth/rt/token |
POST |
Refresh runtime token. |
Data Model Exchanged Between Java Runtime and Forwarder
Processing Log
A log about event processing. This log stream is isolated and independent of any application-level logs.
This is an example of a processing log that gets transmitted:
0.657: [CRS.args][debug] Effective Azul IC Agent options:
0.665: [CRS.args][debug] delayInitiation = 0 [ ENVIRONMENT ]
0.665: [CRS.args][debug] delayTermination = 0 [ ENVIRONMENT ]
0.665: [CRS.args][debug] maxJarFileCacheSize = 2048 [ DEFAULT ]
0.665: [CRS.args][debug] mode = on [ ERGONOMIC ]
0.666: [CRS.args][debug] notifyClassLoad = true [ DEFAULT ]
0.666: [CRS.args][debug] notifyJarLoad = true [ DEFAULT ]
0.666: [CRS.args][debug] sendPOMData = true [ DEFAULT ]
0.669: [CRS.id][info] Azul IC Agent <VERSION> started with args=''.
0.808: [CRS.connection][info] querying DNS record
1.179: [CRS.connection][info] Using CRS endpoint configuration
1.179: [CRS.connection][info] API url = REDACTED
1.179: [CRS.connection][info] mailbox = default
1.184: [CRS.id][debug] Azul IC Agent initialized. VM start timestamp 1712783363694, VM uptime 1184ms
1.203: [CRS.id][trace] Post VM start to CRS service
1.529: [CRS.connection][info] Get runtime token: clientVersion=<VERSION>, mailbox=default
5.555: [CRS.id][info] Agent authenticated: vmId=REDACTED
5.555: [CRS.id][debug] VM uptime 5555ms
5.579: [CRS.service.classloadevent][debug] Service starts.
5.590: [CRS.default][trace] Creating dependencies to itself: :com.azul.crs.javaagent.client.service.JarLoadMonitor$TaskExecutor@6b59b5a7:1801041319:1
5.590: [CRS.default][trace] Creating dependencies to itself: :com.azul.crs.javaagent.client.service.JarLoadMonitor$TaskExecutor@6b59b5a7:1801041319:2
5.590: [CRS.service.jarload.reporter][info] Posted jar: file://path/to/something.jar
5.592: [CRS.service.classload.loaderwrapper][info] Going to use 9+ path of extracting URLs
5.593: [CRS.service.jarload.reporter][trace] ClassLoadWrapper.getURLs returned null
5.593: [CRS.default][trace] Creating dependencies to itself: :com.azul.crs.javaagent.client.service.JarLoadMonitor$TaskExecutor@6b59b5a7:1801041319:3
5.593: [CRS.mainMethod.detect][debug] 5.593: [CRS.default][trace] main method in class: com/example/pkg/ rstart/rendo nttoa iintesreBlofo:t s:tcroamp.a
zul.crs.javaagent.client.service.JarLoadMonitor$TaskExecutor@6b59b5a7:1801041319:4
5.594: [CRS.service.jarload.reporter][info] Posted jar: file://path/to/another.jar
5.594: [CRS.default][trace] Creating dependencies to itself: :com.azul.crs.javaagent.client.service.JarLoadMonitor$TaskExecutor@6b59b5a7:1801041319:5
VM Event
Each JVM instance reports VM events to the Forwarder.
Field | Description |
---|---|
vmId |
VM instance associated with event, must be set only for user initiated requests |
eventId |
Synthetic primary key of event |
eventType |
See VM Event Types |
eventPayload |
Optional payload, based on |
eventTime |
VM event time (epoch millis) |
receivedTime |
The time VM event first observed by the server (epoch millis) |
VM Event Types
VM event types supported by CRS.
Event Type | Event Payload |
---|---|
VM_CREATE |
|
VM_PATCH |
|
VM_ARTIFACT_CREATE |
|
VM_ARTIFACT_PATCH |
|
VM_ARTIFACT_DATA |
|
VM_JAR_LOADED |
|
VM_CLASS_LOADED |
|
VM_METHOD_FIRST_CALLED |
|
VM_PERFORMANCE_METRICS |
|
VM_HEARTBEAT |
- |
VM_SHUTDOWN |
- |
VM Event Payloads
The eventPayload
in VM Event is defined by the VM Event Type and uses one of the following structures.
VM Instance
Payload of VM_CREATE and VM_PATCH events.
The model of a VM instance managed by CRS.
Field | Description |
---|---|
vmId |
VM instance ID generated by CRS |
clientVersion |
Version of CRS client used by VM instance |
clientRevision |
Source code revision of CRS client used by VM instance |
inventory |
See the Inventory model. |
jvmInfo |
JVM information derived from VM instance metadata:
|
startTime |
Start time of the VM instance (epoch millis) |
lastHeardTime |
Last time VM instance was heard by CRS service (epoch millis) |
owner |
User name associated with VM instance |
mailbox |
Mailbox ID used by CRS to report VM instance metadata and telemetry |
state |
State of VM instance last known to CRS:
|
tags |
Tags of VM instance consisted of named string values |
Inventory
VM instance inventory reported by connected runtime.
Field | Description |
---|---|
hostName |
Host name of machine running VM instance |
networks |
Network interfaces of machine running VM instance, containing an array with hostname and address |
systemProperties |
The following subset of JVM system properties:
|
systemInfo |
System info of machine running VM instance For example: |
cpuInfo |
CPU info of machine running VM instance For example: |
memInfo |
Memory info of machine running VM instance For example: |
osInfo |
OS info of machine running VM instance For example: |
osEnvironment |
Only the following list of OS environment variables, needed by Azul Intelligence Cloud, are transmitted: |
mainMethod |
Main method executed by JVM on VM instance invocation For example: |
VM Artifact
Payload of VM_ARTIFACT_CREATE and VM_ARTIFACT_PATCH events.
Represents information about a file associated with a specific VMInstance (e.g. GC log or JFR recording). The content of the file is not a part of the model. It is hosted by a suitable storage and is simply referenced by the VMArtifact.
Field | Description |
---|---|
artifactId |
VM artifact ID generated by CRS on artifact creation |
artifactType |
Types of VM artifacts supported by CRS
|
metadata |
VM artifact metadata with free form schema dependent on artifact type |
filename |
Name of the artifact |
vmId |
VM instance associated with the artifact |
createTime |
Time of VM artifact creation (epoch millis). |
uploadURL |
Presigned URL to upload artifact file. Only used as a return value. |
snapshot |
Presigned URL to download artifact snapshot. Only used as a return value. |
size |
Size of artifact data in bytes, -1 if no data available. Only used as a return value. |
VM Artifact Data
Payload of VM_ARTIFACT_DATA events.
The data is appended to VM artifact content accumulated by CRS so far. That means no concurrent events for the same VM artifact are allowed, and the ordering of sent data should be preserved by CRS.
Field | Description |
---|---|
artifactId |
ID of VM artifact the data belongs to |
data |
Plain text representation of VM artifact data to be appended to the artifact. |
VM Jar Loaded
Payload of VM_JAR_LOADED events.
Field | Description |
---|---|
jarName |
JAR file name |
url |
URL used by JVM to access JAR content |
centralDirectoryHash |
Hash value computed by central directory of JAR archive |
centralDirectoryLength |
Length of the central directory of JAR archive |
centralDirectoryExtractionMethod |
Method used to obtain central directory of JAR archive |
recursionDepth |
Depth of JAR when nested JAR is reported recursively |
manifestHash |
Hash value computed by META-INF/MANIFEST.MF of JAR |
initiatedBy |
The party that initiated the reporting of JAR:
|
mavenComponents |
Maven components detected by metadata files of JAR (pom.properties, etc.), containing:
|
stats |
Time counters computed on JAR processing, containing:
|
entries |
Packed data with JAR entry details |
VM Class Loaded
Payload of VM_CLASS_LOADED events.
Field | Description |
---|---|
classId |
VM specific ID of the class |
loaderId |
VM specific ID of the class loader that loaded the class |
className |
Fully qualified class name |
source |
Source of the loaded class |
hash |
Hash calculated by original class content |
transformedHash |
Hash of the class that was transformed on loading (e.g. instrumented) |
VM Method First Called
Payload of VM_METHOD_FIRST_CALLED events.
Field | Description |
---|---|
classId |
VM specific ID of the class |
methodName |
Name and signature of the method |
VM Performance Metrics
Payload of VM_PERFORMANCE_METRICS events.
Field | Description |
---|---|
numEventBatches |
Number of buckets sent to the cloud (events are sent in buckets) |
numBytesOut |
Number of bytes of data sent to the cloud |
numConnections |
Total number of HTTP connections established to the cloud (including all reconnects) |
numRequests |
Total number of HTTP requests to the cloud (greater than the number of connections since connections may be cached) |
numClassLoads |
Total number of registered class load events |
maxQueueLength |
Max reached event queue length |
handshakeMillis |
Elapsed time on handshake with the cloud |
numBytesInArtifacts |
Number of bytes sent as artifact data |
communicationMillis |
Elapsed time on network activity (handshake + read + write) |
numBytesIn |
Number of bytes received from the cloud |
numEvents |
Number of events sent to the cloud (class load, jar load, and everything else) |
numEventHistogram |
Histogram of the number of events sent to the cloud in one batch (base 2 logarithm of the number of events in the batch) |
preShutdownMillis |
Time elapsed since the start of VM shutdown hooks (effectively the end of user application), till the end of processing of rest events in the queue |
numMethodEntries |
Number of executed unique Java methods |