Skip to content

Java: Add CodeQL support and tests for Micronaut framework - #21387

Open
nicolaswill wants to merge 11 commits into
mainfrom
nicolaswill/micronaut
Open

Java: Add CodeQL support and tests for Micronaut framework#21387
nicolaswill wants to merge 11 commits into
mainfrom
nicolaswill/micronaut

Conversation

@nicolaswill

Copy link
Copy Markdown
Contributor

This pull request adds CodeQL modeling for the Micronaut Java framework, covering HTTP controllers, WebSocket endpoints, configuration injection, security annotations, and relevant sources and sinks. The changes integrate Micronaut-specific classes and methods into the CodeQL dataflow architecture, enabling taint tracking and threat modeling for user input, configuration, and HTTP/WebSocket requests. Test cases are included to verify the new models.

Micronaut framework modeling:

  • Added overlays for Micronaut HTTP controllers, request mapping methods, input parameters, error handlers, and request beans in MicronautController.qll, enabling detection and classification of user-controlled input sources.
  • Introduced overlays for Micronaut WebSocket endpoints, message handlers, and user input parameters in MicronautWebSocket.qll.
  • Added overlays for Micronaut configuration injection via @Value and @Property annotations, modeling fields and parameters as local user input in MicronautConfig.qll.
  • Added overlays for Micronaut Data repositories and query annotations in MicronautData.qll.
  • Added overlays for Micronaut Security, modeling @Secured annotations for classes and methods in MicronautSecurity.qll.

Dataflow source and sink integration:

  • Extended FlowSources.qll to include Micronaut HTTP input parameters, WebSocket parameters, configuration fields/parameters, and error handler parameters as sources, using the new overlays. [1] [2]
  • Added source, summary, and sink models for Micronaut HTTP, multipart, and client APIs in .model.yml files, covering taint propagation and SSRF, response splitting, and URL redirection sinks. [1] [2] [3]

Test coverage:

  • Added test cases for Micronaut controller input sources and error handlers in MicronautControllerTest.java.
  • Added test cases for Micronaut configuration injection sources in MicronautConfigTest.java.

Add CodeQL support for Micronaut: add MaD models for HTTP, HTTP client and multipart (sources, sinks and summary propagation), new framework QLL modules (Controller, WebSocket, Config, Data, Security). Add library tests and query tests exercising request inputs, file uploads, HttpClient sinks (SSRF), header sinks (response-splitting) and redirect sinks (open-redirect), plus expected results and extractor options. Include Micronaut 4.x stubs used by the tests.
Copilot AI review requested due to automatic review settings February 27, 2026 16:18
@nicolaswill
nicolaswill requested a review from a team as a code owner February 27, 2026 16:18
@github-actions github-actions Bot added the Java label Feb 27, 2026
Comment thread java/ql/test/library-tests/frameworks/micronaut/flow.ql Fixed
Comment thread java/ql/test/library-tests/frameworks/micronaut/flow.ql Fixed
@github-actions

github-actions Bot commented Feb 27, 2026

Copy link
Copy Markdown
Contributor

⚠️ The head of this PR and the base branch were compared for differences in the framework coverage reports. The generated reports are available in the artifacts of this workflow run. The differences will be picked up by the nightly job after the PR gets merged.

Click to show differences in coverage

java

Generated file changes for java

  • Changes to framework-coverage-java.rst:
-    Others,"``actions.osgi``, ``antlr``, ``ch.ethz.ssh2``, ``cn.hutool.core.codec``, ``com.alibaba.com.caucho.hessian.io``, ``com.alibaba.druid.sql``, ``com.alibaba.fastjson2``, ``com.amazonaws.auth``, ``com.auth0.jwt.algorithms``, ``com.azure.identity``, ``com.caucho.burlap.io``, ``com.caucho.hessian.io``, ``com.cedarsoftware.util.io``, ``com.esotericsoftware.kryo.io``, ``com.esotericsoftware.kryo5.io``, ``com.esotericsoftware.yamlbeans``, ``com.hubspot.jinjava``, ``com.jcraft.jsch``, ``com.microsoft.sqlserver.jdbc``, ``com.mitchellbosecke.pebble``, ``com.opensymphony.xwork2``, ``com.sshtools.j2ssh.authentication``, ``com.sun.crypto.provider``, ``com.sun.jndi.ldap``, ``com.sun.net.httpserver``, ``com.sun.net.ssl``, ``com.sun.rowset``, ``com.sun.security.auth.module``, ``com.sun.security.ntlm``, ``com.sun.security.sasl.digest``, ``com.thoughtworks.xstream``, ``com.trilead.ssh2``, ``com.unboundid.ldap.sdk``, ``com.zaxxer.hikari``, ``flexjson``, ``hudson``, ``io.jsonwebtoken``, ``io.undertow.server.handlers.resource``, ``javafx.scene.web``, ``jenkins``, ``jodd.json``, ``liquibase.database.jvm``, ``liquibase.statement.core``, ``net.lingala.zip4j``, ``net.schmizz.sshj``, ``net.sf.json``, ``net.sf.saxon.s9api``, ``ognl``, ``org.acegisecurity``, ``org.antlr.runtime``, ``org.apache.avro``, ``org.apache.commons.codec``, ``org.apache.commons.compress.archivers.tar``, ``org.apache.commons.exec``, ``org.apache.commons.fileupload``, ``org.apache.commons.httpclient.util``, ``org.apache.commons.jelly``, ``org.apache.commons.jexl2``, ``org.apache.commons.jexl3``, ``org.apache.commons.lang``, ``org.apache.commons.logging``, ``org.apache.commons.net``, ``org.apache.commons.ognl``, ``org.apache.cxf.catalog``, ``org.apache.cxf.common.classloader``, ``org.apache.cxf.common.jaxb``, ``org.apache.cxf.common.logging``, ``org.apache.cxf.configuration.jsse``, ``org.apache.cxf.helpers``, ``org.apache.cxf.resource``, ``org.apache.cxf.staxutils``, ``org.apache.cxf.tools.corba.utils``, ``org.apache.cxf.tools.util``, ``org.apache.cxf.transform``, ``org.apache.directory.ldap.client.api``, ``org.apache.hadoop.fs``, ``org.apache.hadoop.hive.metastore``, ``org.apache.hadoop.hive.ql.exec``, ``org.apache.hadoop.hive.ql.metadata``, ``org.apache.hc.client5.http.async.methods``, ``org.apache.hc.client5.http.classic.methods``, ``org.apache.hc.client5.http.fluent``, ``org.apache.hc.client5.http.protocol``, ``org.apache.hc.client5.http.utils``, ``org.apache.hive.hcatalog.templeton``, ``org.apache.ibatis.jdbc``, ``org.apache.ibatis.mapping``, ``org.apache.log4j``, ``org.apache.poi``, ``org.apache.shiro.authc``, ``org.apache.shiro.codec``, ``org.apache.shiro.jndi``, ``org.apache.shiro.mgt``, ``org.apache.sshd.client.session``, ``org.apache.tools.ant``, ``org.apache.tools.zip``, ``org.codehaus.cargo.container.installer``, ``org.dom4j``, ``org.exolab.castor.xml``, ``org.fusesource.leveldbjni``, ``org.geogebra.web.full.main``, ``org.gradle.api.file``, ``org.ho.yaml``, ``org.influxdb``, ``org.jabsorb``, ``org.jboss.vfs``, ``org.jdbi.v3.core``, ``org.jenkins.ui.icon``, ``org.jenkins.ui.symbol``, ``org.keycloak.models.map.storage``, ``org.kohsuke.stapler``, ``org.lastaflute.web``, ``org.mvel2``, ``org.openjdk.jmh.runner.options``, ``org.owasp.esapi``, ``org.pac4j.jwt.config.encryption``, ``org.pac4j.jwt.config.signature``, ``org.scijava.log``, ``org.xml.sax``, ``org.xmlpull.v1``, ``play.libs.ws``, ``play.mvc``, ``ratpack.core.form``, ``ratpack.core.handling``, ``ratpack.core.http``, ``ratpack.exec``, ``ratpack.form``, ``ratpack.func``, ``ratpack.handling``, ``ratpack.http``, ``ratpack.util``, ``software.amazon.awssdk.transfer.s3.model``, ``sun.jvmstat.perfdata.monitor.protocol.local``, ``sun.jvmstat.perfdata.monitor.protocol.rmi``, ``sun.misc``, ``sun.net.ftp``, ``sun.net.www.protocol.http``, ``sun.security.acl``, ``sun.security.jgss.krb5``, ``sun.security.krb5``, ``sun.security.pkcs``, ``sun.security.pkcs11``, ``sun.security.provider``, ``sun.security.ssl``, ``sun.security.x509``, ``sun.tools.jconsole``",151,8258,818,188,6,14,18,,186
+    Others,"``actions.osgi``, ``antlr``, ``ch.ethz.ssh2``, ``cn.hutool.core.codec``, ``com.alibaba.com.caucho.hessian.io``, ``com.alibaba.druid.sql``, ``com.alibaba.fastjson2``, ``com.amazonaws.auth``, ``com.auth0.jwt.algorithms``, ``com.azure.identity``, ``com.caucho.burlap.io``, ``com.caucho.hessian.io``, ``com.cedarsoftware.util.io``, ``com.esotericsoftware.kryo.io``, ``com.esotericsoftware.kryo5.io``, ``com.esotericsoftware.yamlbeans``, ``com.hubspot.jinjava``, ``com.jcraft.jsch``, ``com.microsoft.sqlserver.jdbc``, ``com.mitchellbosecke.pebble``, ``com.opensymphony.xwork2``, ``com.sshtools.j2ssh.authentication``, ``com.sun.crypto.provider``, ``com.sun.jndi.ldap``, ``com.sun.net.httpserver``, ``com.sun.net.ssl``, ``com.sun.rowset``, ``com.sun.security.auth.module``, ``com.sun.security.ntlm``, ``com.sun.security.sasl.digest``, ``com.thoughtworks.xstream``, ``com.trilead.ssh2``, ``com.unboundid.ldap.sdk``, ``com.zaxxer.hikari``, ``flexjson``, ``hudson``, ``io.jsonwebtoken``, ``io.micronaut.context.annotation``, ``io.micronaut.core.convert.value``, ``io.micronaut.http``, ``io.undertow.server.handlers.resource``, ``javafx.scene.web``, ``jenkins``, ``jodd.json``, ``liquibase.database.jvm``, ``liquibase.statement.core``, ``net.lingala.zip4j``, ``net.schmizz.sshj``, ``net.sf.json``, ``net.sf.saxon.s9api``, ``ognl``, ``org.acegisecurity``, ``org.antlr.runtime``, ``org.apache.avro``, ``org.apache.commons.codec``, ``org.apache.commons.compress.archivers.tar``, ``org.apache.commons.exec``, ``org.apache.commons.fileupload``, ``org.apache.commons.httpclient.util``, ``org.apache.commons.jelly``, ``org.apache.commons.jexl2``, ``org.apache.commons.jexl3``, ``org.apache.commons.lang``, ``org.apache.commons.logging``, ``org.apache.commons.net``, ``org.apache.commons.ognl``, ``org.apache.cxf.catalog``, ``org.apache.cxf.common.classloader``, ``org.apache.cxf.common.jaxb``, ``org.apache.cxf.common.logging``, ``org.apache.cxf.configuration.jsse``, ``org.apache.cxf.helpers``, ``org.apache.cxf.resource``, ``org.apache.cxf.staxutils``, ``org.apache.cxf.tools.corba.utils``, ``org.apache.cxf.tools.util``, ``org.apache.cxf.transform``, ``org.apache.directory.ldap.client.api``, ``org.apache.hadoop.fs``, ``org.apache.hadoop.hive.metastore``, ``org.apache.hadoop.hive.ql.exec``, ``org.apache.hadoop.hive.ql.metadata``, ``org.apache.hc.client5.http.async.methods``, ``org.apache.hc.client5.http.classic.methods``, ``org.apache.hc.client5.http.fluent``, ``org.apache.hc.client5.http.protocol``, ``org.apache.hc.client5.http.utils``, ``org.apache.hive.hcatalog.templeton``, ``org.apache.ibatis.jdbc``, ``org.apache.ibatis.mapping``, ``org.apache.log4j``, ``org.apache.poi``, ``org.apache.shiro.authc``, ``org.apache.shiro.codec``, ``org.apache.shiro.jndi``, ``org.apache.shiro.mgt``, ``org.apache.sshd.client.session``, ``org.apache.tools.ant``, ``org.apache.tools.zip``, ``org.codehaus.cargo.container.installer``, ``org.dom4j``, ``org.exolab.castor.xml``, ``org.fusesource.leveldbjni``, ``org.geogebra.web.full.main``, ``org.gradle.api.file``, ``org.ho.yaml``, ``org.influxdb``, ``org.jabsorb``, ``org.jboss.vfs``, ``org.jdbi.v3.core``, ``org.jenkins.ui.icon``, ``org.jenkins.ui.symbol``, ``org.keycloak.models.map.storage``, ``org.kohsuke.stapler``, ``org.lastaflute.web``, ``org.mvel2``, ``org.openjdk.jmh.runner.options``, ``org.owasp.esapi``, ``org.pac4j.jwt.config.encryption``, ``org.pac4j.jwt.config.signature``, ``org.scijava.log``, ``org.xml.sax``, ``org.xmlpull.v1``, ``play.libs.ws``, ``play.mvc``, ``ratpack.core.form``, ``ratpack.core.handling``, ``ratpack.core.http``, ``ratpack.exec``, ``ratpack.form``, ``ratpack.func``, ``ratpack.handling``, ``ratpack.http``, ``ratpack.util``, ``software.amazon.awssdk.transfer.s3.model``, ``sun.jvmstat.perfdata.monitor.protocol.local``, ``sun.jvmstat.perfdata.monitor.protocol.rmi``, ``sun.misc``, ``sun.net.ftp``, ``sun.net.www.protocol.http``, ``sun.security.acl``, ``sun.security.jgss.krb5``, ``sun.security.krb5``, ``sun.security.pkcs``, ``sun.security.pkcs11``, ``sun.security.provider``, ``sun.security.ssl``, ``sun.security.x509``, ``sun.tools.jconsole``",167,8313,849,188,6,14,18,,211
-    Totals,,406,28627,2751,461,16,137,33,1,416
+    Totals,,422,28682,2782,461,16,137,33,1,441
  • Changes to framework-coverage-java.csv:
+ io.micronaut.context.annotation,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,
+ io.micronaut.core.convert.value,,,8,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,7,1
+ io.micronaut.http,31,14,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,25,2,,,,,,4,,,,,,,,,,14,39,8

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds Micronaut framework modeling to the Java CodeQL libraries and integrates it into the existing dataflow source/sink architecture, with accompanying stubs and tests to validate taint tracking for common Micronaut HTTP/WebSocket/config patterns.

Changes:

  • Add Micronaut-specific CodeQL libraries (controller/websocket/config/data/security overlays) and wire them into FlowSources.
  • Add Micronaut MaD .model.yml entries for key HTTP/multipart/client APIs (sources, summaries, and sinks such as SSRF, redirect, and header splitting).
  • Add Micronaut stubs and new/updated tests/options for security and library test suites.

Reviewed changes

Copilot reviewed 72 out of 74 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
java/ql/lib/semmle/code/java/dataflow/FlowSources.qll Imports Micronaut framework libraries and adds Micronaut source definitions.
java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautController.qll New Micronaut HTTP controller/request mapping identification library.
java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautWebSocket.qll New Micronaut WebSocket endpoint/handler identification library.
java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautConfig.qll New Micronaut configuration injection identification library.
java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautData.qll New Micronaut Data repository/query identification library.
java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautSecurity.qll New Micronaut Security annotation identification library.
java/ql/lib/ext/io.micronaut.http.model.yml Adds Micronaut HTTP request sources + summaries, plus redirect/header sinks.
java/ql/lib/ext/io.micronaut.http.multipart.model.yml Adds Micronaut multipart upload sources (file upload getters).
java/ql/lib/ext/io.micronaut.http.client.model.yml Adds Micronaut HTTP client SSRF sink models + URI/UriBuilder propagation.
java/ql/test/library-tests/frameworks/micronaut/options Adds extractor options for Micronaut library tests (classpath stubs).
java/ql/test/library-tests/frameworks/micronaut/flow.ql New inline taint-flow test driver for Micronaut modeling.
java/ql/test/library-tests/frameworks/micronaut/flow.expected Empty expected output for inline flow test (no mismatches).
java/ql/test/library-tests/frameworks/micronaut/MicronautControllerTest.java Library test cases for Micronaut controller parameter sources and error handler.
java/ql/test/library-tests/frameworks/micronaut/MicronautWebSocketTest.java Library test cases for WebSocket handler parameters as sources.
java/ql/test/library-tests/frameworks/micronaut/MicronautHttpRequestTest.java Library test cases for taint from HttpRequest accessors (headers/params/etc).
java/ql/test/library-tests/frameworks/micronaut/MicronautHttpClientTest.java Library test cases for client sinks and URI/UriBuilder taint propagation.
java/ql/test/library-tests/frameworks/micronaut/MicronautFileUploadTest.java Library test cases for multipart upload taint sources.
java/ql/test/library-tests/frameworks/micronaut/MicronautConfigTest.java Library test cases intended for config injection sources.
java/ql/test/query-tests/security/CWE-918/options Adds Micronaut stubs to classpath for SSRF query tests.
java/ql/test/query-tests/security/CWE-918/MicronautSSRF.java New SSRF query test exercising Micronaut client sinks and controller source.
java/ql/test/query-tests/security/CWE-601/semmle/tests/options Adds Micronaut stubs to classpath for URL redirect query tests.
java/ql/test/query-tests/security/CWE-601/semmle/tests/MicronautUrlRedirect.java New URL redirect query test for HttpResponse.redirect(URI.create(...)).
java/ql/test/query-tests/security/CWE-601/semmle/tests/UrlRedirect.expected Updated expected output for URL redirect query tests (generated).
java/ql/test/query-tests/security/CWE-113/semmle/tests/options Adds Micronaut stubs to classpath for response splitting query tests.
java/ql/test/query-tests/security/CWE-113/semmle/tests/MicronautResponseSplitting.java New response splitting query test for MutableHttpResponse.header(...).
java/ql/test/query-tests/security/CWE-113/semmle/tests/ResponseSplitting.expected Updated expected output for response splitting query tests (generated).
java/ql/test/stubs/micronaut-4.x/LICENSE.txt Adds Micronaut stub licensing file.
java/ql/test/stubs/micronaut-4.x/io/micronaut/context/annotation/Property.java Stub for @Property.
java/ql/test/stubs/micronaut-4.x/io/micronaut/context/annotation/Value.java Stub for @Value.
java/ql/test/stubs/micronaut-4.x/io/micronaut/data/annotation/Query.java Stub for @Query.
java/ql/test/stubs/micronaut-4.x/io/micronaut/data/annotation/Repository.java Stub for @Repository.
java/ql/test/stubs/micronaut-4.x/io/micronaut/data/repository/CrudRepository.java Stub for CrudRepository.
java/ql/test/stubs/micronaut-4.x/io/micronaut/data/repository/GenericRepository.java Stub for GenericRepository.
java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpHeaders.java Stub for HttpHeaders.
java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpMethod.java Stub for HttpMethod.
java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpParameters.java Stub for HttpParameters.
java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpRequest.java Stub for HttpRequest (incl. static factories).
java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpResponse.java Stub for HttpResponse (incl. redirect).
java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpStatus.java Stub for HttpStatus.
java/ql/test/stubs/micronaut-4.x/io/micronaut/http/MediaType.java Stub for MediaType.
java/ql/test/stubs/micronaut-4.x/io/micronaut/http/MutableHttpResponse.java Stub for MutableHttpResponse (incl. header).
java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Body.java Stub for @Body.
java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Controller.java Stub for @Controller.
java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/CookieValue.java Stub for @CookieValue.
java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/CustomHttpMethod.java Stub for @CustomHttpMethod.
java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Delete.java Stub for @Delete.
java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Error.java Stub for @Error.
java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Get.java Stub for @Get.
java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Head.java Stub for @Head.
java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Header.java Stub for @Header.
java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Options.java Stub for @Options.
java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Part.java Stub for @Part.
java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Patch.java Stub for @Patch.
java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/PathVariable.java Stub for @PathVariable.
java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Post.java Stub for @Post.
java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Put.java Stub for @Put.
java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/QueryValue.java Stub for @QueryValue.
java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/RequestAttribute.java Stub for @RequestAttribute.
java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/RequestBean.java Stub for @RequestBean.
java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Trace.java Stub for @Trace.
java/ql/test/stubs/micronaut-4.x/io/micronaut/http/client/BlockingHttpClient.java Stub for BlockingHttpClient.
java/ql/test/stubs/micronaut-4.x/io/micronaut/http/client/HttpClient.java Stub for HttpClient.
java/ql/test/stubs/micronaut-4.x/io/micronaut/http/cookie/Cookie.java Stub for Cookie.
java/ql/test/stubs/micronaut-4.x/io/micronaut/http/cookie/Cookies.java Stub for Cookies.
java/ql/test/stubs/micronaut-4.x/io/micronaut/http/multipart/CompletedFileUpload.java Stub for CompletedFileUpload.
java/ql/test/stubs/micronaut-4.x/io/micronaut/http/uri/UriBuilder.java Stub for UriBuilder.
java/ql/test/stubs/micronaut-4.x/io/micronaut/security/annotation/Secured.java Stub for @Secured.
java/ql/test/stubs/micronaut-4.x/io/micronaut/websocket/WebSocketSession.java Stub for WebSocketSession.
java/ql/test/stubs/micronaut-4.x/io/micronaut/websocket/annotation/OnClose.java Stub for @OnClose.
java/ql/test/stubs/micronaut-4.x/io/micronaut/websocket/annotation/OnMessage.java Stub for @OnMessage.
java/ql/test/stubs/micronaut-4.x/io/micronaut/websocket/annotation/OnOpen.java Stub for @OnOpen.
java/ql/test/stubs/micronaut-4.x/io/micronaut/websocket/annotation/ServerWebSocket.java Stub for @ServerWebSocket.

Comment thread java/ql/test/library-tests/frameworks/micronaut/MicronautConfigTest.java Outdated
Comment thread java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautController.qll Outdated
Comment thread java/ql/lib/semmle/code/java/dataflow/FlowSources.qll Outdated
Comment thread java/ql/test/library-tests/frameworks/micronaut/MicronautConfigTest.java Outdated
Comment thread java/ql/lib/ext/io.micronaut.http.client.model.yml Outdated
Comment thread java/ql/lib/ext/io.micronaut.http.client.model.yml Outdated
Comment thread java/ql/lib/ext/io.micronaut.http.client.model.yml Outdated
Comment thread java/ql/lib/ext/io.micronaut.http.client.model.yml Outdated
Comment thread java/ql/lib/ext/io.micronaut.http.client.model.yml Outdated
Comment thread java/ql/lib/ext/io.micronaut.http.client.model.yml Outdated
Comment thread java/ql/lib/ext/io.micronaut.http.client.model.yml Outdated
@owen-mc

owen-mc commented Mar 5, 2026

Copy link
Copy Markdown
Contributor

Note that there should be a space after the $ in inline expectation tests. I have just merged a PR that enforces this, so you will have to update this PR before it can be merged.

Comment thread java/ql/lib/ext/io.micronaut.http.model.yml Outdated
Comment thread java/ql/lib/ext/io.micronaut.http.model.yml Outdated
Comment thread java/ql/lib/ext/io.micronaut.http.model.yml Outdated
owen-mc
owen-mc previously requested changes Mar 6, 2026

@owen-mc owen-mc left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Lots of great modelling here. I have read through the relevant docs and I think found quite a few more things that should be modelled, and one or two things that should be removed.

Comment thread java/ql/lib/ext/io.micronaut.http.model.yml
Comment thread java/ql/lib/ext/io.micronaut.http.model.yml Outdated
Comment thread java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautController.qll Outdated
Comment thread java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautController.qll Outdated
Comment thread java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautController.qll Outdated
Comment thread java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautController.qll Outdated
Comment thread java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautWebSocket.qll Outdated
Comment thread java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautWebSocket.qll Outdated
mbaluda and others added 3 commits July 28, 2026 10:58
Co-authored-by: Owen Mansel-Chan <62447351+owen-mc@users.noreply.github.com>
…gTest.java

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…ig.java

Co-authored-by: Owen Mansel-Chan <62447351+owen-mc@users.noreply.github.com>
@nicolaswill

Copy link
Copy Markdown
Contributor Author

@owen-mc I've addressed most of your feedback (and more) in the last couple of commits. Should be ready.

@nicolaswill
nicolaswill requested a review from owen-mc July 29, 2026 01:07
…ronaut-pr

# Conflicts:
#	java/ql/test/query-tests/security/CWE-918/RequestForgery.expected
#	java/ql/test/query-tests/security/CWE-918/options
@nicolaswill
nicolaswill dismissed owen-mc’s stale review August 4, 2026 14:34

Stale, comments addressed

jamiewmeldrum added a commit to jamiewmeldrum/practiq-api that referenced this pull request Aug 4, 2026
Records why CodeQL is a separate workflow, how findings block merges through
the ruleset rather than by failing the run, and the verified limitation that
matters most: CodeQL has no Micronaut framework models, so taint tracking on
request-bound parameters finds nothing. Proven with a deliberate path
injection that produced no alert despite java/path-injection running.

Upstream support is open but unmerged (github/codeql#21387), and its model
files cannot be vendored usefully because annotation-bound sources need QL
library changes a model pack cannot supply.

@owen-mc owen-mc left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for addressing all of those review comments. My only review comments now are a few minor changes caused by mistakes in my suggestions and a few models that should be in different files.

data:
- ["io.micronaut.http.uri", "UriBuilder", True, "build", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"]
- ["io.micronaut.http.uri", "UriBuilder", True, "expand", "(Map)", "", "Argument[0].MapValue", "ReturnValue", "taint", "manual"]
- ["io.micronaut.http.uri", "UriBuilder", True, "expand", "(Map)", "", "Argument[this]", "ReturnValue", "taint", "manual"]

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Apologies, there was a mistake in my review suggestion.

Suggested change
- ["io.micronaut.http.uri", "UriBuilder", True, "expand", "(Map)", "", "Argument[this]", "ReturnValue", "taint", "manual"]
- ["io.micronaut.http.uri", "UriBuilder", True, "expand", "(Map)", "", "Argument[this]", "ReturnValue", "value", "manual"]

Comment on lines +19 to +21
- ["io.micronaut.core.convert.value", "ConvertibleMultiValues", True, "get", "", "", "Argument[this].Element.MapValue", "ReturnValue", "taint", "manual"]
- ["io.micronaut.core.convert.value", "ConvertibleMultiValues", True, "getAll", "", "", "Argument[this].Element.MapValue", "ReturnValue", "value", "manual"]
- ["io.micronaut.core.convert.value", "ConvertibleMultiValues", True, "getFirst", "", "", "Argument[this].Element.MapValue", "ReturnValue", "taint", "manual"]

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
- ["io.micronaut.core.convert.value", "ConvertibleMultiValues", True, "get", "", "", "Argument[this].Element.MapValue", "ReturnValue", "taint", "manual"]
- ["io.micronaut.core.convert.value", "ConvertibleMultiValues", True, "getAll", "", "", "Argument[this].Element.MapValue", "ReturnValue", "value", "manual"]
- ["io.micronaut.core.convert.value", "ConvertibleMultiValues", True, "getFirst", "", "", "Argument[this].Element.MapValue", "ReturnValue", "taint", "manual"]
- ["io.micronaut.core.convert.value", "ConvertibleMultiValues", True, "get", "", "", "Argument[this].MapValue", "ReturnValue", "taint", "manual"]
- ["io.micronaut.core.convert.value", "ConvertibleMultiValues", True, "getAll", "", "", "Argument[this].MapValue", "ReturnValue.Element", "value", "manual"]
- ["io.micronaut.core.convert.value", "ConvertibleMultiValues", True, "getFirst", "", "", "Argument[this].MapValue", "ReturnValue.Element", "taint", "manual"]

I was wrong before, ConvertibleMultiValues is essentially just a map which can store multiple values for the same key, so the input should have access path .MapValue. getAll returns a list so the output should have access path .Element. getFirst returns Optional and our models for java.util.Optional store the value with the access path .Element (which surprised me), like a list which might have an element, so the output should have access path .Element.

Comment on lines +22 to +26
- ["io.micronaut.core.convert.value", "ConvertibleValues", True, "asMap", "", "", "Argument[this].Element.MapValue", "ReturnValue.MapValue", "taint", "manual"]
- ["io.micronaut.core.convert.value", "ConvertibleValues", True, "asProperties", "", "", "Argument[this].Element.MapValue", "ReturnValue.MapValue", "taint", "manual"]
- ["io.micronaut.core.convert.value", "ConvertibleValues", True, "getValue", "", "", "Argument[this].Element.MapValue", "ReturnValue", "taint", "manual"]
- ["io.micronaut.core.convert.value", "ConvertibleValues", True, "subMap", "", "", "Argument[this].Element.MapValue", "ReturnValue.MapValue", "taint", "manual"]
- ["io.micronaut.core.convert.value", "ConvertibleValues", True, "values", "", "", "Argument[this].Element.MapValue", "ReturnValue.Element", "taint", "manual"]

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
- ["io.micronaut.core.convert.value", "ConvertibleValues", True, "asMap", "", "", "Argument[this].Element.MapValue", "ReturnValue.MapValue", "taint", "manual"]
- ["io.micronaut.core.convert.value", "ConvertibleValues", True, "asProperties", "", "", "Argument[this].Element.MapValue", "ReturnValue.MapValue", "taint", "manual"]
- ["io.micronaut.core.convert.value", "ConvertibleValues", True, "getValue", "", "", "Argument[this].Element.MapValue", "ReturnValue", "taint", "manual"]
- ["io.micronaut.core.convert.value", "ConvertibleValues", True, "subMap", "", "", "Argument[this].Element.MapValue", "ReturnValue.MapValue", "taint", "manual"]
- ["io.micronaut.core.convert.value", "ConvertibleValues", True, "values", "", "", "Argument[this].Element.MapValue", "ReturnValue.Element", "taint", "manual"]
- ["io.micronaut.core.convert.value", "ConvertibleValues", True, "asMap", "", "", "Argument[this]", "ReturnValue", "taint", "manual"]
- ["io.micronaut.core.convert.value", "ConvertibleValues", True, "asProperties", "", "", "Argument[this]", "ReturnValue", "taint", "manual"]
- ["io.micronaut.core.convert.value", "ConvertibleValues", True, "getValue", "", "", "Argument[this].MapValue", "ReturnValue", "taint", "manual"]
- ["io.micronaut.core.convert.value", "ConvertibleValues", True, "subMap", "", "", "Argument[this].MapValue", "ReturnValue.MapValue", "taint", "manual"]
- ["io.micronaut.core.convert.value", "ConvertibleValues", True, "values", "", "", "Argument[this].MapValue", "ReturnValue.Element", "taint", "manual"]

I was wrong before: ConvertibleValues is essentially just a map. We are only interested in cases where it's Map<K, List<V>>, but I don't think we need to reflect that in the models - it should just work due to default taint steps.

pack: codeql/java-all
extensible: summaryModel
data:
- ["io.micronaut.core.convert.value", "ConvertibleMultiValues", True, "get", "", "", "Argument[this].Element.MapValue", "ReturnValue", "taint", "manual"]

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All the models for ConvertibleMultiValues and ConvertibleValues should be in a separate file as they are in a different package.

Comment on lines 43 to +49
- ["io.micronaut.http.cookie", "Cookie", True, "getDomain", "", "", "Argument[this]", "ReturnValue", "taint", "manual"]
- ["io.micronaut.http.cookie", "Cookie", True, "getName", "", "", "Argument[this]", "ReturnValue", "taint", "manual"]
- ["io.micronaut.http.cookie", "Cookie", True, "getPath", "", "", "Argument[this]", "ReturnValue", "taint", "manual"]
- ["io.micronaut.http.cookie", "Cookie", True, "getValue", "", "", "Argument[this]", "ReturnValue", "taint", "manual"]
- ["io.micronaut.http.cookie", "Cookies", True, "findCookie", "", "", "Argument[this]", "ReturnValue", "taint", "manual"]
- ["io.micronaut.http.cookie", "Cookies", True, "get", "", "", "Argument[this]", "ReturnValue", "taint", "manual"]
- ["io.micronaut.http.cookie", "Cookies", True, "getAll", "", "", "Argument[this]", "ReturnValue", "taint", "manual"]

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please move these into a separate file for this package.

@owen-mc owen-mc changed the title Add CodeQL support and tests for Micronaut framework Java: Add CodeQL support and tests for Micronaut framework Aug 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants