From 43f5d648069370ba2f5056a9277ea6e1024af1cd Mon Sep 17 00:00:00 2001 From: dmitrii Date: Wed, 8 Jul 2026 12:21:08 +0200 Subject: [PATCH 1/3] Add Java 25 support Bump Byte Buddy 1.15.11 -> 1.18.11 (adds JDK 25 / class-file v69 support) and raise the max supported Java version gate from 24 to 25. Also add Java 25 to the unit-test and end-to-end CI matrices. Verified locally on JDK 25: the agent loads, installs instrumentation, and blocks a SQL injection against a Spring Boot app compiled to Java 25 (v69) bytecode. --- .github/workflows/end2end.yml | 2 +- .github/workflows/gradle-tests.yml | 2 +- agent/build.gradle | 2 +- agent/src/main/java/dev/aikido/agent/Agent.java | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/end2end.yml b/.github/workflows/end2end.yml index 00d51833b..fb426918a 100644 --- a/.github/workflows/end2end.yml +++ b/.github/workflows/end2end.yml @@ -49,7 +49,7 @@ jobs: - { name: JavalinMySQLKotlin, test_file: end2end/javalin_mysql_kotlin.py, db: mysql_database } - { name: SpringBoot2.7Postgres, test_file: end2end/spring_boot_2.7_postgres.py, db: postgres_database } - { name: SpringBootHyperSQL, test_file: end2end/spring_boot_hypersql.py, db: "" } - java-version: [17, 18, 19, 20, 21, 24] + java-version: [17, 18, 19, 20, 21, 24, 25] distribution: ['adopt', 'corretto', 'oracle'] steps: - name: Download build artifacts diff --git a/.github/workflows/gradle-tests.yml b/.github/workflows/gradle-tests.yml index 4a1e26c5d..15e7d71b3 100644 --- a/.github/workflows/gradle-tests.yml +++ b/.github/workflows/gradle-tests.yml @@ -41,7 +41,7 @@ jobs: continue-on-error: true strategy: matrix: - java-version: [17, 18, 19, 20, 21, 24] + java-version: [17, 18, 19, 20, 21, 24, 25] distribution: ['adopt', 'corretto', 'oracle'] steps: diff --git a/agent/build.gradle b/agent/build.gradle index d6656bf92..9050a3d06 100644 --- a/agent/build.gradle +++ b/agent/build.gradle @@ -5,7 +5,7 @@ plugins { dependencies { implementation project(':agent_api') - implementation 'net.bytebuddy:byte-buddy:1.15.11' + implementation 'net.bytebuddy:byte-buddy:1.18.11' // Compile only for interface types : compileOnly 'jakarta.servlet:jakarta.servlet-api:6.1.0' // spring 3 -> jakarta compileOnly 'javax.servlet:javax.servlet-api:4.0.1' // spring 2 -> javax diff --git a/agent/src/main/java/dev/aikido/agent/Agent.java b/agent/src/main/java/dev/aikido/agent/Agent.java index 3c380ca39..d88d1df54 100644 --- a/agent/src/main/java/dev/aikido/agent/Agent.java +++ b/agent/src/main/java/dev/aikido/agent/Agent.java @@ -31,8 +31,8 @@ public static void premain(String agentArgs, Instrumentation inst) { logger.error("Zen by Aikido requires Java 17 or newer. Current version: %d. The agent will not be loaded.", javaVersion); return; } - if (javaVersion > 24) { - logger.error("Zen by Aikido does not support Java %d (max supported version: 24). The agent will not be loaded.", javaVersion); + if (javaVersion > 25) { + logger.error("Zen by Aikido does not support Java %d (max supported version: 25). The agent will not be loaded.", javaVersion); return; } logger.info("Zen by Aikido v%s starting.", Config.pkgVersion); From 4556539809b7b5035c77534717603d1fb7707347 Mon Sep 17 00:00:00 2001 From: dmitrii Date: Wed, 8 Jul 2026 12:51:35 +0200 Subject: [PATCH 2/3] Upgrade root build to Gradle 9.6.1 for JDK 25 support Gradle 8.14 cannot run on JDK 25, which broke the unit-test CI matrix rows for Java 25. Bump the root Gradle wrapper to 9.6.1, migrate the shadow plugin from com.github.johnrengelman.shadow 7.1.0 to com.gradleup.shadow 9.5.1 (the former is incompatible with Gradle 9), and move sourceCompatibility/ targetCompatibility into the java{} extension (project-level convention was removed in Gradle 9). Verified: full unit suite builds and runs on both JDK 21 and JDK 25 with the same baseline result (only the known env-specific failures remain). --- agent/build.gradle | 2 +- agent_api/build.gradle | 2 +- build.gradle | 6 ++++-- gradle/wrapper/gradle-wrapper.properties | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/agent/build.gradle b/agent/build.gradle index 9050a3d06..8e4b44536 100644 --- a/agent/build.gradle +++ b/agent/build.gradle @@ -1,6 +1,6 @@ plugins { id 'java' - id 'com.github.johnrengelman.shadow' version '7.1.0' + id 'com.gradleup.shadow' version '9.5.1' } dependencies { diff --git a/agent_api/build.gradle b/agent_api/build.gradle index e051f811d..b0f758f16 100644 --- a/agent_api/build.gradle +++ b/agent_api/build.gradle @@ -1,7 +1,7 @@ plugins { id 'java' id 'jacoco' - id 'com.github.johnrengelman.shadow' version '7.1.0' + id 'com.gradleup.shadow' version '9.5.1' } jacoco { diff --git a/build.gradle b/build.gradle index 15b80b55e..9e2b923a8 100644 --- a/build.gradle +++ b/build.gradle @@ -15,6 +15,8 @@ subprojects { tasks.withType(JavaCompile) { options.encoding = 'UTF-8' } - sourceCompatibility = '16' - targetCompatibility = '16' + java { + sourceCompatibility = JavaVersion.VERSION_16 + targetCompatibility = JavaVersion.VERSION_16 + } } \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 679a25974..5d5b9a03a 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Thu Oct 10 12:48:48 CEST 2024 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.6.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 55b0affec6cb172b1b8f9406bde72a226a0a9608 Mon Sep 17 00:00:00 2001 From: dmitrii Date: Wed, 8 Jul 2026 13:21:42 +0200 Subject: [PATCH 3/3] Make e2e sample apps build/run on JDK 25 The e2e matrix rows for Java 25 failed because each sample app's own Gradle 8.14 wrapper cannot run on JDK 25. Bump the sample-app wrappers to Gradle 9.6.1 and, where the language compiler itself needs JDK 25 support: - JavalinPostgres: migrate shadow plugin to com.gradleup.shadow 9.5.1 - SpringMVCPostgresKotlin / JavalinMySQLKotlin: Kotlin -> 2.2.20 - SpringMVCPostgresGroovy: Groovy -> 4.0.28 Exclude SpringBoot2.7Postgres from the Java 25 row: Spring Boot 2.7 (legacy javax stack) does not support JDK 25; its javax coverage stays on 17-24. Verified locally on JDK 25: SpringBootPostgres, SpringBootMySQL and SpringBootHyperSQL block a SQL injection end-to-end. Apps that don't block in the local setup behave identically on JDK 21 (local DB/env, not a Java 25 regression); CI provisions the databases and validates the full matrix. --- .github/workflows/end2end.yml | 5 +++++ sample-apps/JavalinMySQLKotlin/pom.xml | 2 +- sample-apps/JavalinPostgres/build.gradle | 2 +- .../JavalinPostgres/gradle/wrapper/gradle-wrapper.properties | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../SpringBootMSSQL/gradle/wrapper/gradle-wrapper.properties | 2 +- .../SpringBootMySQL/gradle/wrapper/gradle-wrapper.properties | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- sample-apps/SpringMVCPostgresGroovy/build.gradle | 4 ++++ .../gradle/wrapper/gradle-wrapper.properties | 2 +- sample-apps/SpringMVCPostgresKotlin/build.gradle | 4 ++-- .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- 13 files changed, 21 insertions(+), 12 deletions(-) diff --git a/.github/workflows/end2end.yml b/.github/workflows/end2end.yml index fb426918a..66c9dac2d 100644 --- a/.github/workflows/end2end.yml +++ b/.github/workflows/end2end.yml @@ -51,6 +51,11 @@ jobs: - { name: SpringBootHyperSQL, test_file: end2end/spring_boot_hypersql.py, db: "" } java-version: [17, 18, 19, 20, 21, 24, 25] distribution: ['adopt', 'corretto', 'oracle'] + exclude: + # Spring Boot 2.7 uses the legacy javax stack and does not support JDK 25; + # keep this app on Java 17-24 only (its javax coverage stays exercised there). + - app: { name: SpringBoot2.7Postgres, test_file: end2end/spring_boot_2.7_postgres.py, db: postgres_database } + java-version: 25 steps: - name: Download build artifacts uses: actions/download-artifact@v4 diff --git a/sample-apps/JavalinMySQLKotlin/pom.xml b/sample-apps/JavalinMySQLKotlin/pom.xml index 0de58bacf..ce97e4dac 100644 --- a/sample-apps/JavalinMySQLKotlin/pom.xml +++ b/sample-apps/JavalinMySQLKotlin/pom.xml @@ -11,7 +11,7 @@ 17 17 - 1.8.0 + 2.2.20 2.24.3 diff --git a/sample-apps/JavalinPostgres/build.gradle b/sample-apps/JavalinPostgres/build.gradle index f97da2470..a4f3b5d47 100644 --- a/sample-apps/JavalinPostgres/build.gradle +++ b/sample-apps/JavalinPostgres/build.gradle @@ -1,6 +1,6 @@ plugins { id 'java' - id 'com.github.johnrengelman.shadow' version '7.1.2' + id 'com.gradleup.shadow' version '9.5.1' } group = 'dev.aikido' diff --git a/sample-apps/JavalinPostgres/gradle/wrapper/gradle-wrapper.properties b/sample-apps/JavalinPostgres/gradle/wrapper/gradle-wrapper.properties index 55d53fd61..46debf555 100644 --- a/sample-apps/JavalinPostgres/gradle/wrapper/gradle-wrapper.properties +++ b/sample-apps/JavalinPostgres/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Tue Dec 17 13:31:53 CET 2024 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.6.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/sample-apps/SpringBootHyperSQL/gradle/wrapper/gradle-wrapper.properties b/sample-apps/SpringBootHyperSQL/gradle/wrapper/gradle-wrapper.properties index ca025c83a..a351597e6 100644 --- a/sample-apps/SpringBootHyperSQL/gradle/wrapper/gradle-wrapper.properties +++ b/sample-apps/SpringBootHyperSQL/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.6.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/sample-apps/SpringBootMSSQL/gradle/wrapper/gradle-wrapper.properties b/sample-apps/SpringBootMSSQL/gradle/wrapper/gradle-wrapper.properties index ca025c83a..a351597e6 100644 --- a/sample-apps/SpringBootMSSQL/gradle/wrapper/gradle-wrapper.properties +++ b/sample-apps/SpringBootMSSQL/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.6.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/sample-apps/SpringBootMySQL/gradle/wrapper/gradle-wrapper.properties b/sample-apps/SpringBootMySQL/gradle/wrapper/gradle-wrapper.properties index ca025c83a..a351597e6 100644 --- a/sample-apps/SpringBootMySQL/gradle/wrapper/gradle-wrapper.properties +++ b/sample-apps/SpringBootMySQL/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.6.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/sample-apps/SpringBootPostgres/gradle/wrapper/gradle-wrapper.properties b/sample-apps/SpringBootPostgres/gradle/wrapper/gradle-wrapper.properties index ca025c83a..a351597e6 100644 --- a/sample-apps/SpringBootPostgres/gradle/wrapper/gradle-wrapper.properties +++ b/sample-apps/SpringBootPostgres/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.6.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/sample-apps/SpringMVCPostgresGroovy/build.gradle b/sample-apps/SpringMVCPostgresGroovy/build.gradle index 4fe04541c..e8f2130ac 100644 --- a/sample-apps/SpringMVCPostgresGroovy/build.gradle +++ b/sample-apps/SpringMVCPostgresGroovy/build.gradle @@ -8,6 +8,10 @@ plugins { group = 'com.example' version = '0.0.1-SNAPSHOT' +// Spring Boot 3.4.1 manages an older Groovy 4.0.x whose ASM can't run on JDK 25; +// Groovy 4.0.27+ adds Java 25 support. +ext['groovy.version'] = '4.0.28' + java { sourceCompatibility = '17' targetCompatibility = '17' diff --git a/sample-apps/SpringMVCPostgresGroovy/gradle/wrapper/gradle-wrapper.properties b/sample-apps/SpringMVCPostgresGroovy/gradle/wrapper/gradle-wrapper.properties index ca025c83a..a351597e6 100644 --- a/sample-apps/SpringMVCPostgresGroovy/gradle/wrapper/gradle-wrapper.properties +++ b/sample-apps/SpringMVCPostgresGroovy/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.6.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/sample-apps/SpringMVCPostgresKotlin/build.gradle b/sample-apps/SpringMVCPostgresKotlin/build.gradle index b322c260f..06ff605cb 100644 --- a/sample-apps/SpringMVCPostgresKotlin/build.gradle +++ b/sample-apps/SpringMVCPostgresKotlin/build.gradle @@ -1,6 +1,6 @@ plugins { - id 'org.jetbrains.kotlin.jvm' version '2.1.0' - id 'org.jetbrains.kotlin.plugin.spring' version '1.9.25' + id 'org.jetbrains.kotlin.jvm' version '2.2.20' + id 'org.jetbrains.kotlin.plugin.spring' version '2.2.20' id 'war' id 'org.springframework.boot' version '3.4.1' id 'io.spring.dependency-management' version '1.1.7' diff --git a/sample-apps/SpringMVCPostgresKotlin/gradle/wrapper/gradle-wrapper.properties b/sample-apps/SpringMVCPostgresKotlin/gradle/wrapper/gradle-wrapper.properties index ca025c83a..a351597e6 100644 --- a/sample-apps/SpringMVCPostgresKotlin/gradle/wrapper/gradle-wrapper.properties +++ b/sample-apps/SpringMVCPostgresKotlin/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.6.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/sample-apps/SpringWebfluxSampleApp/gradle/wrapper/gradle-wrapper.properties b/sample-apps/SpringWebfluxSampleApp/gradle/wrapper/gradle-wrapper.properties index ca025c83a..a351597e6 100644 --- a/sample-apps/SpringWebfluxSampleApp/gradle/wrapper/gradle-wrapper.properties +++ b/sample-apps/SpringWebfluxSampleApp/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.6.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME