mirror of
https://github.com/github/codeql.git
synced 2026-05-26 17:11:24 +02:00
Compare commits
40 Commits
copilot/in
...
redsun82/r
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
90c91fa36d | ||
|
|
491c373e07 | ||
|
|
996e79131e | ||
|
|
688695cd57 | ||
|
|
3c4e22a8ba | ||
|
|
c70007607a | ||
|
|
9685755479 | ||
|
|
a7405bddaa | ||
|
|
8ad461be98 | ||
|
|
0e6257de2d | ||
|
|
77f6caca00 | ||
|
|
f98dfcd0a5 | ||
|
|
a027665ab4 | ||
|
|
de1cb26a93 | ||
|
|
9599f01ae0 | ||
|
|
5a219d1527 | ||
|
|
ec7e38cd4d | ||
|
|
871f307fa4 | ||
|
|
3ee45ff4b9 | ||
|
|
6d6e9c0d47 | ||
|
|
a33af09244 | ||
|
|
25d20399f3 | ||
|
|
e6c5f944ba | ||
|
|
e408540d36 | ||
|
|
462a7bc423 | ||
|
|
422a6bd670 | ||
|
|
30a5769e20 | ||
|
|
a72cef6fda | ||
|
|
dc80a029cb | ||
|
|
9f64000962 | ||
|
|
19781e53e7 | ||
|
|
5f10a88208 | ||
|
|
5add24be59 | ||
|
|
16235d7aca | ||
|
|
b551e89ea8 | ||
|
|
e38616a2ef | ||
|
|
2902a19a50 | ||
|
|
7f1bebe8ba | ||
|
|
3f7b50ebba | ||
|
|
a845fd0a83 |
@@ -1,3 +1,9 @@
|
||||
## 0.4.36
|
||||
|
||||
### Minor Analysis Improvements
|
||||
|
||||
* Altered 2 patterns in the `poisonable_steps` modelling. Extra sinks are detected in the following cases: scripts executed via python modules and `go run` in directories are detected as potential mechanisms of injection. For the go execution pattern, the pattern is updated to now ignore flags that occur between go and the specific command. This change may lead to more results being detected by the following queries: `actions/untrusted-checkout/high`, `actions/untrusted-checkout/critical`, `actions/untrusted-checkout-toctou/high`, `actions/untrusted-checkout-toctou/critical`, `actions/cache-poisoning/poisonable-step`, `actions/cache-poisoning/direct-cache` and `actions/artifact-poisoning/path-traversal`.
|
||||
|
||||
## 0.4.35
|
||||
|
||||
No user-facing changes.
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
---
|
||||
category: minorAnalysis
|
||||
---
|
||||
* Altered 2 patterns in the `poisonable_steps` modelling. Extra sinks are detected in the following cases: scripts executed via python modules and `go run` in directories are detected as potential mechanisms of injection. For the go execution pattern, the pattern is updated to now ignore flags that occur between go and the specific command. This change may lead to more results being detected by the following queries: `actions/untrusted-checkout/high`, `actions/untrusted-checkout/critical`, `actions/untrusted-checkout-toctou/high`, `actions/untrusted-checkout-toctou/critical`, `actions/cache-poisoning/poisonable-step`, `actions/cache-poisoning/direct-cache` and `actions/artifact-poisoning/path-traversal`.
|
||||
## 0.4.36
|
||||
|
||||
### Minor Analysis Improvements
|
||||
|
||||
* Altered 2 patterns in the `poisonable_steps` modelling. Extra sinks are detected in the following cases: scripts executed via python modules and `go run` in directories are detected as potential mechanisms of injection. For the go execution pattern, the pattern is updated to now ignore flags that occur between go and the specific command. This change may lead to more results being detected by the following queries: `actions/untrusted-checkout/high`, `actions/untrusted-checkout/critical`, `actions/untrusted-checkout-toctou/high`, `actions/untrusted-checkout-toctou/critical`, `actions/cache-poisoning/poisonable-step`, `actions/cache-poisoning/direct-cache` and `actions/artifact-poisoning/path-traversal`.
|
||||
@@ -1,2 +1,2 @@
|
||||
---
|
||||
lastReleaseVersion: 0.4.35
|
||||
lastReleaseVersion: 0.4.36
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
name: codeql/actions-all
|
||||
version: 0.4.36-dev
|
||||
version: 0.4.37-dev
|
||||
library: true
|
||||
warnOnImplicitThis: true
|
||||
dependencies:
|
||||
|
||||
@@ -1,3 +1,17 @@
|
||||
## 0.6.28
|
||||
|
||||
### Query Metadata Changes
|
||||
|
||||
* Adjusted the name of `actions/untrusted-checkout/high` to more clearly describe which parts of the scenario are in a privileged context.
|
||||
|
||||
### Minor Analysis Improvements
|
||||
|
||||
* The `actions/unpinned-tag` query now analyzes composite action metadata (`action.yml`/`action.yaml` files) in addition to workflow files, providing more comprehensive detection of unpinned action references across the entire Actions ecosystem.
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* Fixed help file descriptions for queries: `actions/untrusted-checkout/critical`, `actions/untrusted-checkout/high`, `actions/untrusted-checkout/medium`. Previously the messages were unclear as to why and how the vulnerabilities could occur.
|
||||
|
||||
## 0.6.27
|
||||
|
||||
No user-facing changes.
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
---
|
||||
category: fix
|
||||
---
|
||||
* Fixed help file descriptions for queries: `actions/untrusted-checkout/critical`, `actions/untrusted-checkout/high`, `actions/untrusted-checkout/medium`. Previously the messages were unclear as to why and how the vulnerabilities could occur.
|
||||
@@ -1,4 +0,0 @@
|
||||
---
|
||||
category: queryMetadata
|
||||
---
|
||||
* Adjusted the name of `actions/untrusted-checkout/high` to more clearly describe which parts of the scenario are in a privileged context.
|
||||
@@ -1,4 +0,0 @@
|
||||
---
|
||||
category: minorAnalysis
|
||||
---
|
||||
* The `actions/unpinned-tag` query now analyzes composite action metadata (`action.yml`/`action.yaml` files) in addition to workflow files, providing more comprehensive detection of unpinned action references across the entire Actions ecosystem.
|
||||
13
actions/ql/src/change-notes/released/0.6.28.md
Normal file
13
actions/ql/src/change-notes/released/0.6.28.md
Normal file
@@ -0,0 +1,13 @@
|
||||
## 0.6.28
|
||||
|
||||
### Query Metadata Changes
|
||||
|
||||
* Adjusted the name of `actions/untrusted-checkout/high` to more clearly describe which parts of the scenario are in a privileged context.
|
||||
|
||||
### Minor Analysis Improvements
|
||||
|
||||
* The `actions/unpinned-tag` query now analyzes composite action metadata (`action.yml`/`action.yaml` files) in addition to workflow files, providing more comprehensive detection of unpinned action references across the entire Actions ecosystem.
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* Fixed help file descriptions for queries: `actions/untrusted-checkout/critical`, `actions/untrusted-checkout/high`, `actions/untrusted-checkout/medium`. Previously the messages were unclear as to why and how the vulnerabilities could occur.
|
||||
@@ -1,2 +1,2 @@
|
||||
---
|
||||
lastReleaseVersion: 0.6.27
|
||||
lastReleaseVersion: 0.6.28
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
name: codeql/actions-queries
|
||||
version: 0.6.28-dev
|
||||
version: 0.6.29-dev
|
||||
library: false
|
||||
warnOnImplicitThis: true
|
||||
groups: [actions, queries]
|
||||
|
||||
2577
cpp/downgrades/ef8d209a22e27413aaaeff4446f0ecb9fa2c227b/old.dbscheme
Normal file
2577
cpp/downgrades/ef8d209a22e27413aaaeff4446f0ecb9fa2c227b/old.dbscheme
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,6 @@
|
||||
description: Capture information about one template being generated from another
|
||||
compatibility: full
|
||||
class_template_generated_from.rel: delete
|
||||
function_template_generated_from.rel: delete
|
||||
variable_template_generated_from.rel: delete
|
||||
alias_template_generated_from.rel: delete
|
||||
@@ -1,3 +1,9 @@
|
||||
## 10.1.1
|
||||
|
||||
### Minor Analysis Improvements
|
||||
|
||||
* The `RemoteFlowSourceFunction` model for `fscanf` (and variants) now implements `hasSocketInput` to reflect that these functions may read from a socket.
|
||||
|
||||
## 10.1.0
|
||||
|
||||
### New Features
|
||||
|
||||
5
cpp/ql/lib/change-notes/2026-05-15-secure-scanf.md
Normal file
5
cpp/ql/lib/change-notes/2026-05-15-secure-scanf.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
category: minorAnalysis
|
||||
---
|
||||
* Added flow source models for `scanf_s` and related functions.
|
||||
* Added a `Call` column to `LocalFlowSourceFunction::hasLocalFlowSource` and `RemoteFlowSourceFunction::hasRemoteFlowSource`. The old predicates without a `Call` column continue to be supported.
|
||||
4
cpp/ql/lib/change-notes/2026-05-21-generated-from.md
Normal file
4
cpp/ql/lib/change-notes/2026-05-21-generated-from.md
Normal file
@@ -0,0 +1,4 @@
|
||||
---
|
||||
category: feature
|
||||
---
|
||||
* Added a `getOriginalTemplate` predicate to `TemplateClass`, `TemplateFunction`, `TemplateVariable`, and `AliasTemplateType`, which yields the class member template the template was generated from. The predicates only have results for templates that are members of class template instantiations.
|
||||
@@ -1,4 +1,5 @@
|
||||
---
|
||||
category: minorAnalysis
|
||||
---
|
||||
* The `RemoteFlowSourceFunction` model for `fscanf` (and variants) now implements `hasSocketInput` to reflect that these functions may read from a socket.
|
||||
## 10.1.1
|
||||
|
||||
### Minor Analysis Improvements
|
||||
|
||||
* The `RemoteFlowSourceFunction` model for `fscanf` (and variants) now implements `hasSocketInput` to reflect that these functions may read from a socket.
|
||||
@@ -1,2 +1,2 @@
|
||||
---
|
||||
lastReleaseVersion: 10.1.0
|
||||
lastReleaseVersion: 10.1.1
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
name: codeql/cpp-all
|
||||
version: 10.1.1-dev
|
||||
version: 10.1.2-dev
|
||||
groups: cpp
|
||||
dbscheme: semmlecode.cpp.dbscheme
|
||||
extractor: cpp
|
||||
|
||||
@@ -856,8 +856,10 @@ class AbstractClass extends Class {
|
||||
|
||||
/**
|
||||
* A class template (this class also finds partial specializations
|
||||
* of class templates). For example in the following code there is a
|
||||
* `MyTemplateClass<T>` template:
|
||||
* of class templates).
|
||||
*
|
||||
* For example in the following code there is a `MyTemplateClass<T>`
|
||||
* template:
|
||||
* ```
|
||||
* template<class T>
|
||||
* class MyTemplateClass {
|
||||
@@ -893,6 +895,29 @@ class TemplateClass extends Class {
|
||||
}
|
||||
|
||||
override string getAPrimaryQlClass() { result = "TemplateClass" }
|
||||
|
||||
/**
|
||||
* Gets the class member template this template was generated from.
|
||||
*
|
||||
* This predicate only has results for templates that are members of class
|
||||
* template instantiations. For example, for `MyTemplateClass<int>::C<S>`
|
||||
* in the following code, the result is `MyTemplateClass<T>::C<S>`.
|
||||
* ```cpp
|
||||
* template<class T>
|
||||
* class MyTemplateClass {
|
||||
* template<class S>
|
||||
* class C {
|
||||
* ...
|
||||
* };
|
||||
* };
|
||||
*
|
||||
* template
|
||||
* class MyTemplateClass<int>;
|
||||
* ```
|
||||
*/
|
||||
TemplateClass getOriginalTemplate() {
|
||||
class_template_generated_from(underlyingElement(this), unresolveElement(result))
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -828,6 +828,27 @@ class TemplateFunction extends Function {
|
||||
* such things -- see FunctionTemplateSpecialization for further details.
|
||||
*/
|
||||
FunctionTemplateSpecialization getASpecialization() { result.getPrimaryTemplate() = this }
|
||||
|
||||
/**
|
||||
* Gets the class member template this template was generated from.
|
||||
*
|
||||
* This predicate only has results for templates that are members of class
|
||||
* template instantiations. For example, for `MyTemplateClass<int>::f<S>`
|
||||
* in the following code, the result is `MyTemplateClass<T>::f<S>`.
|
||||
* ```cpp
|
||||
* template<class T>
|
||||
* class MyTemplateClass {
|
||||
* template<class S>
|
||||
* S f();
|
||||
* };
|
||||
*
|
||||
* template
|
||||
* class MyTemplateClass<int>;
|
||||
* ```
|
||||
*/
|
||||
TemplateFunction getOriginalTemplate() {
|
||||
function_template_generated_from(underlyingElement(this), unresolveElement(result))
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -130,6 +130,27 @@ class AliasTemplateType extends TypeAliasType {
|
||||
* ```
|
||||
*/
|
||||
TypeAliasType getAnInstantiation() { result.isConstructedFrom(this) }
|
||||
|
||||
/**
|
||||
* Gets the class member template this template was generated from.
|
||||
*
|
||||
* This predicate only has results for templates that are members of class
|
||||
* template instantiations. For example, for `MyTemplateClass<int>::t<S>`
|
||||
* in the following code, the result is `MyTemplateClass<T>::t<S>`.
|
||||
* ```cpp
|
||||
* template<class T>
|
||||
* class MyTemplateClass {
|
||||
* template<class S>
|
||||
* using t = S;
|
||||
* };
|
||||
*
|
||||
* template
|
||||
* class MyTemplateClass<int>;
|
||||
* ```
|
||||
*/
|
||||
AliasTemplateType getOriginalTemplate() {
|
||||
alias_template_generated_from(underlyingElement(this), unresolveElement(result))
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -614,6 +614,27 @@ class TemplateVariable extends Variable {
|
||||
result.isConstructedFrom(this) and
|
||||
not result.isSpecialization()
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the class member template this template was generated from.
|
||||
*
|
||||
* This predicate only has results for templates that are members of class
|
||||
* template instantiations. For example, for `MyTemplateClass<int>::x<S>`
|
||||
* in the following code, the result is `MyTemplateClass<T>::x<S>`.
|
||||
* ```cpp
|
||||
* template<class T>
|
||||
* class MyTemplateClass {
|
||||
* template<class S>
|
||||
* static S x;
|
||||
* };
|
||||
*
|
||||
* template
|
||||
* class MyTemplateClass<int>;
|
||||
* ```
|
||||
*/
|
||||
TemplateVariable getOriginalTemplate() {
|
||||
variable_template_generated_from(underlyingElement(this), unresolveElement(result))
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -25,6 +25,15 @@ abstract class ScanfFunction extends Function {
|
||||
* (rather than a `char*`).
|
||||
*/
|
||||
predicate isWideCharDefault() { exists(this.getName().indexOf("wscanf")) }
|
||||
|
||||
/** Holds if this is one of the `scanf_s` variants. */
|
||||
predicate isSVariant() {
|
||||
exists(string name | name = this.getName() |
|
||||
name.matches("%\\_s")
|
||||
or
|
||||
name.matches("%\\_s\\_l")
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -34,8 +43,12 @@ class Scanf extends ScanfFunction instanceof TopLevelFunction {
|
||||
Scanf() {
|
||||
this.hasGlobalOrStdOrBslName("scanf") or // scanf(format, args...)
|
||||
this.hasGlobalOrStdOrBslName("wscanf") or // wscanf(format, args...)
|
||||
this.hasGlobalOrStdOrBslName("scanf_s") or // scanf_s(format, args...)
|
||||
this.hasGlobalOrStdOrBslName("wscanf_s") or // wscanf_s(format, args...)
|
||||
this.hasGlobalName("_scanf_l") or // _scanf_l(format, locale, args...)
|
||||
this.hasGlobalName("_wscanf_l")
|
||||
this.hasGlobalName("_wscanf_l") or // _wscanf_l(format, locale, args...)
|
||||
this.hasGlobalName("_scanf_s_l") or // _scanf_s_l(format, locale, args...)
|
||||
this.hasGlobalName("_wscanf_s_l") // _wscanf_s_l(format, locale, args...)
|
||||
}
|
||||
|
||||
override int getInputParameterIndex() { none() }
|
||||
@@ -50,8 +63,12 @@ class Fscanf extends ScanfFunction instanceof TopLevelFunction {
|
||||
Fscanf() {
|
||||
this.hasGlobalOrStdOrBslName("fscanf") or // fscanf(src_stream, format, args...)
|
||||
this.hasGlobalOrStdOrBslName("fwscanf") or // fwscanf(src_stream, format, args...)
|
||||
this.hasGlobalOrStdOrBslName("fscanf_s") or // fscanf_s(src_stream, format, args...)
|
||||
this.hasGlobalOrStdOrBslName("fwscanf_s") or // fwscanf_s(src_stream, format, args...)
|
||||
this.hasGlobalName("_fscanf_l") or // _fscanf_l(src_stream, format, locale, args...)
|
||||
this.hasGlobalName("_fwscanf_l")
|
||||
this.hasGlobalName("_fwscanf_l") or // _fwscanf_l(src_stream, format, locale, args...)
|
||||
this.hasGlobalName("_fscanf_s_l") or // _fscanf_s_l(src_stream, format, locale, args...)
|
||||
this.hasGlobalName("_fwscanf_s_l") // _fwscanf_s_l(src_stream, format, locale, args...)
|
||||
}
|
||||
|
||||
override int getInputParameterIndex() { result = 0 }
|
||||
@@ -66,8 +83,12 @@ class Sscanf extends ScanfFunction instanceof TopLevelFunction {
|
||||
Sscanf() {
|
||||
this.hasGlobalOrStdOrBslName("sscanf") or // sscanf(src_stream, format, args...)
|
||||
this.hasGlobalOrStdOrBslName("swscanf") or // swscanf(src, format, args...)
|
||||
this.hasGlobalOrStdOrBslName("sscanf_s") or // sscanf_s(src, format, args...)
|
||||
this.hasGlobalOrStdOrBslName("swscanf_s") or // swscanf_s(src, format, args...)
|
||||
this.hasGlobalName("_sscanf_l") or // _sscanf_l(src, format, locale, args...)
|
||||
this.hasGlobalName("_swscanf_l")
|
||||
this.hasGlobalName("_swscanf_l") or // _swscanf_l(src, format, locale, args...)
|
||||
this.hasGlobalName("_sscanf_s_l") or // _sscanf_s_l(src, format, locale, args...)
|
||||
this.hasGlobalName("_swscanf_s_l") // _swscanf_s_l(src, format, locale, args...)
|
||||
}
|
||||
|
||||
override int getInputParameterIndex() { result = 0 }
|
||||
@@ -97,6 +118,14 @@ class Snscanf extends ScanfFunction instanceof TopLevelFunction {
|
||||
int getInputLengthParameterIndex() { result = 1 }
|
||||
}
|
||||
|
||||
private predicate isCharLike(Type t) { t instanceof CharType or t instanceof Wchar_t }
|
||||
|
||||
private predicate isStringLike(Type t) {
|
||||
isCharLike(t.(PointerType).getBaseType())
|
||||
or
|
||||
isCharLike(t.(ArrayType).getBaseType())
|
||||
}
|
||||
|
||||
/**
|
||||
* A call to one of the `scanf` functions.
|
||||
*/
|
||||
@@ -130,14 +159,40 @@ class ScanfFunctionCall extends FunctionCall {
|
||||
*/
|
||||
predicate isWideCharDefault() { this.getScanfFunction().isWideCharDefault() }
|
||||
|
||||
bindingset[this, k]
|
||||
pragma[inline_late]
|
||||
private predicate isSizeArgument(int k) {
|
||||
// The first vararg is never the size argument since a size argument must
|
||||
// always follow a string buffer argument.
|
||||
k > 0 and
|
||||
isStringLike(this.getArgument(this.getScanfFunction().getNumberOfParameters() + k - 1)
|
||||
.getUnspecifiedType())
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the output argument at position `n` in the vararg list of this call.
|
||||
*
|
||||
* The range of `n` is from `0` to `this.getNumberOfOutputArguments() - 1`.
|
||||
*/
|
||||
Expr getOutputArgument(int n) {
|
||||
result = this.getArgument(this.getTarget().getNumberOfParameters() + n) and
|
||||
n >= 0
|
||||
exists(ScanfFunction target | target = this.getScanfFunction() |
|
||||
// If this is an S variant then every string buffer argument has a
|
||||
// corresponding size argument immediately following it, so we need to
|
||||
// skip over those size arguments when counting the output arguments.
|
||||
if target.isSVariant()
|
||||
then
|
||||
result =
|
||||
rank[n + 1](Expr arg, int k |
|
||||
k >= 0 and
|
||||
arg = this.getArgument(target.getNumberOfParameters() + k) and
|
||||
not this.isSizeArgument(k)
|
||||
|
|
||||
arg order by k
|
||||
)
|
||||
else (
|
||||
n >= 0 and result = this.getArgument(target.getNumberOfParameters() + n)
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -30,7 +30,10 @@ abstract private class ScanfFunctionModel extends ArrayFunction, TaintFunction,
|
||||
(
|
||||
if exists(this.getLengthParameterIndex())
|
||||
then result = this.getLengthParameterIndex() + 2
|
||||
else result = 2
|
||||
else
|
||||
if exists(this.(ScanfFunction).getInputParameterIndex())
|
||||
then result = 2
|
||||
else result = 1
|
||||
)
|
||||
}
|
||||
|
||||
@@ -69,13 +72,24 @@ abstract private class ScanfFunctionModel extends ArrayFunction, TaintFunction,
|
||||
}
|
||||
}
|
||||
|
||||
private predicate hasFlowSource(
|
||||
ScanfFunction func, ScanfFunctionCall call, FunctionOutput output, string description
|
||||
) {
|
||||
exists(int n, Expr arg |
|
||||
call.getScanfFunction() = func and
|
||||
call.getOutputArgument(_) = arg and
|
||||
call.getArgument(n) = arg and
|
||||
output.isParameterDeref(n) and
|
||||
description = "value read by " + func.getName()
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* The standard function `scanf` and its assorted variants
|
||||
*/
|
||||
private class ScanfModel extends ScanfFunctionModel, LocalFlowSourceFunction instanceof Scanf {
|
||||
override predicate hasLocalFlowSource(FunctionOutput output, string description) {
|
||||
output.isParameterDeref(any(int i | i >= this.getArgsStartPosition())) and
|
||||
description = "value read by " + this.getName()
|
||||
override predicate hasLocalFlowSource(Call call, FunctionOutput output, string description) {
|
||||
hasFlowSource(this, call, output, description)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -83,9 +97,8 @@ private class ScanfModel extends ScanfFunctionModel, LocalFlowSourceFunction ins
|
||||
* The standard function `fscanf` and its assorted variants
|
||||
*/
|
||||
private class FscanfModel extends ScanfFunctionModel, RemoteFlowSourceFunction instanceof Fscanf {
|
||||
override predicate hasRemoteFlowSource(FunctionOutput output, string description) {
|
||||
output.isParameterDeref(any(int i | i >= this.getArgsStartPosition())) and
|
||||
description = "value read by " + this.getName()
|
||||
override predicate hasRemoteFlowSource(Call call, FunctionOutput output, string description) {
|
||||
hasFlowSource(this, call, output, description)
|
||||
}
|
||||
|
||||
override predicate hasSocketInput(FunctionInput input) {
|
||||
|
||||
@@ -18,7 +18,17 @@ abstract class RemoteFlowSourceFunction extends Function {
|
||||
/**
|
||||
* Holds if remote data described by `description` flows from `output` of a call to this function.
|
||||
*/
|
||||
abstract predicate hasRemoteFlowSource(FunctionOutput output, string description);
|
||||
predicate hasRemoteFlowSource(FunctionOutput output, string description) {
|
||||
this.hasRemoteFlowSource(_, output, description)
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if remote data described by `description` flows from `output` of `call` to this function.
|
||||
*/
|
||||
predicate hasRemoteFlowSource(Call call, FunctionOutput output, string description) {
|
||||
call.getTarget() = this and
|
||||
this.hasRemoteFlowSource(output, description)
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if remote data from this source comes from a socket or stream
|
||||
@@ -35,7 +45,17 @@ abstract class LocalFlowSourceFunction extends Function {
|
||||
/**
|
||||
* Holds if data described by `description` flows from `output` of a call to this function.
|
||||
*/
|
||||
abstract predicate hasLocalFlowSource(FunctionOutput output, string description);
|
||||
predicate hasLocalFlowSource(FunctionOutput output, string description) {
|
||||
this.hasLocalFlowSource(_, output, description)
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if data described by `description` flows from `output` of `call` to this function.
|
||||
*/
|
||||
predicate hasLocalFlowSource(Call call, FunctionOutput output, string description) {
|
||||
call.getTarget() = this and
|
||||
this.hasLocalFlowSource(output, description)
|
||||
}
|
||||
}
|
||||
|
||||
/** A library function that sends data over a network connection. */
|
||||
|
||||
@@ -28,8 +28,7 @@ private class RemoteModelSource extends RemoteFlowSource {
|
||||
|
||||
RemoteModelSource() {
|
||||
exists(CallInstruction call, RemoteFlowSourceFunction func, FunctionOutput output |
|
||||
call.getStaticCallTarget() = func and
|
||||
func.hasRemoteFlowSource(output, sourceType) and
|
||||
func.hasRemoteFlowSource(call.getConvertedResultExpression(), output, sourceType) and
|
||||
this = callOutput(call, output)
|
||||
)
|
||||
}
|
||||
@@ -46,7 +45,7 @@ private class LocalModelSource extends LocalFlowSource {
|
||||
LocalModelSource() {
|
||||
exists(CallInstruction call, LocalFlowSourceFunction func, FunctionOutput output |
|
||||
call.getStaticCallTarget() = func and
|
||||
func.hasLocalFlowSource(output, sourceType) and
|
||||
func.hasLocalFlowSource(call.getConvertedResultExpression(), output, sourceType) and
|
||||
this = callOutput(call, output)
|
||||
)
|
||||
}
|
||||
|
||||
@@ -912,6 +912,10 @@ class_template_argument_value(
|
||||
int index: int ref,
|
||||
int arg_value: @expr ref
|
||||
);
|
||||
class_template_generated_from(
|
||||
unique int template: @usertype ref,
|
||||
int from: @usertype ref
|
||||
)
|
||||
|
||||
@user_or_decltype = @usertype | @decltype;
|
||||
|
||||
@@ -943,6 +947,10 @@ function_template_argument_value(
|
||||
int index: int ref,
|
||||
int arg_value: @expr ref
|
||||
);
|
||||
function_template_generated_from(
|
||||
unique int template: @function ref,
|
||||
int from: @function ref
|
||||
);
|
||||
|
||||
is_variable_template(unique int id: @variable ref);
|
||||
variable_instantiation(
|
||||
@@ -959,6 +967,10 @@ variable_template_argument_value(
|
||||
int index: int ref,
|
||||
int arg_value: @expr ref
|
||||
);
|
||||
variable_template_generated_from(
|
||||
unique int template: @variable ref,
|
||||
int from: @variable ref
|
||||
);
|
||||
|
||||
is_alias_template(unique int id: @usertype ref);
|
||||
alias_instantiation(
|
||||
@@ -966,15 +978,19 @@ alias_instantiation(
|
||||
int from: @usertype ref
|
||||
);
|
||||
alias_template_argument(
|
||||
int variable_id: @usertype ref,
|
||||
int type_id: @usertype ref,
|
||||
int index: int ref,
|
||||
int arg_type: @type ref
|
||||
);
|
||||
alias_template_argument_value(
|
||||
int variable_id: @usertype ref,
|
||||
int type_id: @usertype ref,
|
||||
int index: int ref,
|
||||
int arg_value: @expr ref
|
||||
);
|
||||
alias_template_generated_from(
|
||||
unique int template: @usertype ref,
|
||||
int from: @usertype ref
|
||||
);
|
||||
|
||||
template_template_instantiation(
|
||||
int to: @usertype ref,
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,2 @@
|
||||
description: Capture information about one template being generated from another
|
||||
compatibility: backwards
|
||||
@@ -1,3 +1,9 @@
|
||||
## 1.6.3
|
||||
|
||||
### Minor Analysis Improvements
|
||||
|
||||
* The 'Cleartext transmission of sensitive information' query (`cpp/cleartext-transmission`) no longer raises an alert on calls to `fscanf` (and variants) when the call reads from an "obviously local" `FILE` stream such as `stdin`.
|
||||
|
||||
## 1.6.2
|
||||
|
||||
No user-facing changes.
|
||||
|
||||
@@ -44,10 +44,7 @@ class ExternalApiDataNode extends DataFlow::Node {
|
||||
/** A configuration for tracking flow from `RemoteFlowSource`s to `ExternalApiDataNode`s. */
|
||||
private module UntrustedDataToExternalApiConfig implements DataFlow::ConfigSig {
|
||||
predicate isSource(DataFlow::Node source) {
|
||||
exists(RemoteFlowSourceFunction remoteFlow |
|
||||
remoteFlow = source.asExpr().(Call).getTarget() and
|
||||
remoteFlow.hasRemoteFlowSource(_, _)
|
||||
)
|
||||
any(RemoteFlowSourceFunction remoteFlow).hasRemoteFlowSource(source.asExpr(), _, _)
|
||||
}
|
||||
|
||||
predicate isSink(DataFlow::Node sink) { sink instanceof ExternalApiDataNode }
|
||||
|
||||
@@ -94,9 +94,8 @@ class Recv extends SendRecv instanceof RemoteFlowSourceFunction {
|
||||
}
|
||||
|
||||
override Expr getDataExpr(Call call) {
|
||||
call.getTarget() = this and
|
||||
exists(FunctionOutput output, int arg |
|
||||
super.hasRemoteFlowSource(output, _) and
|
||||
super.hasRemoteFlowSource(call, output, _) and
|
||||
output.isParameterDeref(arg) and
|
||||
result = call.getArgument(arg)
|
||||
)
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
---
|
||||
category: minorAnalysis
|
||||
---
|
||||
* The 'Cleartext transmission of sensitive information' query (`cpp/cleartext-transmission`) no longer raises an alert on calls to `fscanf` (and variants) when the call reads from an "obviously local" `FILE` stream such as `stdin`.
|
||||
## 1.6.3
|
||||
|
||||
### Minor Analysis Improvements
|
||||
|
||||
* The 'Cleartext transmission of sensitive information' query (`cpp/cleartext-transmission`) no longer raises an alert on calls to `fscanf` (and variants) when the call reads from an "obviously local" `FILE` stream such as `stdin`.
|
||||
@@ -1,2 +1,2 @@
|
||||
---
|
||||
lastReleaseVersion: 1.6.2
|
||||
lastReleaseVersion: 1.6.3
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
name: codeql/cpp-queries
|
||||
version: 1.6.3-dev
|
||||
version: 1.6.4-dev
|
||||
groups:
|
||||
- cpp
|
||||
- queries
|
||||
|
||||
@@ -131,3 +131,112 @@ void test_strsafe_gets() {
|
||||
StringCchGetsExA(dest, sizeof(dest), &end, &remaining, 0); // $ local_source
|
||||
}
|
||||
}
|
||||
|
||||
int scanf_s(const char *format, ...);
|
||||
int fscanf_s(FILE *stream, const char *format, ...);
|
||||
|
||||
void test_scanf_s(FILE *stream) {
|
||||
{
|
||||
int n1, n2;
|
||||
scanf_s(
|
||||
"%d %d",
|
||||
&n1, // $ local_source
|
||||
&n2); // $ local_source
|
||||
}
|
||||
|
||||
{
|
||||
int n;
|
||||
fscanf_s(stream, "%d", &n); // $ remote_source
|
||||
}
|
||||
|
||||
{
|
||||
int n1, n2;
|
||||
char buf[256];
|
||||
scanf_s("%d %s %d",
|
||||
&n1, // $ local_source
|
||||
buf, // $ local_source
|
||||
256,
|
||||
&n2); // $ local_source
|
||||
}
|
||||
|
||||
{
|
||||
int n1, n2;
|
||||
char buf[256];
|
||||
fscanf_s(stream, "%d %s %d",
|
||||
&n1, // $ remote_source
|
||||
buf, // $ remote_source
|
||||
256,
|
||||
&n2); // $ remote_source
|
||||
}
|
||||
}
|
||||
|
||||
typedef void *locale_t;
|
||||
|
||||
int wscanf_s(const wchar_t *format, ...);
|
||||
int _scanf_s_l(const char *format, locale_t locale, ...);
|
||||
int _wscanf_s_l(const wchar_t *format, locale_t locale, ...);
|
||||
int fwscanf_s(FILE *stream, const wchar_t *format, ...);
|
||||
int _fscanf_s_l(FILE *stream, const char *format, locale_t locale, ...);
|
||||
int _fwscanf_s_l(FILE *stream, const wchar_t *format, locale_t locale, ...);
|
||||
|
||||
void test_additional_scanf_s_variants(FILE *stream, locale_t locale) {
|
||||
{
|
||||
int n1, n2;
|
||||
wchar_t buf[256];
|
||||
wscanf_s(L"%d %s %d",
|
||||
&n1, // $ local_source
|
||||
buf, // $ local_source
|
||||
256,
|
||||
&n2); // $ local_source
|
||||
}
|
||||
|
||||
{
|
||||
int n1, n2;
|
||||
char buf[256];
|
||||
_scanf_s_l("%d %s %d", locale,
|
||||
&n1, // $ local_source
|
||||
buf, // $ local_source
|
||||
256,
|
||||
&n2); // $ local_source
|
||||
}
|
||||
|
||||
{
|
||||
int n1, n2;
|
||||
wchar_t buf[256];
|
||||
_wscanf_s_l(L"%d %s %d", locale,
|
||||
&n1, // $ local_source
|
||||
buf, // $ local_source
|
||||
256,
|
||||
&n2); // $ local_source
|
||||
}
|
||||
|
||||
{
|
||||
int n1, n2;
|
||||
wchar_t buf[256];
|
||||
fwscanf_s(stream, L"%d %s %d",
|
||||
&n1, // $ remote_source
|
||||
buf, // $ remote_source
|
||||
256,
|
||||
&n2); // $ remote_source
|
||||
}
|
||||
|
||||
{
|
||||
int n1, n2;
|
||||
char buf[256];
|
||||
_fscanf_s_l(stream, "%d %s %d", locale,
|
||||
&n1, // $ remote_source
|
||||
buf, // $ remote_source
|
||||
256,
|
||||
&n2); // $ remote_source
|
||||
}
|
||||
|
||||
{
|
||||
int n1, n2;
|
||||
wchar_t buf[256];
|
||||
_fwscanf_s_l(stream, L"%d %s %d", locale,
|
||||
&n1, // $ remote_source
|
||||
buf, // $ remote_source
|
||||
256,
|
||||
&n2); // $ remote_source
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
| test.c:18:2:18:6 | call to scanf | 0 | s | 0 | 0 |
|
||||
| test.c:19:2:19:7 | call to fscanf | 0 | s | 10 | 10 |
|
||||
| test.c:19:2:19:7 | call to fscanf | 1 | i | 0 | 0 |
|
||||
| test.c:20:2:20:7 | call to sscanf | 0 | s | 0 | 0 |
|
||||
| test.c:21:2:21:8 | call to swscanf | 0 | s | 10 | 10 |
|
||||
| test.c:19:2:19:6 | call to scanf | 0 | s | 0 | 0 |
|
||||
| test.c:20:2:20:7 | call to fscanf | 0 | s | 10 | 10 |
|
||||
| test.c:20:2:20:7 | call to fscanf | 1 | i | 0 | 0 |
|
||||
| test.c:21:2:21:7 | call to sscanf | 0 | s | 0 | 0 |
|
||||
| test.c:22:2:22:8 | call to swscanf | 0 | s | 10 | 10 |
|
||||
| test.c:23:2:23:8 | call to scanf_s | 0 | d | 0 | 0 |
|
||||
| test.c:23:2:23:8 | call to scanf_s | 1 | s | 0 | 0 |
|
||||
| test.c:23:2:23:8 | call to scanf_s | 2 | d | 0 | 0 |
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
| ms.cpp:17:3:17:8 | call to sscanf | 0 | 1 | ms.cpp:17:24:17:30 | %I64i | non-wide |
|
||||
| test.c:18:2:18:6 | call to scanf | 0 | 0 | test.c:18:8:18:11 | %s | non-wide |
|
||||
| test.c:19:2:19:7 | call to fscanf | 0 | 1 | test.c:19:15:19:23 | %10s %i | non-wide |
|
||||
| test.c:20:2:20:7 | call to sscanf | 0 | 1 | test.c:20:19:20:28 | %*i%s%*s | non-wide |
|
||||
| test.c:21:2:21:8 | call to swscanf | 0 | 1 | test.c:21:21:21:26 | %10s | wide |
|
||||
| test.c:19:2:19:6 | call to scanf | 0 | 0 | test.c:19:8:19:11 | %s | non-wide |
|
||||
| test.c:20:2:20:7 | call to fscanf | 0 | 1 | test.c:20:15:20:23 | %10s %i | non-wide |
|
||||
| test.c:21:2:21:7 | call to sscanf | 0 | 1 | test.c:21:19:21:28 | %*i%s%*s | non-wide |
|
||||
| test.c:22:2:22:8 | call to swscanf | 0 | 1 | test.c:22:21:22:26 | %10s | wide |
|
||||
| test.c:23:2:23:8 | call to scanf_s | 0 | 0 | test.c:23:10:23:19 | %d %s %d | non-wide |
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
| ms.cpp:17:3:17:8 | call to sscanf | ms.cpp:17:33:17:36 | & ... | 0 |
|
||||
| test.c:19:2:19:6 | call to scanf | test.c:19:14:19:19 | buffer | 0 |
|
||||
| test.c:20:2:20:7 | call to fscanf | test.c:20:26:20:31 | buffer | 0 |
|
||||
| test.c:20:2:20:7 | call to fscanf | test.c:20:34:20:34 | i | 1 |
|
||||
| test.c:21:2:21:7 | call to sscanf | test.c:21:31:21:36 | buffer | 0 |
|
||||
| test.c:22:2:22:8 | call to swscanf | test.c:22:29:22:35 | wbuffer | 0 |
|
||||
| test.c:23:2:23:8 | call to scanf_s | test.c:23:22:23:23 | & ... | 0 |
|
||||
| test.c:23:2:23:8 | call to scanf_s | test.c:23:26:23:31 | buffer | 1 |
|
||||
| test.c:23:2:23:8 | call to scanf_s | test.c:23:38:23:40 | & ... | 2 |
|
||||
@@ -0,0 +1,5 @@
|
||||
import semmle.code.cpp.commons.Scanf
|
||||
|
||||
from ScanfFunctionCall sfc, Expr e, int n
|
||||
where e = sfc.getOutputArgument(n)
|
||||
select sfc, e, n
|
||||
@@ -7,18 +7,20 @@ int scanf(const char *format, ...);
|
||||
int fscanf(FILE *stream, const char *format, ...);
|
||||
int sscanf(const char *s, const char *format, ...);
|
||||
int swscanf(const wchar_t* ws, const wchar_t* format, ...);
|
||||
int scanf_s(const char *format, ...);
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
char buffer[256];
|
||||
wchar_t wbuffer[256];
|
||||
FILE *file;
|
||||
int i;
|
||||
int i, i2;
|
||||
|
||||
scanf("%s", buffer);
|
||||
fscanf(file, "%10s %i", buffer, i);
|
||||
sscanf("Hello.", "%*i%s%*s", buffer);
|
||||
swscanf(L"Hello.", "%10s", wbuffer);
|
||||
scanf_s("%d %s %d", &i, buffer, 10, &i2);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -32,9 +32,13 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
{
|
||||
var assembly = Assembly.CreateOutputAssembly(Context);
|
||||
|
||||
trapFile.compilations(this, FileUtils.ConvertToUnix(cwd));
|
||||
var path = Context.ExtractionContext.PathTransformer.Transform(cwd);
|
||||
trapFile.compilations(this, path.Value);
|
||||
trapFile.compilation_assembly(this, assembly);
|
||||
|
||||
// Ensure that a `Folder` entity exists
|
||||
Folder.Create(Context, path);
|
||||
|
||||
// Arguments
|
||||
var expandedIndex = 0;
|
||||
for (var i = 0; i < args.Length; i++)
|
||||
|
||||
@@ -58,10 +58,10 @@ namespace Semmle.Extraction.CSharp.Entities.Expressions
|
||||
return Invocation.Create(info);
|
||||
|
||||
case SyntaxKind.PostIncrementExpression:
|
||||
return PostfixUnary.Create(info.SetKind(ExprKind.POST_INCR), ((PostfixUnaryExpressionSyntax)info.Node).Operand);
|
||||
return PostfixUnary.Create(info.SetKind(ExprKind.POST_INCR));
|
||||
|
||||
case SyntaxKind.PostDecrementExpression:
|
||||
return PostfixUnary.Create(info.SetKind(ExprKind.POST_DECR), ((PostfixUnaryExpressionSyntax)info.Node).Operand);
|
||||
return PostfixUnary.Create(info.SetKind(ExprKind.POST_DECR));
|
||||
|
||||
case SyntaxKind.AwaitExpression:
|
||||
return Await.Create(info);
|
||||
@@ -109,10 +109,10 @@ namespace Semmle.Extraction.CSharp.Entities.Expressions
|
||||
return MemberAccess.Create(info, (MemberAccessExpressionSyntax)info.Node);
|
||||
|
||||
case SyntaxKind.UnaryMinusExpression:
|
||||
return Unary.Create(info.SetKind(ExprKind.MINUS));
|
||||
return PrefixUnary.Create(info.SetKind(ExprKind.MINUS));
|
||||
|
||||
case SyntaxKind.UnaryPlusExpression:
|
||||
return Unary.Create(info.SetKind(ExprKind.PLUS));
|
||||
return PrefixUnary.Create(info.SetKind(ExprKind.PLUS));
|
||||
|
||||
case SyntaxKind.SimpleLambdaExpression:
|
||||
return Lambda.Create(info, (SimpleLambdaExpressionSyntax)info.Node);
|
||||
@@ -146,16 +146,16 @@ namespace Semmle.Extraction.CSharp.Entities.Expressions
|
||||
return Name.Create(info);
|
||||
|
||||
case SyntaxKind.LogicalNotExpression:
|
||||
return Unary.Create(info.SetKind(ExprKind.LOG_NOT));
|
||||
return PrefixUnary.Create(info.SetKind(ExprKind.LOG_NOT));
|
||||
|
||||
case SyntaxKind.BitwiseNotExpression:
|
||||
return Unary.Create(info.SetKind(ExprKind.BIT_NOT));
|
||||
return PrefixUnary.Create(info.SetKind(ExprKind.BIT_NOT));
|
||||
|
||||
case SyntaxKind.PreIncrementExpression:
|
||||
return Unary.Create(info.SetKind(ExprKind.PRE_INCR));
|
||||
return PrefixUnary.Create(info.SetKind(ExprKind.PRE_INCR));
|
||||
|
||||
case SyntaxKind.PreDecrementExpression:
|
||||
return Unary.Create(info.SetKind(ExprKind.PRE_DECR));
|
||||
return PrefixUnary.Create(info.SetKind(ExprKind.PRE_DECR));
|
||||
|
||||
case SyntaxKind.ThisExpression:
|
||||
return This.CreateExplicit(info);
|
||||
@@ -164,10 +164,10 @@ namespace Semmle.Extraction.CSharp.Entities.Expressions
|
||||
return PropertyFieldAccess.Create(info);
|
||||
|
||||
case SyntaxKind.AddressOfExpression:
|
||||
return Unary.Create(info.SetKind(ExprKind.ADDRESS_OF));
|
||||
return PrefixUnary.Create(info.SetKind(ExprKind.ADDRESS_OF));
|
||||
|
||||
case SyntaxKind.PointerIndirectionExpression:
|
||||
return Unary.Create(info.SetKind(ExprKind.POINTER_INDIRECTION));
|
||||
return PrefixUnary.Create(info.SetKind(ExprKind.POINTER_INDIRECTION));
|
||||
|
||||
case SyntaxKind.DefaultExpression:
|
||||
return Default.Create(info);
|
||||
@@ -248,13 +248,13 @@ namespace Semmle.Extraction.CSharp.Entities.Expressions
|
||||
return RangeExpression.Create(info);
|
||||
|
||||
case SyntaxKind.IndexExpression:
|
||||
return Unary.Create(info.SetKind(ExprKind.INDEX));
|
||||
return PrefixUnary.Create(info.SetKind(ExprKind.INDEX));
|
||||
|
||||
case SyntaxKind.SwitchExpression:
|
||||
return Switch.Create(info);
|
||||
|
||||
case SyntaxKind.SuppressNullableWarningExpression:
|
||||
return PostfixUnary.Create(info.SetKind(ExprKind.SUPPRESS_NULLABLE_WARNING), ((PostfixUnaryExpressionSyntax)info.Node).Operand);
|
||||
return PostfixUnary.Create(info.SetKind(ExprKind.SUPPRESS_NULLABLE_WARNING));
|
||||
|
||||
case SyntaxKind.WithExpression:
|
||||
return WithExpression.Create(info);
|
||||
|
||||
@@ -4,29 +4,30 @@ using Semmle.Extraction.Kinds;
|
||||
|
||||
namespace Semmle.Extraction.CSharp.Entities.Expressions
|
||||
{
|
||||
internal class PostfixUnary : Expression<ExpressionSyntax>
|
||||
internal class PostfixUnary : Expression<PostfixUnaryExpressionSyntax>
|
||||
{
|
||||
private PostfixUnary(ExpressionNodeInfo info, ExprKind kind, ExpressionSyntax operand)
|
||||
private PostfixUnary(ExpressionNodeInfo info, ExprKind kind)
|
||||
: base(info.SetKind(UnaryOperatorKind(info.Context, kind, info.Node)))
|
||||
{
|
||||
this.operand = operand;
|
||||
operatorKind = kind;
|
||||
}
|
||||
|
||||
private readonly ExpressionSyntax operand;
|
||||
private readonly ExprKind operatorKind;
|
||||
|
||||
public static Expression Create(ExpressionNodeInfo info, ExpressionSyntax operand) => new PostfixUnary(info, info.Kind, operand).TryPopulate();
|
||||
public static Expression Create(ExpressionNodeInfo info) => new PostfixUnary(info, info.Kind).TryPopulate();
|
||||
|
||||
protected override void PopulateExpression(TextWriter trapFile)
|
||||
{
|
||||
Create(Context, operand, this, 0);
|
||||
Create(Context, Syntax.Operand, this, 0);
|
||||
|
||||
if ((operatorKind == ExprKind.POST_INCR || operatorKind == ExprKind.POST_DECR) &&
|
||||
Kind == ExprKind.OPERATOR_INVOCATION)
|
||||
if (Kind == ExprKind.OPERATOR_INVOCATION)
|
||||
{
|
||||
AddOperatorCall(trapFile, Syntax);
|
||||
trapFile.mutator_invocation_mode(this, 2);
|
||||
|
||||
if (operatorKind == ExprKind.POST_INCR || operatorKind == ExprKind.POST_DECR)
|
||||
{
|
||||
trapFile.mutator_invocation_mode(this, 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
using System.IO;
|
||||
using Microsoft.CodeAnalysis.CSharp.Syntax;
|
||||
using Semmle.Extraction.Kinds;
|
||||
|
||||
namespace Semmle.Extraction.CSharp.Entities.Expressions
|
||||
{
|
||||
internal class PrefixUnary : Expression<PrefixUnaryExpressionSyntax>
|
||||
{
|
||||
private PrefixUnary(ExpressionNodeInfo info, ExprKind kind)
|
||||
: base(info.SetKind(UnaryOperatorKind(info.Context, info.Kind, info.Node)))
|
||||
{
|
||||
operatorKind = kind;
|
||||
}
|
||||
|
||||
private readonly ExprKind operatorKind;
|
||||
|
||||
public static Expression Create(ExpressionNodeInfo info) => new PrefixUnary(info, info.Kind).TryPopulate();
|
||||
|
||||
protected override void PopulateExpression(TextWriter trapFile)
|
||||
{
|
||||
Create(Context, Syntax.Operand, this, 0);
|
||||
|
||||
if (Kind == ExprKind.OPERATOR_INVOCATION)
|
||||
{
|
||||
AddOperatorCall(trapFile, Syntax);
|
||||
|
||||
if (operatorKind == ExprKind.PRE_INCR || operatorKind == ExprKind.PRE_DECR)
|
||||
{
|
||||
trapFile.mutator_invocation_mode(this, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,36 +0,0 @@
|
||||
using System.IO;
|
||||
using Microsoft.CodeAnalysis.CSharp.Syntax;
|
||||
using Semmle.Extraction.Kinds;
|
||||
|
||||
namespace Semmle.Extraction.CSharp.Entities.Expressions
|
||||
{
|
||||
internal class Unary : Expression<PrefixUnaryExpressionSyntax>
|
||||
{
|
||||
private Unary(ExpressionNodeInfo info, ExprKind kind)
|
||||
: base(info.SetKind(UnaryOperatorKind(info.Context, info.Kind, info.Node)))
|
||||
{
|
||||
operatorKind = kind;
|
||||
}
|
||||
|
||||
private readonly ExprKind operatorKind;
|
||||
|
||||
public static Unary Create(ExpressionNodeInfo info)
|
||||
{
|
||||
var ret = new Unary(info, info.Kind);
|
||||
ret.TryPopulate();
|
||||
return ret;
|
||||
}
|
||||
|
||||
protected override void PopulateExpression(TextWriter trapFile)
|
||||
{
|
||||
Create(Context, Syntax.Operand, this, 0);
|
||||
AddOperatorCall(trapFile, Syntax);
|
||||
|
||||
if ((operatorKind == ExprKind.PRE_INCR || operatorKind == ExprKind.PRE_DECR) &&
|
||||
Kind == ExprKind.OPERATOR_INVOCATION)
|
||||
{
|
||||
trapFile.mutator_invocation_mode(this, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,3 +1,7 @@
|
||||
## 1.7.67
|
||||
|
||||
No user-facing changes.
|
||||
|
||||
## 1.7.66
|
||||
|
||||
No user-facing changes.
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
## 1.7.67
|
||||
|
||||
No user-facing changes.
|
||||
@@ -1,2 +1,2 @@
|
||||
---
|
||||
lastReleaseVersion: 1.7.66
|
||||
lastReleaseVersion: 1.7.67
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
name: codeql/csharp-solorigate-all
|
||||
version: 1.7.67-dev
|
||||
version: 1.7.68-dev
|
||||
groups:
|
||||
- csharp
|
||||
- solorigate
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
## 1.7.67
|
||||
|
||||
No user-facing changes.
|
||||
|
||||
## 1.7.66
|
||||
|
||||
No user-facing changes.
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
## 1.7.67
|
||||
|
||||
No user-facing changes.
|
||||
@@ -1,2 +1,2 @@
|
||||
---
|
||||
lastReleaseVersion: 1.7.66
|
||||
lastReleaseVersion: 1.7.67
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
name: codeql/csharp-solorigate-queries
|
||||
version: 1.7.67-dev
|
||||
version: 1.7.68-dev
|
||||
groups:
|
||||
- csharp
|
||||
- solorigate
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
## 6.0.1
|
||||
|
||||
No user-facing changes.
|
||||
|
||||
## 6.0.0
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
---
|
||||
category: minorAnalysis
|
||||
---
|
||||
* Full support for C# 14 / .NET 10. All new language features are now supported by the extractor. The QL library and data flow analysis now support the new C# 14 language constructs and include generated Models as Data (MaD) models for the .NET 10 runtime.
|
||||
3
csharp/ql/lib/change-notes/released/6.0.1.md
Normal file
3
csharp/ql/lib/change-notes/released/6.0.1.md
Normal file
@@ -0,0 +1,3 @@
|
||||
## 6.0.1
|
||||
|
||||
No user-facing changes.
|
||||
@@ -1,2 +1,2 @@
|
||||
---
|
||||
lastReleaseVersion: 6.0.0
|
||||
lastReleaseVersion: 6.0.1
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
name: codeql/csharp-all
|
||||
version: 6.0.1-dev
|
||||
version: 6.0.2-dev
|
||||
groups: csharp
|
||||
dbscheme: semmlecode.csharp.dbscheme
|
||||
extractor: csharp
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
## 1.7.3
|
||||
|
||||
No user-facing changes.
|
||||
|
||||
## 1.7.2
|
||||
|
||||
No user-facing changes.
|
||||
|
||||
3
csharp/ql/src/change-notes/released/1.7.3.md
Normal file
3
csharp/ql/src/change-notes/released/1.7.3.md
Normal file
@@ -0,0 +1,3 @@
|
||||
## 1.7.3
|
||||
|
||||
No user-facing changes.
|
||||
@@ -1,2 +1,2 @@
|
||||
---
|
||||
lastReleaseVersion: 1.7.2
|
||||
lastReleaseVersion: 1.7.3
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
name: codeql/csharp-queries
|
||||
version: 1.7.3-dev
|
||||
version: 1.7.4-dev
|
||||
groups:
|
||||
- csharp
|
||||
- queries
|
||||
|
||||
@@ -0,0 +1,88 @@
|
||||
.. _codeql-cli-2.25.5:
|
||||
|
||||
==========================
|
||||
CodeQL 2.25.5 (2026-05-21)
|
||||
==========================
|
||||
|
||||
.. contents:: Contents
|
||||
:depth: 2
|
||||
:local:
|
||||
:backlinks: none
|
||||
|
||||
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 <https://github.blog/tag/code-scanning/>`__, `relevant GitHub Changelog updates <https://github.blog/changelog/label/application-security/>`__, `changes in the CodeQL extension for Visual Studio Code <https://marketplace.visualstudio.com/items/GitHub.vscode-codeql/changelog>`__, and the `CodeQL Action changelog <https://github.com/github/codeql-action/blob/main/CHANGELOG.md>`__.
|
||||
|
||||
Security Coverage
|
||||
-----------------
|
||||
|
||||
CodeQL 2.25.5 runs a total of 496 security queries when configured with the Default suite (covering 169 CWE). The Extended suite enables an additional 131 queries (covering 32 more CWE).
|
||||
|
||||
CodeQL CLI
|
||||
----------
|
||||
|
||||
There are no user-facing CLI changes in this release.
|
||||
|
||||
Query Packs
|
||||
-----------
|
||||
|
||||
Bug Fixes
|
||||
~~~~~~~~~
|
||||
|
||||
GitHub Actions
|
||||
""""""""""""""
|
||||
|
||||
* Fixed help file descriptions for queries: :code:`actions/untrusted-checkout/critical`, :code:`actions/untrusted-checkout/high`, :code:`actions/untrusted-checkout/medium`. Previously the messages were unclear as to why and how the vulnerabilities could occur.
|
||||
|
||||
Minor Analysis Improvements
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
C/C++
|
||||
"""""
|
||||
|
||||
* The 'Cleartext transmission of sensitive information' query (:code:`cpp/cleartext-transmission`) no longer raises an alert on calls to :code:`fscanf` (and variants) when the call reads from an "obviously local" :code:`FILE` stream such as :code:`stdin`.
|
||||
|
||||
Java/Kotlin
|
||||
"""""""""""
|
||||
|
||||
* The :code:`java/zipslip` query no longer reports archive entry names that flow only to read-only path sinks such as :code:`ClassLoader.getResource`, :code:`FileInputStream`, and :code:`FileReader`. The query now restricts its sinks to the :code:`path-injection` kind and deliberately excludes the new :code:`path-injection[read]` sub-kind, matching the Zip Slip threat model of unsafe archive extraction.
|
||||
|
||||
GitHub Actions
|
||||
""""""""""""""
|
||||
|
||||
* The :code:`actions/unpinned-tag` query now analyzes composite action metadata (:code:`action.yml`\ /\ :code:`action.yaml` files) in addition to workflow files, providing more comprehensive detection of unpinned action references across the entire Actions ecosystem.
|
||||
|
||||
Query Metadata Changes
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
GitHub Actions
|
||||
""""""""""""""
|
||||
|
||||
* Adjusted the name of :code:`actions/untrusted-checkout/high` to more clearly describe which parts of the scenario are in a privileged context.
|
||||
|
||||
Language Libraries
|
||||
------------------
|
||||
|
||||
Minor Analysis Improvements
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
C/C++
|
||||
"""""
|
||||
|
||||
* The :code:`RemoteFlowSourceFunction` model for :code:`fscanf` (and variants) now implements :code:`hasSocketInput` to reflect that these functions may read from a socket.
|
||||
|
||||
Java/Kotlin
|
||||
"""""""""""
|
||||
|
||||
* Introduced a new sink kind :code:`path-injection[read]` for Models-as-Data rows that only read from a path (such as :code:`ClassLoader.getResource`, :code:`FileInputStream`, :code:`FileReader`, :code:`Files.readAllBytes`, and related APIs). The general :code:`java/path-injection` query continues to consider both :code:`path-injection` and :code:`path-injection[read]` sinks.
|
||||
|
||||
GitHub Actions
|
||||
""""""""""""""
|
||||
|
||||
* Altered 2 patterns in the :code:`poisonable_steps` modelling. Extra sinks are detected in the following cases: scripts executed via python modules and :code:`go run` in directories are detected as potential mechanisms of injection. For the go execution pattern, the pattern is updated to now ignore flags that occur between go and the specific command. This change may lead to more results being detected by the following queries: :code:`actions/untrusted-checkout/high`, :code:`actions/untrusted-checkout/critical`, :code:`actions/untrusted-checkout-toctou/high`, :code:`actions/untrusted-checkout-toctou/critical`, :code:`actions/cache-poisoning/poisonable-step`, :code:`actions/cache-poisoning/direct-cache` and :code:`actions/artifact-poisoning/path-traversal`.
|
||||
|
||||
New Features
|
||||
~~~~~~~~~~~~
|
||||
|
||||
Swift
|
||||
"""""
|
||||
|
||||
* The :code:`TypeDecl` class now defines a :code:`getDeclaredInterfaceType` predicate, which yields the declared interface type of the type declaration.
|
||||
@@ -11,6 +11,7 @@ A list of queries for each suite and language `is available here <https://docs.g
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
codeql-cli-2.25.5
|
||||
codeql-cli-2.25.4
|
||||
codeql-cli-2.25.3
|
||||
codeql-cli-2.25.2
|
||||
|
||||
@@ -11,23 +11,23 @@
|
||||
Microsoft extensions (up to VS 2022),
|
||||
|
||||
Arm Compiler 5 [5]_","``.cpp``, ``.c++``, ``.cxx``, ``.hpp``, ``.hh``, ``.h++``, ``.hxx``, ``.c``, ``.cc``, ``.h``"
|
||||
C#,C# up to 14 [6]_,"Microsoft Visual Studio up to 2019 with .NET up to 4.8,
|
||||
C#,C# up to 14,"Microsoft Visual Studio up to 2019 with .NET up to 4.8,
|
||||
|
||||
.NET Core up to 3.1
|
||||
|
||||
.NET 5, .NET 6, .NET 7, .NET 8, .NET 9, .NET 10 [6]_","``.sln``, ``.slnx``, ``.csproj``, ``.cs``, ``.cshtml``, ``.xaml``"
|
||||
.NET 5, .NET 6, .NET 7, .NET 8, .NET 9, .NET 10","``.sln``, ``.slnx``, ``.csproj``, ``.cs``, ``.cshtml``, ``.xaml``"
|
||||
GitHub Actions,"Not applicable",Not applicable,"``.github/workflows/*.yml``, ``.github/workflows/*.yaml``, ``**/action.yml``, ``**/action.yaml``"
|
||||
Go (aka Golang), "Go up to 1.26", "Go 1.11 or more recent", ``.go``
|
||||
Java,"Java 7 to 26 [7]_","javac (OpenJDK and Oracle JDK),
|
||||
Java,"Java 7 to 26 [6]_","javac (OpenJDK and Oracle JDK),
|
||||
|
||||
Eclipse compiler for Java (ECJ) [8]_",``.java``
|
||||
Eclipse compiler for Java (ECJ) [7]_",``.java``
|
||||
Kotlin,"Kotlin 1.8.0 to 2.3.2\ *x*","kotlinc",``.kt``
|
||||
JavaScript,ECMAScript 2022 or lower,Not applicable,"``.js``, ``.jsx``, ``.mjs``, ``.es``, ``.es6``, ``.htm``, ``.html``, ``.xhtm``, ``.xhtml``, ``.vue``, ``.hbs``, ``.ejs``, ``.njk``, ``.json``, ``.yaml``, ``.yml``, ``.raml``, ``.xml`` [9]_"
|
||||
Python [10]_,"2.7, 3.5, 3.6, 3.7, 3.8, 3.9, 3.10, 3.11, 3.12, 3.13",Not applicable,``.py``
|
||||
Ruby [11]_,"up to 3.3",Not applicable,"``.rb``, ``.erb``, ``.gemspec``, ``Gemfile``"
|
||||
Rust [12]_,"Rust editions 2021 and 2024","Rust compiler","``.rs``, ``Cargo.toml``"
|
||||
Swift [13]_ [14]_,"Swift 5.4-6.3","Swift compiler","``.swift``"
|
||||
TypeScript [15]_,"2.6-5.9",Standard TypeScript compiler,"``.ts``, ``.tsx``, ``.mts``, ``.cts``"
|
||||
JavaScript,ECMAScript 2022 or lower,Not applicable,"``.js``, ``.jsx``, ``.mjs``, ``.es``, ``.es6``, ``.htm``, ``.html``, ``.xhtm``, ``.xhtml``, ``.vue``, ``.hbs``, ``.ejs``, ``.njk``, ``.json``, ``.yaml``, ``.yml``, ``.raml``, ``.xml`` [8]_"
|
||||
Python [9]_,"2.7, 3.5, 3.6, 3.7, 3.8, 3.9, 3.10, 3.11, 3.12, 3.13",Not applicable,``.py``
|
||||
Ruby [10]_,"up to 3.3",Not applicable,"``.rb``, ``.erb``, ``.gemspec``, ``Gemfile``"
|
||||
Rust [11]_,"Rust editions 2021 and 2024","Rust compiler","``.rs``, ``Cargo.toml``"
|
||||
Swift [12]_ [13]_,"Swift 5.4-6.3","Swift compiler","``.swift``"
|
||||
TypeScript [14]_,"2.6-5.9",Standard TypeScript compiler,"``.ts``, ``.tsx``, ``.mts``, ``.cts``"
|
||||
|
||||
.. container:: footnote-group
|
||||
|
||||
@@ -36,13 +36,12 @@
|
||||
.. [3] Objective-C, Objective-C++, C++/CLI, and C++/CX are not supported.
|
||||
.. [4] Support for the clang-cl compiler is preliminary.
|
||||
.. [5] Support for the Arm Compiler (armcc) is preliminary.
|
||||
.. [6] Support for .NET 10 is preliminary and code that uses language features new to C# 14 is not yet fully supported for extraction and analysis.
|
||||
.. [7] Builds that execute on Java 7 to 26 can be analyzed. The analysis understands standard language features in Java 8 to 26; "preview" and "incubator" features are not supported. Source code using Java language versions older than Java 8 are analyzed as Java 8 code.
|
||||
.. [8] ECJ is supported when the build invokes it via the Maven Compiler plugin or the Takari Lifecycle plugin.
|
||||
.. [9] JSX and Flow code, YAML, JSON, HTML, and XML files may also be analyzed with JavaScript files.
|
||||
.. [10] The extractor requires Python 3 to run. To analyze Python 2.7 you should install both versions of Python.
|
||||
.. [11] Requires glibc 2.17.
|
||||
.. [12] Requires ``rustup`` and ``cargo`` to be installed. Features from nightly toolchains are not supported.
|
||||
.. [13] Support for the analysis of Swift requires macOS.
|
||||
.. [14] Embedded Swift is not supported.
|
||||
.. [15] TypeScript analysis is performed by running the JavaScript extractor with TypeScript enabled. This is the default.
|
||||
.. [6] Builds that execute on Java 7 to 26 can be analyzed. The analysis understands standard language features in Java 8 to 26; "preview" and "incubator" features are not supported. Source code using Java language versions older than Java 8 are analyzed as Java 8 code.
|
||||
.. [7] ECJ is supported when the build invokes it via the Maven Compiler plugin or the Takari Lifecycle plugin.
|
||||
.. [8] JSX and Flow code, YAML, JSON, HTML, and XML files may also be analyzed with JavaScript files.
|
||||
.. [9] The extractor requires Python 3 to run. To analyze Python 2.7 you should install both versions of Python.
|
||||
.. [10] Requires glibc 2.17.
|
||||
.. [11] Requires ``rustup`` and ``cargo`` to be installed. Features from nightly toolchains are not supported.
|
||||
.. [12] Support for the analysis of Swift requires macOS.
|
||||
.. [13] Embedded Swift is not supported.
|
||||
.. [14] TypeScript analysis is performed by running the JavaScript extractor with TypeScript enabled. This is the default.
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
## 1.0.50
|
||||
|
||||
No user-facing changes.
|
||||
|
||||
## 1.0.49
|
||||
|
||||
No user-facing changes.
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
## 1.0.50
|
||||
|
||||
No user-facing changes.
|
||||
@@ -1,2 +1,2 @@
|
||||
---
|
||||
lastReleaseVersion: 1.0.49
|
||||
lastReleaseVersion: 1.0.50
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
name: codeql-go-consistency-queries
|
||||
version: 1.0.50-dev
|
||||
version: 1.0.51-dev
|
||||
groups:
|
||||
- go
|
||||
- queries
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
## 7.1.1
|
||||
|
||||
No user-facing changes.
|
||||
|
||||
## 7.1.0
|
||||
|
||||
### New Features
|
||||
|
||||
3
go/ql/lib/change-notes/released/7.1.1.md
Normal file
3
go/ql/lib/change-notes/released/7.1.1.md
Normal file
@@ -0,0 +1,3 @@
|
||||
## 7.1.1
|
||||
|
||||
No user-facing changes.
|
||||
@@ -1,2 +1,2 @@
|
||||
---
|
||||
lastReleaseVersion: 7.1.0
|
||||
lastReleaseVersion: 7.1.1
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
name: codeql/go-all
|
||||
version: 7.1.1-dev
|
||||
version: 7.1.2-dev
|
||||
groups: go
|
||||
dbscheme: go.dbscheme
|
||||
extractor: go
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
## 1.6.3
|
||||
|
||||
No user-facing changes.
|
||||
|
||||
## 1.6.2
|
||||
|
||||
No user-facing changes.
|
||||
|
||||
3
go/ql/src/change-notes/released/1.6.3.md
Normal file
3
go/ql/src/change-notes/released/1.6.3.md
Normal file
@@ -0,0 +1,3 @@
|
||||
## 1.6.3
|
||||
|
||||
No user-facing changes.
|
||||
@@ -1,2 +1,2 @@
|
||||
---
|
||||
lastReleaseVersion: 1.6.2
|
||||
lastReleaseVersion: 1.6.3
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
name: codeql/go-queries
|
||||
version: 1.6.3-dev
|
||||
version: 1.6.4-dev
|
||||
groups:
|
||||
- go
|
||||
- queries
|
||||
|
||||
@@ -1,3 +1,9 @@
|
||||
## 9.1.1
|
||||
|
||||
### Minor Analysis Improvements
|
||||
|
||||
* Introduced a new sink kind `path-injection[read]` for Models-as-Data rows that only read from a path (such as `ClassLoader.getResource`, `FileInputStream`, `FileReader`, `Files.readAllBytes`, and related APIs). The general `java/path-injection` query continues to consider both `path-injection` and `path-injection[read]` sinks.
|
||||
|
||||
## 9.1.0
|
||||
|
||||
### New Features
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
---
|
||||
category: minorAnalysis
|
||||
---
|
||||
## 9.1.1
|
||||
|
||||
### Minor Analysis Improvements
|
||||
|
||||
* Introduced a new sink kind `path-injection[read]` for Models-as-Data rows that only read from a path (such as `ClassLoader.getResource`, `FileInputStream`, `FileReader`, `Files.readAllBytes`, and related APIs). The general `java/path-injection` query continues to consider both `path-injection` and `path-injection[read]` sinks.
|
||||
@@ -1,2 +1,2 @@
|
||||
---
|
||||
lastReleaseVersion: 9.1.0
|
||||
lastReleaseVersion: 9.1.1
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
name: codeql/java-all
|
||||
version: 9.1.1-dev
|
||||
version: 9.1.2-dev
|
||||
groups: java
|
||||
dbscheme: config/semmlecode.dbscheme
|
||||
extractor: java
|
||||
|
||||
@@ -1,3 +1,9 @@
|
||||
## 1.11.3
|
||||
|
||||
### Minor Analysis Improvements
|
||||
|
||||
* The `java/zipslip` query no longer reports archive entry names that flow only to read-only path sinks such as `ClassLoader.getResource`, `FileInputStream`, and `FileReader`. The query now restricts its sinks to the `path-injection` kind and deliberately excludes the new `path-injection[read]` sub-kind, matching the Zip Slip threat model of unsafe archive extraction.
|
||||
|
||||
## 1.11.2
|
||||
|
||||
No user-facing changes.
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
---
|
||||
category: minorAnalysis
|
||||
---
|
||||
## 1.11.3
|
||||
|
||||
### Minor Analysis Improvements
|
||||
|
||||
* The `java/zipslip` query no longer reports archive entry names that flow only to read-only path sinks such as `ClassLoader.getResource`, `FileInputStream`, and `FileReader`. The query now restricts its sinks to the `path-injection` kind and deliberately excludes the new `path-injection[read]` sub-kind, matching the Zip Slip threat model of unsafe archive extraction.
|
||||
@@ -1,2 +1,2 @@
|
||||
---
|
||||
lastReleaseVersion: 1.11.2
|
||||
lastReleaseVersion: 1.11.3
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
name: codeql/java-queries
|
||||
version: 1.11.3-dev
|
||||
version: 1.11.4-dev
|
||||
groups:
|
||||
- java
|
||||
- queries
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
## 2.7.1
|
||||
|
||||
No user-facing changes.
|
||||
|
||||
## 2.7.0
|
||||
|
||||
### New Features
|
||||
|
||||
3
javascript/ql/lib/change-notes/released/2.7.1.md
Normal file
3
javascript/ql/lib/change-notes/released/2.7.1.md
Normal file
@@ -0,0 +1,3 @@
|
||||
## 2.7.1
|
||||
|
||||
No user-facing changes.
|
||||
@@ -1,2 +1,2 @@
|
||||
---
|
||||
lastReleaseVersion: 2.7.0
|
||||
lastReleaseVersion: 2.7.1
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
name: codeql/javascript-all
|
||||
version: 2.7.1-dev
|
||||
version: 2.7.2-dev
|
||||
groups: javascript
|
||||
dbscheme: semmlecode.javascript.dbscheme
|
||||
extractor: javascript
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
## 2.3.10
|
||||
|
||||
No user-facing changes.
|
||||
|
||||
## 2.3.9
|
||||
|
||||
No user-facing changes.
|
||||
|
||||
3
javascript/ql/src/change-notes/released/2.3.10.md
Normal file
3
javascript/ql/src/change-notes/released/2.3.10.md
Normal file
@@ -0,0 +1,3 @@
|
||||
## 2.3.10
|
||||
|
||||
No user-facing changes.
|
||||
@@ -1,2 +1,2 @@
|
||||
---
|
||||
lastReleaseVersion: 2.3.9
|
||||
lastReleaseVersion: 2.3.10
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
name: codeql/javascript-queries
|
||||
version: 2.3.10-dev
|
||||
version: 2.3.11-dev
|
||||
groups:
|
||||
- javascript
|
||||
- queries
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
## 1.0.50
|
||||
|
||||
No user-facing changes.
|
||||
|
||||
## 1.0.49
|
||||
|
||||
No user-facing changes.
|
||||
|
||||
3
misc/suite-helpers/change-notes/released/1.0.50.md
Normal file
3
misc/suite-helpers/change-notes/released/1.0.50.md
Normal file
@@ -0,0 +1,3 @@
|
||||
## 1.0.50
|
||||
|
||||
No user-facing changes.
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user