CodeQL 2.27.0 (2026-09-09)Âķ
This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the code scanning section on the GitHub blog, relevant GitHub Changelog updates, changes in the CodeQL extension for Visual Studio Code, and the CodeQL Action changelog.
Security CoverageÂķ
CodeQL 2.27.0 runs a total of 498 security queries when configured with the Default suite (covering 170 CWE). The Extended suite enables an additional 131 queries (covering 32 more CWE). 1 security query has been added with this release.
CodeQL CLIÂķ
DeprecationsÂķ
Language support for Java 9 and 10 has been deprecated and will be removed in January 2027. Java 7 and 8 will continue to be supported.
The generic multi-platform
codeql.zipCLI distribution is deprecated and will be removed in a future release. Download the per-platformcodeql-PLATFORM.zipfor your platform instead. The CLI now emits a warning when it is run from an all-platforms distribution; setCODEQL_ALLOW_ALL_PLATFORMS_DIST=trueto suppress it.
New FeaturesÂķ
CodeQL now supports native Linux arm64 (
linux-arm64) as a first-class platform. The per-platform CLI (codeql-linux-arm64.zip) and CodeQL bundle (codeql-bundle-linux-arm64.tar.gzandcodeql-bundle-linux-arm64.tar.zst) are available as release assets. Arm64 binaries are provided as a per-platform download only, and are not included in the combinedcodeql.zip,codeql-bundle.tar.gz, orcodeql-bundle.tar.zst.CodeQL can now take advantage of an organizationâs private registry configurations in Code Scanning Default Setup to authenticate to container registries or the GitHub API when trying to fetch custom queries or packs. This allows custom queries or packs to be accessed from private locations in Code Scanning Default Setup as long as suitable âGit Sourceâ or âDocker Registryâ private registry configurations are set up for the organization.
Query PacksÂķ
Minor Analysis ImprovementsÂķ
C/C++Âķ
The
cpp/leap-year/unsafe-array-for-days-of-the-yearquery (âUnsafe array for days of the yearâ) no longer reports an alert on the__PRETTY_FUNCTION__variable (and related variables) when the enclosing function has a signature that is exactly 364 characters.
C#Âķ
The
cs/linq/missed-wherequery no longer flagsforeachloops where the matching branch terminates the method, iterator, or loop instead of continuing with filtered loop work.
JavaScript/TypeScriptÂķ
HTML files are now included in file-coverage stats, and will start showing up on the status page for CodeQL under âScanned Filesâ.
RustÂķ
The
rust/hard-coded-cryptographic-valuequery has been adjusted to produce fewer results in certain situations where many results were being produced with very similar source locations.The
rust/unused-variablequery no longer reports variables in functions containing the standardtodo!()orunimplemented!()macros.
New QueriesÂķ
RustÂķ
Added a new query,
rust/command-line-injection, to detect uncontrolled command lines.
Language LibrariesÂķ
Bug FixesÂķ
PythonÂķ
Fixed a bug where a Python file could be silently dropped from the analysis (with a spurious âA parse error occurredâ diagnostic) when it contained a string literal, comment, or identifier with a character such as the U+FE0F emoji variation selector, a U+200D zero width joiner, or a combining accent.
Fixed the extraction of PEP 758
except A, B:clauses by the default (non-tree-sitter) Python parser. Previously the second exception type was extracted as a Python 2 style alias binding, so it was recorded as aStorerather than a use. This caused false positives from queries that reason about whether a name is used, such aspy/unused-import. When extracting Python 2 (--lang=2),except A, e:continues to bindeas an alias, since that is what the syntax means in that version.
Breaking ChangesÂķ
RubyÂķ
The Ruby control flow graph implementation has been completely replaced. This affects a number of queries slightly. The CFG now includes additional nodes to more accurately represent certain constructs. This also means that any existing code that implicitly relies on very specific details about the CFG may need to be updated. The CFG no longer uses splitting, which means that AST nodes now have a unique CFG node representation. In particular,
ControlFlowNode.getAstNodehas changed its meaning. The AST-to-CFG mapping remains one-to-many, but now for a different reason. It used to be because of splitting, but now itâs because of additional âhelperâ CFG nodes. To get the (now canonical) CFG node for a given AST node, useStmt.getControlFlowNode()instead.
Minor Analysis ImprovementsÂķ
C/C++Âķ
Added the PostgreSQL libpq (asynchronous) query-execution functions
PQexec,PQexecParams,PQprepare,PQsendQuery,PQsendQueryParams,PQsendPrepareassql-injectionsinks.Initializers of compiler-generated variables are now recognized as compiler-generated. A new predicate
isCompilerGeneratedonInitializerhas been added to reflect this.
C#Âķ
In
build-mode: none, project and solution restoration is now always attempted using the feeds available.C# analysis with build mode
nonenow lists unreachable explicitly configured NuGet feeds in both the extraction warning and the tool status page note. This makes it easier to identify feeds that may cause dependencies to be missing from the analysis.Improved ASP.NET Core MVC controller and action discovery to more closely match runtime behavior, including application parts, endpoint mappings, inherited actions, and controller and action exclusions. Service-injected action parameters are no longer modeled as remote input.
Java/KotlinÂķ
Added modeling for the Micronaut framework, including HTTP controllers, WebSocket endpoints, configuration injection, data access, security annotations, and HTTP client sinks.
GitHub ActionsÂķ
Checks on author association fields read from the event payload (e.g.
github.event.pull_request.author_association) now only count as protection for events whose payload actually populates that field. Previously, a condition such asgithub.event.pull_request.author_association != 'NONE'on a workflow triggered byissuesevents was treated as a protective check even thoughgithub.event.pull_requestis not populated forissuesevents, which makes the condition vacuous. This change may result in more alerts for queries using theControlCheckclass.
RustÂķ
Canonical paths for Rust trait items now use the format
<crate::Trait>::iteminstead ofcrate::Trait::item. Custom data extension models that reference trait items must be updated to use the new format.
New FeaturesÂķ
C/C++Âķ
Sources and sinks defined using models-as-data now support access paths with fields. For example, the path
ReturnValue.Field[S::f]makes the fieldS::fa flow source when it is returned by a call.
C#Âķ
Added taint modeling for OData action parameter binding (
Microsoft.AspNet.OData/Microsoft.AspNetCore.OData). Values cast,as-converted, or type-tested out ofODataActionParameters, and entities tracked byDelta<T>(viaGetInstance,Patch,Put,CopyChangedValues, andCopyUnchangedValues), now taint the members of the target type.
Java/KotlinÂķ
Factories returned by the Apache Commons Secure XML (
org.apache.commons.xml.secure) hardening libraryâsSecureDocumentBuilderFactory,SecureSAXParserFactory,SecureXMLInputFactory,SecureTransformerFactoryandSecureSchemaFactoryclasses are now recognized as safely configured by the XXE query.A new extensible class
SafeXmlFactorySourcewas added tosemmle.code.java.security.XmlParsersfor modeling sources of pre-hardened JAXP factories.
GitHub ActionsÂķ
GitHub Actions databases now extract
actions.lockfiles. The newActionsLockclass provides access to their YAML abstract syntax trees.