Compare commits

..

1389 Commits

Author SHA1 Message Date
Asger F
30096f3a94 Revert "JS: Add compileForOverlayEval"
This reverts commit 39f74d808b.
2025-11-04 15:11:50 +01:00
Asger F
9bed94856d Revert "JS: Recursively delete source archive so emptiness detection works"
This reverts commit 0acfacefbf.
2025-11-04 15:11:48 +01:00
Asger F
41f9208357 Revert "Actions: dont fail if no JS/TS code was found"
This reverts commit c4d23d16ed.
2025-11-04 15:11:47 +01:00
Asger F
4988b801e0 Revert "Update javascript/extractor/src/com/semmle/js/extractor/AutoBuild.java"
This reverts commit 105213df03.
2025-11-04 15:11:45 +01:00
Asger F
be2818b1f9 Revert "JS: Fix check to account for override in tests"
This reverts commit 81bb07a7ba.
2025-11-04 15:11:43 +01:00
Asger F
d297dcd9e9 Merge pull request #20752 from asgerf/actions/dont-fail-if-no-js
Actions: don't fail if no JS/TS code was found
2025-11-04 13:12:12 +01:00
Asger F
81bb07a7ba JS: Fix check to account for override in tests
The code was written on the assumption that 'seenCode' implies 'seenFiles' but the unit test override 'hasSeenCode()' to always return true. Which meant we would start taking this branch in the unit tests.
2025-11-04 11:46:02 +01:00
Geoffrey White
077bcf6b92 Merge pull request #20740 from geoffw0/rustbarriers
Rust: Add numeric type barriers for three queries
2025-11-04 10:08:46 +00:00
Asger F
105213df03 Update javascript/extractor/src/com/semmle/js/extractor/AutoBuild.java
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-11-04 09:51:56 +01:00
Asger F
c4d23d16ed Actions: dont fail if no JS/TS code was found 2025-11-04 09:37:33 +01:00
Geoffrey White
c381153125 Apply suggestions from code review
Co-authored-by: Tom Hvitved <hvitved@github.com>
2025-11-03 09:38:43 +00:00
Jeroen Ketema
d354b0c97e Merge pull request #20732 from jketema/swift-6.2-elements
Swift: Support AST elements new in Swift 6.2
2025-10-31 19:33:13 +01:00
Geoffrey White
8548c167be Rust: Autoformat. 2025-10-31 17:30:04 +00:00
Geoffrey White
34f75952d0 Rust: Change note. 2025-10-31 16:40:02 +00:00
Geoffrey White
33efed92b8 Rust: Add integral type barrier for Regex injection. 2025-10-31 16:37:10 +00:00
Geoffrey White
2d4369ac6c Rust: Add numeric type barrier for log injection. 2025-10-31 16:32:32 +00:00
Geoffrey White
52397f0ce0 Rust: Add numeric type barrier for SQL injection. 2025-10-31 16:25:44 +00:00
Geoffrey White
6433bec699 Rust: Add a test for BuiltinTypes. 2025-10-31 16:24:51 +00:00
Geoffrey White
47019f7f24 Rust: Define NumericType, IntegralType and FloatingPointType in Builtins.qll. 2025-10-31 16:24:39 +00:00
Geoffrey White
aaa3b1bcb4 Rust: Add a couple of new test cases. 2025-10-31 16:20:52 +00:00
Ian Lynagh
7ff696bd2d Merge pull request #20726 from igfoo/igfoo/ClassInstanceStack
Kotlin: Avoid infinite recursion when extracting recursive interfaces
2025-10-31 16:18:39 +00:00
Anders Schack-Mulligen
bda6513fc1 Merge pull request #20737 from aschackmull/csharp/deprecate-abstractvalue
C#: Deprecate AbstractValue.
2025-10-31 15:20:24 +01:00
Ian Lynagh
06218d8acd Kotlin: Add a test for recursive interfaces 2025-10-31 13:42:44 +00:00
Ian Lynagh
9182da1d58 Kotlin: Add a test for nested types 2025-10-31 13:42:44 +00:00
Ian Lynagh
1efecc099c Kotlin: Avoid infinite recursion when extracting recursive interfaces 2025-10-31 13:42:43 +00:00
Anders Schack-Mulligen
fa20075a4d C#: Review fix and simplification. 2025-10-31 14:41:32 +01:00
Anders Schack-Mulligen
4f6528a9fb C#: Deprecate AbstractValue. 2025-10-31 14:23:23 +01:00
Anders Schack-Mulligen
e558c0219c Merge pull request #20734 from aschackmull/csharp/tweak-nullness
C#: Allow nullness sources with SSA at entry.
2025-10-31 14:14:43 +01:00
Anders Schack-Mulligen
09378b8499 Merge pull request #20665 from aschackmull/csharp/guards-replace
C#: Replace old Guards with the new shared implementation.
2025-10-31 14:12:47 +01:00
Tom Hvitved
95e60ad4a7 Merge pull request #20705 from hvitved/rust/type-inference-unit
Rust: Infer more `()` types
2025-10-31 13:43:10 +01:00
Geoffrey White
d8fff44048 Merge pull request #20712 from geoffw0/macrometric2
Rust: Exclude skipped files in rust/diagnostic/database-quality
2025-10-31 11:25:41 +00:00
Jeroen Ketema
2a8e3bee36 Swift: Add change note 2025-10-31 12:06:52 +01:00
Jeroen Ketema
94f8ea5612 Swift: Add upgrade and downgrade scripts 2025-10-31 11:35:50 +01:00
Anders Schack-Mulligen
5aa53287ce C#: Allow nullness sources with SSA at entry. 2025-10-31 11:25:37 +01:00
Tom Hvitved
f672f6b731 Merge pull request #20727 from hvitved/rust/variable-overlap-fix
Rust: Fix variable access overlap
2025-10-31 11:07:30 +01:00
Jeroen Ketema
7301bc74cf Swift: Fix key path numbering in upgrade and downgrade scripts 2025-10-31 11:01:04 +01:00
Jeroen Ketema
92ca0c2b62 Swift: Update expected test results 2025-10-31 10:53:11 +01:00
Tom Hvitved
6d64800e85 Rust: Move variable consistency check into AstConsistency.qll 2025-10-31 10:42:51 +01:00
Jeroen Ketema
eab6579e12 Swift: sync files 2025-10-31 10:24:03 +01:00
Jeroen Ketema
f4d1e1c034 Swift: Handle InlineArrayTypes 2025-10-31 10:15:07 +01:00
Jeroen Ketema
72e8ec3951 Swift: Update comment for LocatableTypes 2025-10-31 10:02:12 +01:00
Jeroen Ketema
b9d0cb7746 Swift: Add basic support for experimental using decls
Note that we cannot write tests for these at the moment. Passing
```
-enable-experimental-feature DefaultIsolationPerFile
```
to the extractor results in:
```
error: experimental feature 'DefaultIsolationPerFile' cannot be enabled in production compile
```
2025-10-31 09:58:12 +01:00
Jeroen Ketema
67b6b9cd15 Swift: Support UnsafeExpr 2025-10-31 09:58:10 +01:00
Jeroen Ketema
119b058629 Swift: Handle method and initializer key path components in QL
Note that it does not seem to be possible to write test that exercise this
code. Passing `-enable-experimental-feature KeyPathWithMethodMembers` to the
extractor results in:
```
error: experimental feature 'KeyPathWithMethodMembers' cannot be enabled in production compiler
```
2025-10-31 09:58:09 +01:00
Jeroen Ketema
b08b123184 Swift: Support new accessors 2025-10-31 09:57:58 +01:00
Tom Hvitved
7d5664f2a8 Address review comment 2025-10-31 09:43:18 +01:00
Tom Hvitved
f850025583 Rust: Add another type inference test 2025-10-31 09:39:00 +01:00
Asger F
a1a9626eae Merge pull request #20421 from asgerf/js/compile-for-overlay-eval
JS: Add compileForOverlayEval: true
2025-10-31 09:21:16 +01:00
Tom Hvitved
5a2467414c Rust: Fix variable access overlap 2025-10-30 21:52:36 +01:00
Tom Hvitved
3d7b60a439 Rust: Add variable consistency query 2025-10-30 21:40:37 +01:00
Tom Hvitved
d71f2dee9c Rust: Add more variable tests 2025-10-30 21:39:28 +01:00
Asger F
c583b480af JS: Add pragma[nomagic] just to be safe
The DIL is unchanged
2025-10-30 15:31:51 +01:00
Asger F
1f7671cf5e JS: Ensure integration test contains one valid file 2025-10-30 15:31:51 +01:00
Asger F
0acfacefbf JS: Recursively delete source archive so emptiness detection works 2025-10-30 15:31:51 +01:00
Asger F
a5819a14be JS: Fix bad join order in getNextToken() 2025-10-30 15:31:51 +01:00
Asger F
39f74d808b JS: Add compileForOverlayEval 2025-10-30 15:31:51 +01:00
Simon Friis Vindum
a25ae3922d Merge pull request #20682 from paldepind/rust/ti-condition
Rust: Refactor using shared constraint satisfaction
2025-10-30 15:19:16 +01:00
Simon Friis Vindum
c648aa69b8 Rust: Rename predicates 2025-10-30 14:35:17 +01:00
Tom Hvitved
cca458c2ac Rust: Address review comments and handle ! types in type inference 2025-10-30 13:30:42 +01:00
Geoffrey White
0e7d410163 Merge branch 'main' into macrometric2 2025-10-30 10:19:11 +00:00
Tom Hvitved
5697a7e612 Rust: More type inference tests 2025-10-30 10:43:44 +01:00
Simon Friis Vindum
b189f1fe3f Rust: Refactor using shared constraint satisfaction 2025-10-30 08:18:12 +01:00
Jeroen Ketema
26f59a8786 Merge pull request #20710 from jketema/swift-rsc
Swift: Do not include the embedded resources
2025-10-29 17:38:07 +01:00
Jeroen Ketema
cf2cd20884 Swift: Update resources 2025-10-29 15:54:17 +01:00
Jeroen Ketema
ea6b05eda3 Update docs/codeql/codeql-overview/system-requirements.rst 2025-10-29 15:49:53 +01:00
Tom Hvitved
bc53fee1c5 Rust: Infer more () types 2025-10-29 15:43:00 +01:00
Tom Hvitved
f395162afd Rust: More type inference tests 2025-10-29 15:41:23 +01:00
Tom Hvitved
3c663d8ebf Merge pull request #20715 from hvitved/rust/type-inference-overlap-test
Rust: Add type inference tests for method resolution overlap
2025-10-29 15:39:07 +01:00
Anders Schack-Mulligen
900d0d2477 C#: Accept test changes for assert split removal. 2025-10-29 15:17:34 +01:00
Tom Hvitved
6ed8bcbcf3 Rust: Add type inference tests for method resolution overlap 2025-10-29 14:53:28 +01:00
Tom Hvitved
e5f1238e26 Merge pull request #20707 from paldepind/rust/ti-self-trait
Rust: Improve handling of `Self` type parameter
2025-10-29 13:17:14 +01:00
Anders Schack-Mulligen
51a577a429 Merge pull request #20713 from aschackmull/dataflow/qldoc1
Dataflow: Minor drive-by qldoc addition.
2025-10-29 13:13:43 +01:00
Geoffrey White
7a864c5244 Rust: Implement suggestion from review. 2025-10-29 12:13:12 +00:00
Anders Schack-Mulligen
87d89fd00f C#: Fix CFG for assertion. 2025-10-29 13:04:33 +01:00
Anders Schack-Mulligen
e61ddf59d7 C#: Remove assertion splitting. 2025-10-29 13:04:32 +01:00
Anders Schack-Mulligen
b48d4d4834 C#: Recognize assertions as Guards. 2025-10-29 13:04:32 +01:00
Anders Schack-Mulligen
500fdb8723 Guards: Add support for assertions that exit rather than throw. 2025-10-29 13:04:29 +01:00
Anders Schack-Mulligen
72f1fe5d58 C#: Exclude nullness sources that are deemed non-null. 2025-10-29 13:03:51 +01:00
Anders Schack-Mulligen
0df0816c95 Guards: Minor improvement to implications. 2025-10-29 13:03:51 +01:00
Anders Schack-Mulligen
cbfb8fd110 C#: Accept some test changes. 2025-10-29 13:03:50 +01:00
Anders Schack-Mulligen
7241bedf05 C#: Replace Guards with the new implementation. 2025-10-29 13:03:50 +01:00
Anders Schack-Mulligen
8b3e62652c Guards: Only prune actually trivial guards. 2025-10-29 13:03:46 +01:00
Anders Schack-Mulligen
84b8b1c01f C#: Minor test tweak. 2025-10-29 13:02:08 +01:00
Anders Schack-Mulligen
dc4abc952f C#: Replace references to getANullCheck. 2025-10-29 13:02:08 +01:00
Anders Schack-Mulligen
46fc006c5f C#: Update NullCheck test to reflect what nullness use. 2025-10-29 13:02:07 +01:00
Anders Schack-Mulligen
1aa0e7c2da C#: Make private. 2025-10-29 13:02:07 +01:00
Anders Schack-Mulligen
e3fc3192ac C#: Remove tests referencing impliesStep. 2025-10-29 13:02:06 +01:00
Anders Schack-Mulligen
9776e8f828 C#: Remove an irrelevant reference to impliesStep. 2025-10-29 13:02:06 +01:00
Anders Schack-Mulligen
4ea90e06a5 Dataflow: Minor drive-by qldoc addition. 2025-10-29 12:58:56 +01:00
Geoffrey White
558ca74e9c Merge pull request #20702 from geoffw0/gen2
Rust: Generalize more models
2025-10-29 11:32:00 +00:00
Geoffrey White
5ca0bd071d Rust: Exclude skipped files from CallTargetStats and ExprTypeStats as well. 2025-10-29 10:42:04 +00:00
Geoffrey White
25e4b790a3 Rust: Exclude skipped files from MacroCallTargetStats. 2025-10-29 10:42:03 +00:00
Simon Friis Vindum
ce8cffc331 Rust: Address comments 2025-10-29 11:18:02 +01:00
Tom Hvitved
b7293541cd Merge pull request #20704 from hvitved/rust/fix-bad-joins
Rust: Fix two bad joins
2025-10-29 11:11:54 +01:00
Jeroen Ketema
6906c88781 Swift: Update change note 2025-10-29 11:08:16 +01:00
Jeroen Ketema
2505c8f3e3 Swift: Improve docs 2025-10-29 11:06:50 +01:00
Jeroen Ketema
9f498df9fa Swift: Do not include the embedded resources 2025-10-29 11:00:04 +01:00
Simon Friis Vindum
9022f996e8 Rust: Improve handling of occurrences of the Self type parameter 2025-10-29 10:41:46 +01:00
Simon Friis Vindum
9ff3c61c6e Rust: Add type inference tests involving Self 2025-10-29 10:41:44 +01:00
yoff
4461be180a Merge pull request #19539 from yoff/java/conflicting-access 2025-10-28 20:37:44 +01:00
Geoffrey White
6f1eca8be1 Rust: Make the QLDoc for fromSource a bit more precise. 2025-10-28 16:22:25 +00:00
Tom Hvitved
f2380d3ef1 Merge pull request #20612 from hvitved/rust/type-inference-blanket-non-satisfaction
Rust: Compute incompatible blanket implementations
2025-10-28 14:00:55 +01:00
Tom Hvitved
b3bbe78974 Rust: Fix bad join
Before
```
Pipeline standard for TypeInference::MethodCallMatching::directTypeMatch/6#f0fb0b61@31ee5u2w was evaluated in 821 iterations totaling 1057ms (delta sizes total: 689971).
           416937   ~1%    {6} r1 = SCAN `TypeInference::MethodCallMatching::directTypeMatch0/6#dfcc7717#prev_delta` OUTPUT In.0, In.3, In.1, In.2, In.4, In.5

           222757   ~2%    {8} r2 = JOIN r1 WITH `TypeInference::MethodCallMatchingInput::Access.getInferredNonSelfType/2#dispred#b181cb0a#prev` ON FIRST 2 OUTPUT Lhs.0, Lhs.2, Lhs.3, Lhs.5, Rhs.3, _, Lhs.4, Rhs.2
                           {6}    | REWRITE WITH Tmp.5 := "", Out.5 := InverseAppend(In.6,Tmp.5,In.7) KEEPING 6
           164360   ~3%    {6}    | SCAN OUTPUT In.0, In.1, In.2, In.5, In.4, In.3

        315350783   ~1%    {6} r3 = SCAN `TypeInference::MethodCallMatching::directTypeMatch0/6#dfcc7717#prev` OUTPUT In.0, In.3, In.1, In.2, In.4, In.5

           593815   ~1%    {8} r4 = JOIN r3 WITH `TypeInference::MethodCallMatchingInput::Access.getInferredNonSelfType/2#dispred#b181cb0a#prev_delta` ON FIRST 2 OUTPUT Lhs.0, Lhs.2, Lhs.3, Lhs.5, Rhs.3, _, Lhs.4, Rhs.2
                           {6}    | REWRITE WITH Tmp.5 := "", Out.5 := InverseAppend(In.6,Tmp.5,In.7) KEEPING 6
           342226   ~1%    {6}    | SCAN OUTPUT In.0, In.1, In.2, In.5, In.4, In.3

           826517   ~0%    {8} r5 = JOIN r1 WITH `TypeInference::MethodCallMatchingInput::Access.getInferredSelfType/3#dispred#45b2f893#prev` ON FIRST 3 OUTPUT Lhs.0, Lhs.2, Lhs.3, Lhs.5, Rhs.4, _, Lhs.4, Rhs.3
                           {6}    | REWRITE WITH Tmp.5 := "", Out.5 := InverseAppend(In.6,Tmp.5,In.7) KEEPING 6
           345294   ~1%    {6}    | SCAN OUTPUT In.0, In.1, In.2, In.5, In.4, In.3

            73715   ~0%    {8} r6 = JOIN r3 WITH `TypeInference::MethodCallMatchingInput::Access.getInferredSelfType/3#dispred#45b2f893#prev_delta` ON FIRST 3 OUTPUT Lhs.0, Lhs.2, Lhs.3, Lhs.5, Rhs.4, _, Lhs.4, Rhs.3
                           {6}    | REWRITE WITH Tmp.5 := "", Out.5 := InverseAppend(In.6,Tmp.5,In.7) KEEPING 6
            47802   ~1%    {6}    | SCAN OUTPUT In.0, In.1, In.2, In.5, In.4, In.3

           899682   ~5%    {6} r7 = r2 UNION r4 UNION r5 UNION r6
           711040   ~6%    {6}    | AND NOT `TypeInference::MethodCallMatching::directTypeMatch/6#f0fb0b61#prev`(FIRST 6)
                           return r7
```

After
```
Pipeline standard for TypeInference::MethodCallMatching::directTypeMatch/6#f0fb0b61@ad458u2w was evaluated in 821 iterations totaling 374ms (delta sizes total: 691168).
        222757   ~2%    {8} r1 = JOIN `TypeInference::MethodCallMatching::directTypeMatch0/6#dfcc7717#prev_delta` WITH `TypeInference::MethodCallMatchingInput::Access.getInferredNonSelfType/2#dispred#b181cb0a#prev` ON FIRST 2 OUTPUT Lhs.0, Lhs.2, Lhs.3, Lhs.5, Rhs.3, _, Lhs.4, Rhs.2
                        {6}    | REWRITE WITH Tmp.5 := "", Out.5 := InverseAppend(In.6,Tmp.5,In.7) KEEPING 6
        164360   ~3%    {6}    | SCAN OUTPUT In.0, In.1, In.2, In.5, In.4, In.3

        593815   ~1%    {8} r2 = JOIN `TypeInference::MethodCallMatching::directTypeMatch0/6#dfcc7717#prev` WITH `TypeInference::MethodCallMatchingInput::Access.getInferredNonSelfType/2#dispred#b181cb0a#prev_delta` ON FIRST 2 OUTPUT Lhs.0, Lhs.2, Lhs.3, Lhs.5, Rhs.3, _, Lhs.4, Rhs.2
                        {6}    | REWRITE WITH Tmp.5 := "", Out.5 := InverseAppend(In.6,Tmp.5,In.7) KEEPING 6
        342226   ~1%    {6}    | SCAN OUTPUT In.0, In.1, In.2, In.5, In.4, In.3

        826517   ~0%    {8} r3 = JOIN `TypeInference::MethodCallMatching::directTypeMatch0/6#dfcc7717#prev_delta` WITH `TypeInference::MethodCallMatchingInput::Access.getInferredSelfType/3#dispred#45b2f893#prev` ON FIRST 3 OUTPUT Lhs.0, Lhs.2, Lhs.3, Lhs.5, Rhs.4, _, Lhs.4, Rhs.3
                        {6}    | REWRITE WITH Tmp.5 := "", Out.5 := InverseAppend(In.6,Tmp.5,In.7) KEEPING 6
        345294   ~1%    {6}    | SCAN OUTPUT In.0, In.1, In.2, In.5, In.4, In.3

         73715   ~0%    {8} r4 = JOIN `TypeInference::MethodCallMatching::directTypeMatch0/6#dfcc7717#prev` WITH `TypeInference::MethodCallMatchingInput::Access.getInferredSelfType/3#dispred#45b2f893#prev_delta` ON FIRST 3 OUTPUT Lhs.0, Lhs.2, Lhs.3, Lhs.5, Rhs.4, _, Lhs.4, Rhs.3
                        {6}    | REWRITE WITH Tmp.5 := "", Out.5 := InverseAppend(In.6,Tmp.5,In.7) KEEPING 6
         47802   ~1%    {6}    | SCAN OUTPUT In.0, In.1, In.2, In.5, In.4, In.3

        899682   ~5%    {6} r5 = r1 UNION r2 UNION r3 UNION r4
        711095   ~6%    {6}    | AND NOT `TypeInference::MethodCallMatching::directTypeMatch/6#f0fb0b61#prev`(FIRST 6)
                        return r5
```
2025-10-28 13:09:39 +01:00
Tom Hvitved
104ba0e291 Rust: Fix bad join
Before
```
Pipeline standard for TypeInference::MethodCallMatching::AccessConstraint::RelevantAccess.getTypeAt/1#dispred#e8abf748@ada3a07w was evaluated in 801 iterations totaling 31ms (delta sizes total: 182871).
           50151   ~1%    {4} r1 = SCAN TypeInference::MethodCallMatching::AccessConstraint::MkRelevantAccess#7a01048b#prev_delta OUTPUT In.0, In.2, In.3, In.4
           39574   ~0%    {5}    | JOIN WITH `TypeInference::MethodCallMatchingInput::Access.getInferredNonSelfType/2#dispred#b181cb0a#prev` ON FIRST 2 OUTPUT Lhs.3, Rhs.3, _, Lhs.2, Rhs.2
                          {3}    | REWRITE WITH Tmp.2 := "", Out.2 := InverseAppend(In.3,Tmp.2,In.4) KEEPING 3
           36996   ~0%    {3}    | SCAN OUTPUT In.0, In.2, In.1

        36102333   ~0%    {4} r2 = SCAN TypeInference::MethodCallMatching::AccessConstraint::MkRelevantAccess#7a01048b#prev OUTPUT In.0, In.2, In.3, In.4
           90175   ~1%    {5}    | JOIN WITH `TypeInference::MethodCallMatchingInput::Access.getInferredNonSelfType/2#dispred#b181cb0a#prev_delta` ON FIRST 2 OUTPUT Lhs.3, Rhs.3, _, Lhs.2, Rhs.2
                          {3}    | REWRITE WITH Tmp.2 := "", Out.2 := InverseAppend(In.3,Tmp.2,In.4) KEEPING 3
           65014   ~1%    {3}    | SCAN OUTPUT In.0, In.2, In.1

           50151   ~1%    {5} r3 = SCAN TypeInference::MethodCallMatching::AccessConstraint::MkRelevantAccess#7a01048b#prev_delta OUTPUT In.2, In.0, In.1, In.3, In.4
           24208   ~1%    {4}    | JOIN WITH `FunctionType::FunctionPosition.isSelf/0#dispred#9e84d302` ON FIRST 1 OUTPUT Lhs.1, Lhs.2, Lhs.3, Lhs.4
           95022   ~0%    {9}    | JOIN WITH `TypeInference::MethodCallMatchingInput::Access.getInferredSelfType/3#dispred#45b2f893#prev` ON FIRST 1 OUTPUT Lhs.2, Lhs.3, Rhs.2, Rhs.3, Rhs.4, _, Rhs.1, Lhs.1, _
                          {6}    | REWRITE WITH Tmp.5 := ";", Tmp.5 := (In.6 ++ Tmp.5), Tmp.8 := "", Out.5 := InverseAppend(Tmp.5,Tmp.8,In.7) KEEPING 6
           93919   ~1%    {7}    | SCAN OUTPUT In.0, In.1, In.2, In.3, In.4, In.5, _
                          {6}    | REWRITE WITH NOT [NOT [Tmp.6 := "borrow", TEST InOut.5 = Tmp.6, Tmp.6 := true, TEST InOut.2 = Tmp.6], NOT [Tmp.6 := "", TEST InOut.5 = Tmp.6, Tmp.6 := true, TEST InOut.2 != Tmp.6]] KEEPING 6
           81298   ~1%    {5}    | SCAN OUTPUT In.1, In.4, _, In.0, In.3
                          {3}    | REWRITE WITH Tmp.2 := "", Out.2 := InverseAppend(In.3,Tmp.2,In.4) KEEPING 3
           64110   ~1%    {3}    | SCAN OUTPUT In.0, In.2, In.1

        36102333   ~0%    {5} r4 = SCAN TypeInference::MethodCallMatching::AccessConstraint::MkRelevantAccess#7a01048b#prev OUTPUT In.2, In.0, In.1, In.3, In.4
        17473531   ~0%    {4}    | JOIN WITH `FunctionType::FunctionPosition.isSelf/0#dispred#9e84d302` ON FIRST 1 OUTPUT Lhs.1, Lhs.2, Lhs.3, Lhs.4
           47409   ~1%    {9}    | JOIN WITH `TypeInference::MethodCallMatchingInput::Access.getInferredSelfType/3#dispred#45b2f893#prev_delta` ON FIRST 1 OUTPUT Lhs.2, Lhs.3, Rhs.2, Rhs.3, Rhs.4, _, Rhs.1, Lhs.1, _
                          {6}    | REWRITE WITH Tmp.5 := ";", Tmp.5 := (In.6 ++ Tmp.5), Tmp.8 := "", Out.5 := InverseAppend(Tmp.5,Tmp.8,In.7) KEEPING 6
           29885   ~0%    {7}    | SCAN OUTPUT In.0, In.1, In.2, In.3, In.4, In.5, _
                          {6}    | REWRITE WITH NOT [NOT [Tmp.6 := "borrow", TEST InOut.5 = Tmp.6, Tmp.6 := true, TEST InOut.2 = Tmp.6], NOT [Tmp.6 := "", TEST InOut.5 = Tmp.6, Tmp.6 := true, TEST InOut.2 != Tmp.6]] KEEPING 6
           16952   ~1%    {5}    | SCAN OUTPUT In.1, In.4, _, In.0, In.3
                          {3}    | REWRITE WITH Tmp.2 := "", Out.2 := InverseAppend(In.3,Tmp.2,In.4) KEEPING 3
           16829   ~0%    {3}    | SCAN OUTPUT In.0, In.2, In.1

          182949   ~1%    {3} r5 = r1 UNION r2 UNION r3 UNION r4
          182949   ~1%    {3}    | AND NOT `TypeInference::MethodCallMatching::AccessConstraint::RelevantAccess.getTypeAt/1#dispred#e8abf748#prev`(FIRST 3)
                          return r5
```

After
```
Pipeline standard for TypeInference::MethodCallMatching::AccessConstraint::RelevantAccess.getTypeAt/1#dispred#e8abf748@31ee547w was evaluated in 801 iterations totaling 19ms (delta sizes total: 182946).
         81298   ~0%    {5} r1 = JOIN TypeInference::MethodCallMatching::AccessConstraint::MkRelevantAccess#7a01048b#prev_delta WITH `TypeInference::MethodCallMatchingInput::Access.getInferredSelfType/3#dispred#45b2f893#prev` ON FIRST 3 OUTPUT Lhs.4, Rhs.4, _, Lhs.3, Rhs.3
                        {3}    | REWRITE WITH Tmp.2 := "", Out.2 := InverseAppend(In.3,Tmp.2,In.4) KEEPING 3
         64110   ~1%    {3}    | SCAN OUTPUT In.0, In.2, In.1

         39574   ~0%    {5} r2 = JOIN TypeInference::MethodCallMatching::AccessConstraint::MkRelevantAccess#7a01048b#prev_delta WITH `TypeInference::MethodCallMatchingInput::Access.getInferredNonSelfType/2#dispred#b181cb0a#prev` ON FIRST 2 OUTPUT Lhs.4, Rhs.3, _, Lhs.3, Rhs.2
                        {3}    | REWRITE WITH Tmp.2 := "", Out.2 := InverseAppend(In.3,Tmp.2,In.4) KEEPING 3
         36996   ~0%    {3}    | SCAN OUTPUT In.0, In.2, In.1

         16952   ~0%    {5} r3 = JOIN TypeInference::MethodCallMatching::AccessConstraint::MkRelevantAccess#7a01048b#prev WITH `TypeInference::MethodCallMatchingInput::Access.getInferredSelfType/3#dispred#45b2f893#prev_delta` ON FIRST 3 OUTPUT Lhs.4, Rhs.4, _, Lhs.3, Rhs.3
                        {3}    | REWRITE WITH Tmp.2 := "", Out.2 := InverseAppend(In.3,Tmp.2,In.4) KEEPING 3
         16829   ~0%    {3}    | SCAN OUTPUT In.0, In.2, In.1

         90175   ~0%    {5} r4 = JOIN TypeInference::MethodCallMatching::AccessConstraint::MkRelevantAccess#7a01048b#prev WITH `TypeInference::MethodCallMatchingInput::Access.getInferredNonSelfType/2#dispred#b181cb0a#prev_delta` ON FIRST 2 OUTPUT Lhs.4, Rhs.3, _, Lhs.3, Rhs.2
                        {3}    | REWRITE WITH Tmp.2 := "", Out.2 := InverseAppend(In.3,Tmp.2,In.4) KEEPING 3
         65014   ~0%    {3}    | SCAN OUTPUT In.0, In.2, In.1

        182949   ~1%    {3} r5 = r1 UNION r2 UNION r3 UNION r4
        182949   ~1%    {3}    | AND NOT `TypeInference::MethodCallMatching::AccessConstraint::RelevantAccess.getTypeAt/1#dispred#e8abf748#prev`(FIRST 3)
                        return r5
```
2025-10-28 13:09:32 +01:00
Nora Dimitrijević
727bddea19 Merge pull request #20607 from d10c/d10c/update-diff-informed-testing
Update diff-informed testing to always treat sources and sinks as alert locations
2025-10-28 11:52:31 +01:00
Tom Hvitved
409f7fb743 Address review comments 2025-10-28 11:48:45 +01:00
Geoffrey White
d6c4ab2724 Merge branch 'main' into gen2 2025-10-28 09:26:13 +00:00
Geoffrey White
abcc1712d5 Rust: Remove more redundant models. 2025-10-28 09:26:11 +00:00
Nora Dimitrijević
a0975e7e19 Constrain location overrides to actual sources/sinks 2025-10-28 09:42:20 +01:00
Nora Dimitrijević
96e1536769 C++/SqlTainted 2025-10-28 09:42:17 +01:00
Nora Dimitrijević
8e0c453c37 Rust/InsecureCookie 2025-10-28 09:42:14 +01:00
Nora Dimitrijević
4952cb27fb Rust/AccessAfterLifetime 2025-10-28 09:42:11 +01:00
Nora Dimitrijević
0f0bd0f455 Go/SSRF
go/ql/src/experimental/CWE-918/SSRF.ql
2025-10-28 09:42:09 +01:00
Nora Dimitrijević
d41268fc84 Go/UnhandledCloseWritableHandle 2025-10-28 09:42:06 +01:00
Nora Dimitrijević
ec63547925 C++/UseOfHttp 2025-10-28 09:42:03 +01:00
Nora Dimitrijević
a65d4d5997 C++/TaintedAllocationSize 2025-10-28 09:42:01 +01:00
Nora Dimitrijević
f3d51e0151 C++/ArithmeticUncontrolled 2025-10-28 09:41:57 +01:00
Nora Dimitrijević
1321cbb021 C++/DecompressionBombs 2025-10-28 09:41:55 +01:00
Nora Dimitrijević
bbe2bf2b7f C++/CleartextTransmission 2025-10-28 09:41:52 +01:00
Nora Dimitrijević
b0180409f4 C++/CleartextFileWrite 2025-10-28 09:41:49 +01:00
Nora Dimitrijević
d89aa0f19d C++/CleartextBufferWrite 2025-10-28 09:41:46 +01:00
Nora Dimitrijević
17b261a506 C++/AuthenticationBypass 2025-10-28 09:41:43 +01:00
Nora Dimitrijević
0ed27f4e81 C++/CleartextSqliteDatabase 2025-10-28 09:41:40 +01:00
Nora Dimitrijević
f7a1a4cf75 C++/NonConstantFormat 2025-10-28 09:41:38 +01:00
Nora Dimitrijević
2756e8255f C++/UnboundedWrite 2025-10-28 09:41:35 +01:00
Nora Dimitrijević
a4ac0392a6 C++/OverflowDestination 2025-10-28 09:41:32 +01:00
Nora Dimitrijević
65d79ff6fc C++/ExecTainted 2025-10-28 09:41:29 +01:00
Nora Dimitrijević
464f6cb096 C++/ConstantSizeArrayOffByOne 2025-10-28 09:41:26 +01:00
Nora Dimitrijević
974d174757 Actions/CodeInjectionQuery
actions/ql/src/Security/CWE-094/CodeInjectionMedium.ql

actions/ql/src/Security/CWE-094/CodeInjectionCritical.ql
2025-10-28 09:41:24 +01:00
Nora Dimitrijević
62fde8f6e7 Actions/ArgumentInjectionQuery
actions/ql/src/experimental/Security/CWE-088/ArgumentInjectionCritical.ql

actions/ql/src/experimental/Security/CWE-088/ArgumentInjectionMedium.ql
2025-10-28 09:41:21 +01:00
Nora Dimitrijević
c40223319c Actions/EnvVarInjectionQuery
actions/ql/src/Security/CWE-077/EnvVarInjectionMedium.ql

actions/ql/src/Security/CWE-077/EnvVarInjectionCritical.ql
2025-10-28 09:41:18 +01:00
Nora Dimitrijević
edc72d29d7 Actions/EnvPathInjectionQuery
actions/ql/src/Security/CWE-077/EnvPathInjectionMedium.ql

actions/ql/src/Security/CWE-077/EnvPathInjectionCritical.ql
2025-10-28 09:41:16 +01:00
Nora Dimitrijević
1f53ffbdd7 Actions/ArtifactPoisoningQuery
actions/ql/src/Security/CWE-829/ArtifactPoisoningCritical.ql

actions/ql/src/Security/CWE-829/ArtifactPoisoningMedium.ql
2025-10-28 09:41:13 +01:00
Nora Dimitrijević
8a750b3125 Swift/UnsafeUnpackQuery
swift/ql/src/experimental/Security/CWE-022/UnsafeUnpack.ql
2025-10-28 09:41:10 +01:00
Nora Dimitrijević
895bd93062 Swift/UnsafeJsEvalQuery
swift/ql/src/queries/Security/CWE-094/UnsafeJsEval.ql
2025-10-28 09:41:08 +01:00
Nora Dimitrijević
cd86e7d6f5 Swift/StringLengthConflationQuery
swift/ql/src/queries/Security/CWE-135/StringLengthConflation.ql
2025-10-28 09:41:05 +01:00
Nora Dimitrijević
5a6f731ab7 Swift/StaticInitializationVectorQuery
swift/ql/src/queries/Security/CWE-1204/StaticInitializationVector.ql
2025-10-28 09:41:02 +01:00
Nora Dimitrijević
7ba7c435f2 Swift/InsufficientHashIterationsQuery
swift/ql/src/queries/Security/CWE-916/InsufficientHashIterations.ql
2025-10-28 09:41:00 +01:00
Nora Dimitrijević
6c52d4ba91 Swift/ConstantPasswordQuery
swift/ql/src/queries/Security/CWE-259/ConstantPassword.ql
2025-10-28 09:40:57 +01:00
Nora Dimitrijević
c190fae737 Swift/CleartextStoragePreferencesQuery
swift/ql/src/queries/Security/CWE-312/CleartextStoragePreferences.ql
2025-10-28 09:40:54 +01:00
Nora Dimitrijević
2332cea330 Swift/CleartextStorageDatabaseQuery
swift/ql/src/queries/Security/CWE-311/CleartextStorageDatabase.ql
2025-10-28 09:40:51 +01:00
Nora Dimitrijević
462d8c5dc4 Shared: update qldoc 2025-10-28 09:40:48 +01:00
Nora Dimitrijević
6ede0a7950 Ruby/WeakFilePermissions 2025-10-28 09:40:46 +01:00
Nora Dimitrijević
495be51ae7 Ruby/WeakParams 2025-10-28 09:40:43 +01:00
Nora Dimitrijević
50f2540db1 Ruby/ManuallyCheckHttpVerb 2025-10-28 09:40:41 +01:00
Nora Dimitrijević
6519bd9909 Ruby/PolynomialReDoSQuery
ruby/ql/src/queries/security/cwe-1333/PolynomialReDoS.ql
2025-10-28 09:40:38 +01:00
Nora Dimitrijević
1ff24cbee8 Python/LdapInsecureAuth
python/ql/src/experimental/Security/CWE-522/LdapInsecureAuth.ql
2025-10-28 09:40:35 +01:00
Nora Dimitrijević
998de144ea Python/CorsBypass 2025-10-28 09:40:32 +01:00
Nora Dimitrijević
4bc9ede2e8 Python/UnsafeUsageOfClientSideEncryptionVersion 2025-10-28 09:40:30 +01:00
Nora Dimitrijević
6d57316862 Python/UnsafeUnpackQuery
python/ql/src/experimental/Security/CWE-022bis/UnsafeUnpack.ql
2025-10-28 09:40:27 +01:00
Nora Dimitrijević
37fff48dcd Python/ServerSideRequestForgeryQuery
python/ql/src/Security/CWE-918/PartialServerSideRequestForgery.ql
2025-10-28 09:40:24 +01:00
Nora Dimitrijević
baccdcc07f Python/PolynomialReDoSQuery
python/ql/src/Security/CWE-730/PolynomialReDoS.ql
2025-10-28 09:40:21 +01:00
Nora Dimitrijević
bb80d83276 JS/SSRF
javascript/ql/src/experimental/Security/CWE-918/SSRF.ql
2025-10-28 09:40:19 +01:00
Nora Dimitrijević
bcdbe0b50a JS/PolynomialReDoSQuery
javascript/ql/src/Performance/PolynomialReDoS.ql
2025-10-28 09:40:16 +01:00
Nora Dimitrijević
94343254e3 JS/ShellCommandInjectionFromEnvironmentQuery
javascript/ql/src/Security/CWE-078/ShellCommandInjectionFromEnvironment.ql
2025-10-28 09:40:14 +01:00
Nora Dimitrijević
71cf042607 JS/IndirectCommandInjectionQuery
javascript/ql/src/Security/CWE-078/IndirectCommandInjection.ql
2025-10-28 09:40:11 +01:00
Nora Dimitrijević
2a30ea923a JS/CommandInjectionQuery
javascript/ql/src/experimental/heuristics/ql/src/Security/CWE-078/CommandInjection.ql

javascript/ql/src/Security/CWE-078/CommandInjection.ql
2025-10-28 09:40:09 +01:00
Nora Dimitrijević
f24a6f64ab Java/WebviewDebugEnabledQuery
java/ql/src/Security/CWE/CWE-489/WebviewDebuggingEnabled.ql
2025-10-28 09:40:06 +01:00
Nora Dimitrijević
518c0818a4 Java/UnsafeDeserializationQuery
java/ql/src/Security/CWE/CWE-502/UnsafeDeserialization.ql
2025-10-28 09:40:03 +01:00
Nora Dimitrijević
4439322e88 Java/TempDirLocalInformationDisclosureQuery
java/ql/src/Security/CWE/CWE-200/TempDirLocalInformationDisclosure.ql
2025-10-28 09:40:01 +01:00
Nora Dimitrijević
2a889f4f98 Java/TaintedPermissionsCheckQuery
java/ql/src/Security/CWE/CWE-807/TaintedPermissionsCheck.ql
2025-10-28 09:39:58 +01:00
Nora Dimitrijević
697f428eae Java/TaintedEnvironmentVariableQuery
java/ql/src/Security/CWE/CWE-078/ExecTaintedEnvironment.ql
2025-10-28 09:39:55 +01:00
Nora Dimitrijević
72a97773b1 Java/NumericCastTaintedQuery
java/ql/src/Security/CWE/CWE-681/NumericCastTainted.ql
2025-10-28 09:39:52 +01:00
Nora Dimitrijević
247ae1d23c Java/MaybeBrokenCryptoAlgorithmQuery
java/ql/src/Security/CWE/CWE-327/MaybeBrokenCryptoAlgorithm.ql
2025-10-28 09:39:50 +01:00
Nora Dimitrijević
eebff9c282 Java/ImproperValidationOfArrayConstructionFlow
java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstruction.ql
2025-10-28 09:39:47 +01:00
Nora Dimitrijević
9eeeec336e Java/ImproperValidationOfArrayConstructionCodeSpecifiedQuery
java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstructionCodeSpecified.ql
2025-10-28 09:39:45 +01:00
Nora Dimitrijević
dc1dff98b0 Java/ConditionalBypass
java/ql/src/Security/CWE/CWE-807/ConditionalBypass.ql
2025-10-28 09:39:42 +01:00
Nora Dimitrijević
4482e831d7 Java/CommandLineQuery
85a4dd0325/java/ql/src/Security/CWE/CWE-078/ExecTainted.ql

857b51be58/java/ql/src/Security/CWE/CWE-078/ExecUnescaped.ql

b6e56f26c7/java/ql/src/experimental/Security/CWE/CWE-078/ExecTainted.ql
2025-10-28 09:39:39 +01:00
Nora Dimitrijević
b023880a0a Java/BrokenCryptoAlgorithmQuery
java/ql/src/Security/CWE/CWE-327/BrokenCryptoAlgorithm.ql
2025-10-28 09:39:37 +01:00
Nora Dimitrijević
1129230e10 Java/ArithmeticUncontrolledQuery
java/ql/src/Security/CWE/CWE-190/ArithmeticUncontrolled.ql
2025-10-28 09:39:34 +01:00
Nora Dimitrijević
a228936c63 Java/ArithmeticTainted
java/ql/src/Security/CWE/CWE-190/ArithmeticTainted.ql
2025-10-28 09:39:31 +01:00
Nora Dimitrijević
913550f408 Java/ArbitraryApkInstallationQuery
java/ql/src/Security/CWE/CWE-094/ArbitraryApkInstallation.ql
2025-10-28 09:39:29 +01:00
Nora Dimitrijević
59a8e9b78c Go/InsufficientKeySize 2025-10-28 09:39:27 +01:00
Nora Dimitrijević
7722f31cb8 Go/DivideByZero 2025-10-28 09:39:24 +01:00
Nora Dimitrijević
ba22f0d7d2 C#/DontInstallRootCert 2025-10-28 09:39:21 +01:00
Nora Dimitrijević
ad31f1ab6d C++/WordexpTainted
Same file usees source and sink as endpoints
2025-10-28 09:39:19 +01:00
Nora Dimitrijević
5a1a887fd2 Actions/ReusableWorkflowsSummaries 2025-10-28 09:39:16 +01:00
Nora Dimitrijević
1243c6362d Actions/ReusableWorkflowsSources 2025-10-28 09:39:14 +01:00
Nora Dimitrijević
a972ef7e31 Actions/ReusableWorkflowsSinks
Same file uses source as endpoint
2025-10-28 09:39:11 +01:00
Nora Dimitrijević
9c24ce0650 Actions/CompositeActionsSummaries
Same file uses source as endpoint
2025-10-28 09:39:09 +01:00
Nora Dimitrijević
78f2cee51c Actions/CompositeActionsSources
Same file uses source as endpoint
2025-10-28 09:39:06 +01:00
Nora Dimitrijević
d36b721513 Actions/CompositeActionsSinks
Same file uses source as endpoint
2025-10-28 09:38:55 +01:00
Nora Dimitrijević
bb10307303 Actions/SecretExfiltrationQuery
actions/ql/src/experimental/Security/CWE-200/SecretExfiltration.ql uses source as endpoint
2025-10-28 09:38:38 +01:00
Nora Dimitrijević
890ca8e7d1 Actions/RequestForgeryQuery
actions/ql/src/experimental/Security/CWE-918/RequestForgery.ql uses source as endpoint
2025-10-28 09:38:21 +01:00
Nora Dimitrijević
3fa8259042 Actions/OutputClobberingQuery
actions/ql/src/experimental/Security/CWE-074/OutputClobberingHigh.ql uses source as endpoint
2025-10-28 09:38:01 +01:00
Asger F
8d49f26f3d Merge pull request #20397 from asgerf/js/build-artifact-leak-fp
JS: Fix FP in js/build-artifact-leak when keys come from an array of constants
2025-10-28 06:40:13 +01:00
Geoffrey White
b76f27d10b Rust: Remove redundant model. 2025-10-27 18:47:17 +00:00
Geoffrey White
03204b7881 Rust: Accept tests repaired. 2025-10-27 17:53:40 +00:00
Alexander Eyers-Taylor
227e1fcbde Merge pull request #20598 from github/alexet/overlay-query-libraries
Java: Make some query libraries local.
2025-10-27 17:52:27 +00:00
Geoffrey White
0c92b33b8f Revert "Rust: Generalize more models."
This reverts commit 56811d02ac.
2025-10-27 17:47:00 +00:00
Geoffrey White
a468b1d647 Rust: Accept regressions spotted by CI. 2025-10-27 17:46:01 +00:00
Paolo Tranquilli
630ea7bd0a Merge pull request #20641 from github/redsun82/fix-pytest-build-as-test-windows
Pytest: fix the `build-as-test` mode on Windows
2025-10-27 15:47:24 +01:00
Geoffrey White
56811d02ac Rust: Generalize more models. 2025-10-27 14:11:09 +00:00
Idriss Riouak
11a7d53002 Merge pull request #20657 from github/idrissrio/java-maven-fix
Java: Add integration test to reproduce regression
2025-10-27 15:09:41 +01:00
yoff
406e48b3bb java: fix aliasing FP
reorganise code, adding `LockField`
2025-10-27 14:30:25 +01:00
yoff
531b994819 java: add test for aliasing
found by triage
2025-10-27 14:27:32 +01:00
idrissrio
d473b36918 Java: Accept new test results after extractor changes 2025-10-27 14:26:48 +01:00
idrissrio
714b2ad565 Java: Add integration test for maven 2025-10-27 14:26:47 +01:00
Simon Friis Vindum
35b4a36f37 Merge pull request #20691 from paldepind/cpp/range-analysis-refactor
C++: A few small refactors to the simple range analysis library
2025-10-27 14:15:37 +01:00
Anders Schack-Mulligen
31428b2f66 Merge pull request #20700 from aschackmull/java/delete-old-ssa-consistency
Java: Remove old SSA consistency queries.
2025-10-27 14:12:09 +01:00
Paolo Tranquilli
105f810654 Merge pull request #20658 from github/redsun82/csharp-fix-xframe-options-in-location
Csharp: fix `cs/web/missing-x-frame-options` to also consider `location` elements
2025-10-27 13:49:09 +01:00
Geoffrey White
bd11873e0d Rust: Generalize a model of futures_io...poll_read. 2025-10-27 12:22:13 +00:00
Chris Smowton
2e0e9e0834 Merge pull request #20550 from github/smowton/admin/document-rails-5-csrf
Ruby: Update CSRF protection notes in documentation
2025-10-27 12:19:16 +00:00
Anders Schack-Mulligen
96fc1e889a Java: Accept .expected file. 2025-10-27 13:17:53 +01:00
Geoffrey White
c8b8046302 Rust: Generalize a model of alloc::boxed::Box. 2025-10-27 12:09:05 +00:00
Geoffrey White
d650ccb74b Rust: Generalize some std::io::Read models. 2025-10-27 12:09:04 +00:00
Anders Schack-Mulligen
02a942554d Java: Remove old SSA consistency queries. 2025-10-27 12:55:43 +01:00
Jeroen Ketema
47b26ddea4 Merge pull request #20446 from github/jketema/swift-6.2
Swift: Make extractor compile with Swift 6.2
2025-10-27 12:24:16 +01:00
Jeroen Ketema
be0d405f6d Swift: Update artifacts 2025-10-27 11:28:53 +01:00
yoff
83508ba661 java: adjust qhelp and examples for SafePublication 2025-10-27 11:25:51 +01:00
Jeroen Ketema
aabc8bc38b Swift: Fix typo in change note 2025-10-27 10:54:39 +01:00
Jeroen Ketema
2022dd833e Swift: Address review comments 2025-10-27 10:48:02 +01:00
Paolo Tranquilli
3f98d32124 C#: Update change note for location handling in query 2025-10-27 09:51:10 +01:00
Nicolas Will
d4787520fd Merge pull request #20690 from bdrodes/weak_symmetric_cipher_bug
Crypto: Fix bug in weak symmetric cipher query
2025-10-24 22:38:07 +02:00
Nicolas Will
e7bd435bee Merge pull request #20696 from bdrodes/bad_mac_decrypt_then_mac
Crypto: Adding bad decrypt then mac order query.
2025-10-24 22:07:26 +02:00
REDMOND\brodes
65d0ca9e53 Crypto: Simplifying expression for ql-for-ql alert. 2025-10-24 14:08:25 -04:00
REDMOND\brodes
0394816756 Crypto: typo fix 2025-10-24 14:06:52 -04:00
REDMOND\brodes
b20689fa46 Crypto: removing comments 2025-10-24 14:06:08 -04:00
REDMOND\brodes
0e624f51d5 Crypto: Adding bad decrypt then mac order query. Fixes to BadMacOrderMacOnEncryptPlaintext as well. 2025-10-24 12:44:28 -04:00
Simon Friis Vindum
d1ea1af945 C++: Make small trivial tweaks 2025-10-24 16:16:57 +02:00
Simon Friis Vindum
5709964fbf C++: Simplify boundFromGuard
The last disjunct in `boundFromGuard` is moved into `linearBoundFromGuard`. This avoids repeating the calculation for `boundValue`.

`getBounds` and `getExprTypeBounds` are turned into predicates with result. Their middle argument was the "output" which was confusing.
2025-10-24 16:12:05 +02:00
Simon Friis Vindum
383e6a44aa C++: Use or instead of if
The proposition in the true branch implied the condition, so `or` is more appropriate. Also eliminated an existentially quantified variable.
2025-10-24 16:08:35 +02:00
Simon Friis Vindum
3af9885489 C++: Fix typos in tests 2025-10-24 16:04:34 +02:00
Simon Friis Vindum
17e0dec08a C++: Add toString for RelationStrictness
This helps for debugging.
2025-10-24 16:01:38 +02:00
Simon Friis Vindum
a0a6f288b5 Merge pull request #20645 from paldepind/cpp/range-analysis-measure
C++: Range analysis measure bounds
2025-10-24 15:30:07 +02:00
Jeroen Ketema
74384bbeae Swift: Add change notes 2025-10-24 14:38:01 +02:00
Jeroen Ketema
e415772688 Swift: Add upgrade and downgrade scripts 2025-10-24 14:38:00 +02:00
Jeroen Ketema
2843761471 Swift: Special case the xcode-fails-spm-works test results on macOS 26
macOS 26 comes with Xcode 26, which does not call the compiler on the file
with the `#error` diagnostic directive.
2025-10-24 14:37:58 +02:00
Jeroen Ketema
79fd35a482 Swift: Remove flags related to explict modules in the tracer config
We have not found a good way to support these.
2025-10-24 14:37:57 +02:00
Jeroen Ketema
06d0d48416 Swift: Work around assertion failures in mangler 2025-10-24 14:37:55 +02:00
Jeroen Ketema
4d9827ff77 Swift: Update expected integration test results 2025-10-24 14:37:54 +02:00
Jeroen Ketema
192c9c3820 Swift: Document that tests disabled with Swift 6.1 are still broken with 6.2 2025-10-24 14:37:53 +02:00
Jeroen Ketema
b50ffe2e0c Swift: Update PoundDiagnosticDecl test
These elements are no longer present in the Swift 6.2 AST.
2025-10-24 14:37:52 +02:00
Jeroen Ketema
7890dc6030 Swift: Update expected test results after 6.2 update 2025-10-24 14:37:51 +02:00
Jeroen Ketema
bc835a310a Swift: Update KeyPathComponent for new kind values 2025-10-24 14:37:49 +02:00
Jeroen Ketema
d890feedda Swift: Compensate for backwards going locations 2025-10-24 14:37:48 +02:00
Jeroen Ketema
626bc55caf Swift: Fix AvailabilitySpec trap generation 2025-10-24 14:37:47 +02:00
Jeroen Ketema
300b5b15e7 Swift: Mangle function type lifetimes 2025-10-24 14:37:46 +02:00
Jeroen Ketema
e79c0b0405 Swift: Update generated files 2025-10-24 14:37:45 +02:00
Jeroen Ketema
22dddb0216 Swift: Fix unavailability checks after 6.2 upgrade 2025-10-24 14:37:43 +02:00
Jeroen Ketema
2ef8bb0c53 Swift: Make extractor compile with Swift 6.2 2025-10-24 14:37:42 +02:00
Tom Hvitved
32f21d6d49 Merge pull request #20688 from hvitved/java/request-forgery-matches-sanitizer
Java: Treat `x.matches(regexp)` as a sanitizer for request forgery
2025-10-24 14:34:32 +02:00
REDMOND\brodes
ed492c7d5a Crypto: Fixed bug in WeakSymmetricCipher.qll, forgot to not only filter if !=AES but the algorithm must still be a SymmetriCipher algorithm. 2025-10-24 08:16:22 -04:00
Tom Hvitved
a4eab484ce Address review comments 2025-10-24 13:32:39 +02:00
Joe Farebrother
8c277bd1d9 Merge pull request #20494 from joefarebrother/python-insecure-cookie-split
Python: Split Insecure Cookie query into multiple queries
2025-10-24 11:10:20 +01:00
Tom Hvitved
0e885e9297 Rust: Compute incompatible blanket implementations 2025-10-24 11:37:24 +02:00
Tom Hvitved
2a43a95049 Rust: More type inference tests 2025-10-24 11:37:22 +02:00
Tom Hvitved
672977acfa Merge pull request #20592 from hvitved/rust/type-inference-branch-propagation
Rust: Non-symmetric type propagation for lub coercions
2025-10-24 11:35:24 +02:00
Tom Hvitved
ce379161fc Add change note 2025-10-24 09:34:11 +02:00
Tom Hvitved
74411ff979 Merge pull request #20687 from hvitved/js/remove-invalid-qhelp-links
JS: Remove two invalid QHelp links
2025-10-24 09:22:33 +02:00
Tom Hvitved
7a9cb64e2e Java: Treat x.matches(regexp) as a sanitizer for request forgery 2025-10-24 09:06:57 +02:00
Anders Schack-Mulligen
3542cdab43 Merge pull request #20677 from aschackmull/csharp/disable-exc-split
C#: Delete exception splitting.
2025-10-24 08:46:33 +02:00
Tom Hvitved
eb9df008b0 JS: Remove two invalid QHelp links 2025-10-24 08:45:12 +02:00
Tom Hvitved
ff31f0e3df Address review comments 2025-10-23 20:17:28 +02:00
Geoffrey White
7acd214d7b Merge pull request #20673 from geoffw0/sourcestest
Rust: Split up the dataflow/sources test
2025-10-23 13:08:43 +01:00
Anders Schack-Mulligen
6f72234fec Merge pull request #20680 from aschackmull/shared/align-ssa-interface
Shared: Align SSA interfaces in Guards and ControlFlowReachability with shared SSA
2025-10-23 13:12:31 +02:00
Anders Schack-Mulligen
ebb50cd402 C#: Accept qltest changes. 2025-10-23 12:48:44 +02:00
Paolo Tranquilli
d11b44599e Merge pull request #20679 from github/redsun82/fix-rust-vendor-check
Bazel: upgrade `rules_rust`
2025-10-23 12:14:32 +02:00
Anders Schack-Mulligen
72d83cc966 ControlFlowReachability: Align the SSA signature with the one from shared SSA. 2025-10-23 10:57:21 +02:00
Paolo Tranquilli
8f5f65e5fa Bazel: upgrade rules_rust 2025-10-23 10:49:51 +02:00
Anders Schack-Mulligen
f257c7a570 Guards: Align the SSA signature with the one from shared SSA. 2025-10-23 10:23:22 +02:00
Anders Schack-Mulligen
f6cddc9db7 Merge pull request #20678 from aschackmull/shared/rename-cfg-reach
Shared/Java: Rename ControlFlowReachability library.
2025-10-23 10:22:15 +02:00
Geoffrey White
47334fbab7 Rust: Accept changes to the web_frameworks results. 2025-10-23 09:06:11 +01:00
Anders Schack-Mulligen
20147cdd2b Shared/Java: Rename ControlFlowReachability library. 2025-10-23 09:07:34 +02:00
Anders Schack-Mulligen
dff327ea16 C#: Delete exception splitting. 2025-10-23 08:56:56 +02:00
Anders Schack-Mulligen
8a3f62b9b6 Merge pull request #20558 from aschackmull/csharp/guards3
C#: Instantiate shared Guards and shared ControlFlowReachability and replace nullness
2025-10-23 08:43:14 +02:00
Nicolas Will
c7ef8a5ab3 Merge pull request #20605 from bdrodes/santander-java-crypto-check
Crypto: Add Java Cryptographic Analysis Queries
2025-10-23 01:30:50 +02:00
REDMOND\brodes
bdad95d810 Crypto: Fixed alphabetical ordering issue in not_included_in_qls.expected 2025-10-22 15:56:14 -04:00
REDMOND\brodes
08379393b3 Crypto: Fix off by one column issue in unit tests. 2025-10-22 15:50:33 -04:00
REDMOND\brodes
3561d01144 Crytpo: Trying to fix in pipeline test failure, experimentally altering a line to see if this forces the test to pass. The test is off by one column in the piepline 2025-10-22 14:16:12 -04:00
Tom Hvitved
65b706ab80 Rust: Non-symmetric type propagation for lub coercions 2025-10-22 19:57:38 +02:00
Tom Hvitved
00bf049c85 Rust: Add more type inference tests 2025-10-22 19:57:37 +02:00
Tom Hvitved
c84cec9d29 Merge pull request #20664 from hvitved/rust/callable-get-body
Rust: Add `Callable.getBody()`
2025-10-22 19:57:14 +02:00
Geoffrey White
e18bf1661a Rust: Accept result de-regression. 2025-10-22 17:52:12 +01:00
Geoffrey White
6b08297c2a Rust: Repair after merge. 2025-10-22 17:46:25 +01:00
Geoffrey White
bc4d8a8425 Merge branch 'main' into sourcestest 2025-10-22 17:31:25 +01:00
Ben Rodes
e16543ab6d Merge branch 'main' into santander-java-crypto-check 2025-10-22 11:51:13 -04:00
Geoffrey White
5d2ddbfa8e Merge pull request #20670 from geoffw0/missingmetric
Rust: Add expressions with known type metric
2025-10-22 15:42:48 +01:00
Tom Hvitved
4b6c39004f Rust: Add DB downgrade script 2025-10-22 16:40:56 +02:00
Tom Hvitved
8b10f68e28 Rust: Add DB upgrade scripts 2025-10-22 16:40:54 +02:00
Tom Hvitved
944ebc5267 Rust: Add Callable.getBody() 2025-10-22 16:40:53 +02:00
Tom Hvitved
7d0509b6af Merge pull request #20282 from hvitved/rust/type-inference-method-call-resolution-rework
Rust: Rework call resolution and type inference for calls
2025-10-22 16:37:26 +02:00
REDMOND\brodes
db6d3ad054 Crypto: Fix typo in not_included_in_qls.expected. 2025-10-22 10:31:19 -04:00
REDMOND\brodes
dd60cf9395 Crypto: Adjust output of bad mac order queries, update associated bad mac order expected results, fix erroneous change to ID for a slicing query, update model to specify elliptic curve type as a property, update associated graph test expected files, update the not_included_in_qls.expected to reflect all queries now under quantum. 2025-10-22 10:29:31 -04:00
Florin Coada
83f9fb14b9 Merge pull request #20660 from github/changedocs/2.23.3
Add changelog entry for CodeQL CLI version 2.23.3
2025-10-22 14:58:00 +01:00
Anders Schack-Mulligen
7d0e4f58f3 C#: Fix join-order issue in ConstantCondition. 2025-10-22 15:52:51 +02:00
Anders Schack-Mulligen
f172e36eee C#: Address more review comments. 2025-10-22 15:50:10 +02:00
Paolo Tranquilli
35990586ae Merge pull request #20672 from github/redsun82/copilot
Copilot: move instructions to path-specific files
2025-10-22 15:41:28 +02:00
Michael Nebel
83343e1031 Merge pull request #20663 from michaelnebel/csharp/dotnet10rc2traced
C#: Tracer support for invoking `csc` directly.
2025-10-22 15:36:34 +02:00
Tom Hvitved
cf05414a93 Address review comments (iv) 2025-10-22 15:29:57 +02:00
Geoffrey White
6878a43223 Rust: Add missing file. 2025-10-22 14:18:16 +01:00
Paolo Tranquilli
f0c56edfc7 Update .github/instructions/expected-files.instructions.md
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-22 15:14:51 +02:00
Paolo Tranquilli
31627b4eb9 Copilot: move instructions to path-specific files
This is now supported. See

https://docs.github.com/en/copilot/how-tos/configure-custom-instructions/add-repository-instructions

for details.
2025-10-22 14:54:37 +02:00
Geoffrey White
8336a956c0 Rust: Add consistency check failures. 2025-10-22 13:50:49 +01:00
Michael Nebel
47c751be32 C#: Only run integration test on windows and linux. 2025-10-22 14:12:17 +02:00
Michael Nebel
6a02649334 Merge pull request #20555 from michaelnebel/csharp/staridlocationsbuildless
C#: `*` on Source locations in BMN.
2025-10-22 13:28:11 +02:00
Michael Nebel
7a414089e4 C#: Use autobuilder instead of supplying build command. 2025-10-22 13:25:23 +02:00
Michael Nebel
e14879ba33 C#: Add integration test for DB creation using .NET 10 RC 2. 2025-10-22 12:59:40 +02:00
Michael Nebel
d5ff9bf5d0 C#: Collapse tracer cases for csc, csc.exe and mcs.exe and remote quoting. 2025-10-22 11:58:02 +02:00
Owen Mansel-Chan
50e0ca8cb4 Merge pull request #20622 from owen-mc/docs/fix-dataflow-examples
Docs: add path query example to data flow docs
2025-10-22 10:57:42 +01:00
Tom Hvitved
2cc8b7f6dd Address review comments (iii) 2025-10-22 11:07:20 +02:00
Anders Schack-Mulligen
c44e6fc3f0 C#: Qldoc tweaks. 2025-10-22 10:22:26 +02:00
Geoffrey White
9b11ec53d4 Rust: Merge InlineFlow.ql test queries using .qlrefs. 2025-10-22 09:02:18 +01:00
Geoffrey White
4893f53607 Rust: Fix a comment. 2025-10-22 09:02:15 +01:00
Geoffrey White
42224fe642 Rust: Clean up the sources test directory. 2025-10-22 09:02:14 +01:00
Geoffrey White
7efd4d26a0 Rust: Accept result regression.
Presumably because of a change in context, e.g. the module wrapping
this test now, or the different inputs.  Either way we *should* be
able to get the result, and what we *actually* get in our analysis
doesn't change here either.  We've just slightly changed the test
and exposed a gap.
2025-10-22 09:02:12 +01:00
Geoffrey White
8a7e206401 Rust: Move the remaining test_futures_io test into net. 2025-10-22 09:02:11 +01:00
Geoffrey White
8c02cb2ed1 Rust: Split off sources/web_frameworks. 2025-10-22 09:02:10 +01:00
Geoffrey White
5ba331e986 Rust: Splits off sources/net. 2025-10-22 09:01:34 +01:00
Geoffrey White
7ddd441e5f Rust: Split off sources/database test. 2025-10-22 09:00:42 +01:00
Geoffrey White
81132beec0 Rust: Split off sources/stdin test. 2025-10-22 09:00:18 +01:00
Geoffrey White
0cc9331abf Rust: Split off sources/file test. 2025-10-22 08:59:50 +01:00
Geoffrey White
a631130030 Rust: Split off sources/env test. 2025-10-22 08:58:59 +01:00
Tom Hvitved
5550da4870 Address review comments (ii) 2025-10-21 20:53:39 +02:00
Tom Hvitved
41602d3efa Address review comments 2025-10-21 18:44:42 +02:00
Tom Hvitved
c2ba4ba3fc Rust: Add change note 2025-10-21 18:44:41 +02:00
Tom Hvitved
ee0467d74c Rust: Update expected output 2025-10-21 18:44:37 +02:00
Tom Hvitved
2f2c6866c4 Rust: Use doublyBoundedFastTC in TraitIsVisible 2025-10-21 17:58:54 +02:00
Tom Hvitved
4b70d20cd6 Rust: Rework call resolution and type inference for calls 2025-10-21 17:58:52 +02:00
Tom Hvitved
e12e9045a3 Rust: Add more type inference tests 2025-10-21 17:58:51 +02:00
Owen Mansel-Chan
c8c1c6e592 Address review comments 2025-10-21 16:54:28 +01:00
REDMOND\brodes
b374ba3d0c Crypto: Updating java 'location' information to be just a location's toString to be more verbose/precise. 2025-10-21 11:48:37 -04:00
Paolo Tranquilli
6d31c6abe0 Merge branch 'main' into redsun82/fix-pytest-build-as-test-windows 2025-10-21 17:04:57 +02:00
REDMOND\brodes
ddeb42cddb Crypto: Adding false positive to BadMacUse.java, we have no way to avoid this FP currently but should note it exists in the test case. 2025-10-21 11:04:57 -04:00
Paolo Tranquilli
a0d2005e1f Merge pull request #20655 from github/redsun82/rust-file-semantics-predicates
Rust: introduce `ExtractedFile::hasSemantics` and `::isSkippedByCompilation`
2025-10-21 17:02:28 +02:00
REDMOND\brodes
c50175bc9b Crypto: ql-for-ql alert fixes. 2025-10-21 10:32:00 -04:00
Geoffrey White
edabfa73bf Rust: Delete a no-longer-used test file. 2025-10-21 15:30:32 +01:00
Simon Friis Vindum
f207404b0d C++: Accept test changes 2025-10-21 16:03:12 +02:00
Geoffrey White
7da00b3e9d Rust: Change note. 2025-10-21 13:33:17 +01:00
Geoffrey White
751d62aefb Rust: Add the metric to rust/diagnostic/database-quality (with a very low threshold for the time being). 2025-10-21 13:29:46 +01:00
Geoffrey White
a4aa397ea0 Merge pull request #20634 from geoffw0/mysql2
Rust: Model mysql and mysql_async sources
2025-10-21 13:23:03 +01:00
yoff
9e77e5b046 java: add test with deeper paths
also format test files
2025-10-21 14:02:36 +02:00
yoff
f183a7223f java: add test for notFullyMonitored 2025-10-21 13:40:29 +02:00
yoff
f4878b3806 java: make as many predicates private as possible 2025-10-21 13:25:26 +02:00
yoff
de05bfbce3 java: address review comments
- do not use `getQualifiedName`
- use camelCase
- rework alert predicates
2025-10-21 13:25:26 +02:00
Michael Nebel
def522d122 C#: Make sure that the file exists before attempting to get version info. 2025-10-21 13:12:21 +02:00
Michael Nebel
af5622a60e C#: Address review comments. 2025-10-21 13:03:53 +02:00
Geoffrey White
d691c3215f Rust: Add expressions with unknown type metric (expected by DCA). 2025-10-21 12:00:25 +01:00
yoff
715acefacc Apply suggestions from code review
Co-authored-by: Anders Schack-Mulligen <aschackmull@users.noreply.github.com>
2025-10-21 12:52:59 +02:00
Anders Schack-Mulligen
414e5ecbce Merge pull request #20646 from aschackmull/ssa/ssa-sig
SSA: Add a shared signature for SSA and a module to implement it.
2025-10-21 12:14:08 +02:00
Paolo Tranquilli
316225bb88 Csharp: rename predicate 2025-10-21 11:47:54 +02:00
Paolo Tranquilli
6f8b1f6f4c Csharp: address review 2025-10-21 11:43:58 +02:00
Michael Nebel
6bc15bcedc C#: Add change-note. 2025-10-21 11:42:19 +02:00
Michael Nebel
e560ac197f C#: Tracer support for invoking csc directly. 2025-10-21 11:16:55 +02:00
Paolo Tranquilli
c728503517 Merge branch 'main' into redsun82/csharp-fix-xframe-options-in-location 2025-10-21 11:15:46 +02:00
Anders Schack-Mulligen
242f12d4be SSA: Remove variable capture reference from shared class. 2025-10-21 10:52:49 +02:00
Simon Friis Vindum
0badcfd663 C++: Address review comments 2025-10-21 09:47:58 +02:00
REDMOND\brodes
22c0f9fa91 Crypto: Adding a proof of concept bad mac ordering predicate that takes in an ArtifactNode to be used for graph generation to intercept nodes with known mac ordering issues, in order to format the node and output error messages in the graph. 2025-10-20 16:24:31 -04:00
REDMOND\brodes
eff94ef91f Crypto: To allow for graph generation to have properties informed by assessments, altering a few queries weak/vuln/bad crypto to have qll files that can be accessed for other purposes, like graph generation. Also altering weak symmetric cipher to look for non-aes algorithms to be more comprehensive. 2025-10-20 15:51:07 -04:00
REDMOND\brodes
cc436e897d Merge branch 'santander-java-crypto-check' of https://github.com/bdrodes/codeql into santander-java-crypto-check 2025-10-20 15:24:40 -04:00
REDMOND\brodes
354effe829 Crypto: Missing hash algorithms for HMAC operations in jca. 2025-10-20 15:24:18 -04:00
Taus
9efa20dfc7 Merge pull request #20654 from github/tausbn/add-query-history-patcher
Misc: Add script for patching the query history
2025-10-20 17:46:39 +02:00
Florin Coada
2c31090cf6 Update codeql-cli-2.23.3.rst 2025-10-20 14:20:17 +01:00
Florin Coada
aeee30b0c6 Add changelog entry for CodeQL CLI version 2.23.3 2025-10-20 14:17:40 +01:00
Geoffrey White
e4e7b1c528 Merge branch 'main' into mysql2 2025-10-20 14:06:48 +01:00
Anders Schack-Mulligen
be626bf0ce SSA: Address some review comments. 2025-10-20 14:02:56 +02:00
Geoffrey White
1047c3e014 Merge pull request #20652 from geoffw0/gen1
Rust: Generalize some models
2025-10-20 12:37:53 +01:00
Asger F
d7cf5ef645 Merge pull request #20647 from asgerf/js/type-resolution-cache
JS: Avoid magic and improve a join in type resolution
2025-10-20 11:50:23 +02:00
Geoffrey White
7b32cd4868 Merge pull request #20649 from geoffw0/mv1
Rust: Move rust/weak-sensitive-data-hashing
2025-10-20 10:17:40 +01:00
Tom Hvitved
85abcddd0e Merge pull request #20614 from hvitved/dataflow/debug-predicates
Data flow: Add various debug predicates
2025-10-20 11:01:41 +02:00
Michael B. Gale
4441303623 Merge pull request #20625 from github/mbg/csharp/proxy-log-messages 2025-10-20 10:00:58 +01:00
Tom Hvitved
f71cfac40a Data flow: Add various debug predicates 2025-10-20 09:59:40 +02:00
Ben Rodes
2b683c210f Merge branch 'main' into santander-java-crypto-check 2025-10-18 17:56:43 -04:00
REDMOND\brodes
c01c060476 Crypto: more ID renaming to include "examples", fix singleton issues with ql-for-ql, use formatted test for WeakAsymmetricKeyGenSize (add post processing in the qlref), misc expected files updated (test passed locally but on rerun vscode reports failures, known bug with vscode unit tests). 2025-10-17 14:13:53 -04:00
REDMOND\brodes
540daa6df2 Crypto: weak symmetric cipher tests. 2025-10-17 13:40:15 -04:00
REDMOND\brodes
b06e05362b Crypto: altering all query IDs in examples to have "examples" in the ID, to make clear the query is not intended for production. 2025-10-17 13:39:50 -04:00
REDMOND\brodes
1b205d8673 Removing WeakRSA, this is redundant with weak asymmetric key size. 2025-10-17 13:39:05 -04:00
REDMOND\brodes
b4ecb91c83 Crypto: Add missing cipher algorithms to JCA. Update node tests to account for missing cipher algorithms. 2025-10-17 13:38:47 -04:00
REDMOND\brodes
f480d90a68 Crypto: Add missing block mode JCA Models, add block mode unit tests 2025-10-17 13:13:14 -04:00
REDMOND\brodes
e12734162f Crypto: WeakKDFKeySize tests. 2025-10-17 12:32:24 -04:00
REDMOND\brodes
628bab92fc Crypto: Modify BadMacOrderMacOnEncryptPlaintext to be a path query that traces through any intermediate encrypt or mac to the final encrypt or mac. 2025-10-17 12:06:34 -04:00
REDMOND\brodes
ff7840dc9f Crypto: removing precision tags on experimental queries. 2025-10-17 10:52:32 -04:00
Paolo Tranquilli
4b04b49ca9 Merge branch 'main' into redsun82/rust-file-semantics-predicates 2025-10-17 15:10:55 +02:00
Paolo Tranquilli
6a6015e0eb Rust: accept test changes 2025-10-17 15:10:49 +02:00
Owen Mansel-Chan
66f95bcbcd Merge pull request #20603 from owen-mc/update-broken-algo-qhelp
Many languages: Update broken algo qhelp
2025-10-17 12:30:43 +01:00
Paolo Tranquilli
0c719af33c Csharp: add change note 2025-10-17 12:05:52 +02:00
Paolo Tranquilli
c3fd06c8a4 Csharp: fix cs/web/missing-x-frame-options to also consider location elements
As explained in

https://learn.microsoft.com/en-us/previous-versions/aspnet/ms178692(v=vs.100),

it is possible to add `system.webServer` elements nested inside
`location` elements in `Web.config`.
2025-10-17 11:27:31 +02:00
Simon Friis Vindum
979b05cc1a C++: Apply suggested fixes from review 2025-10-17 09:50:36 +02:00
yoff
3a0a8999d5 java: fix ql alerts 2025-10-17 01:52:23 +02:00
yoff
61a3e9630f java: rewrite conflict detection
- favour unary predicates over binary ones
(the natural "conflicting access" is binary)
- switch to a dual solution to trade recursion through forall for simple existentials.

Co-authored-by: Anders Schack-Mulligen <aschackmull@github.com>
2025-10-17 01:43:04 +02:00
REDMOND\brodes
ef6f0222f2 Crypto: Addressing FPs in BadMacOrderMacOnEncryptPlaintext 2025-10-16 16:11:42 -04:00
REDMOND\brodes
5923e5cbb0 Crypto: Bad expected files in last push. 2025-10-16 15:45:27 -04:00
REDMOND\brodes
700f34e53a Crypto: Bad Mac use tests, and fix for BadMacOrderMacOnEncryptPlaintext (barriers were blocking flow through an encrypt to a subsequent mac on the same plaintext) 2025-10-16 15:44:57 -04:00
REDMOND\brodes
b9b0037e07 Crypto: Comment todo for observed missing modeled case. Tests for weak and unknown KDF iteration count. 2025-10-16 14:07:45 -04:00
Paolo Tranquilli
4aef1ba9d1 Rust: clean up 2025-10-16 17:20:41 +02:00
REDMOND\brodes
3f36b09b3c Crypto: Rename tests for weak asymmetric key gen size. 2025-10-16 11:18:36 -04:00
Paolo Tranquilli
a9ae583e14 Rust: introduce File::hasSemantics and File::isSkippedByCompilation 2025-10-16 17:08:12 +02:00
REDMOND\brodes
a64a24d25d Crypto: Comment in Language.qll 2025-10-16 11:03:49 -04:00
REDMOND\brodes
79ccef3a58 Crypto: Initial sketch for unknown hash, the model needs to recognize unknowns but where the algorithm category (e.g., hashing) is known. 2025-10-16 11:03:16 -04:00
Taus
3c2635767e Misc: Add script for patching the query history
Adds `patch_query_history.py` in the `misc/scripts` directory. Its
function is to extend the existing VSCode query history with a new entry
whose JSON evaluator log summary points at a log that was created
outside of VSCode.

This enables the use of e.g. the Performance Comparison View on runs
that were not initiated from within VSCode.
2025-10-16 15:00:43 +00:00
REDMOND\brodes
d2598d4f5d Crypto: Updating weak hash tests 2025-10-16 10:56:08 -04:00
REDMOND\brodes
4860034d41 Crypto: Weak Hash test cases update and expected file. 2025-10-16 10:40:53 -04:00
Geoffrey White
5d95fad467 Rust: Changes suggested by Copilot (with effect on tests). 2025-10-16 14:59:06 +01:00
Simon Friis Vindum
68d4240c26 C++: Add change note 2025-10-16 15:56:11 +02:00
Simon Friis Vindum
9502d83f2c C++: Add debug predicates 2025-10-16 15:05:48 +02:00
Simon Friis Vindum
c1f0f3da96 C++: Handle guard phi nodes differently 2025-10-16 15:05:46 +02:00
Simon Friis Vindum
99103a5741 C++: Add additional test for range analysis 2025-10-16 15:05:45 +02:00
Simon Friis Vindum
8896a7210b C++: Add number of bounds test to simple range analysis 2025-10-16 15:05:44 +02:00
Simon Friis Vindum
7eacd87343 C++: Apply widening based on number of bounds measure 2025-10-16 15:05:42 +02:00
Geoffrey White
397563dd0e Rust: Accept consistency check .expected changes. 2025-10-16 13:54:11 +01:00
Nora Dimitrijević
e120e5c3ba Merge pull request #20337 from d10c/d10c/python-overlay-compilation-plus-extractor
Python: enable overlay compilation + extractor overlay support
2025-10-16 14:49:01 +02:00
Geoffrey White
d4a599c51d Rust: Accept more minor test expectation changes. 2025-10-16 12:41:49 +01:00
Geoffrey White
b933f8df89 Merge branch 'main' into gen1 2025-10-16 12:38:59 +01:00
Geoffrey White
8f7d3798ad Rust: Allow rows to be direct sources of taint as well. 2025-10-16 12:14:50 +01:00
Geoffrey White
f310d535ae Rust: Add models. 2025-10-16 12:07:54 +01:00
Geoffrey White
08ca643cd3 Rust: Test sources for mysql and mysql_async. 2025-10-16 11:55:24 +01:00
Geoffrey White
75a34a4881 Merge pull request #20631 from geoffw0/mysql
Rust: Model mysql and mysql_async query sinks
2025-10-16 11:42:33 +01:00
Geoffrey White
ee86655742 Rust: Update another affected test. 2025-10-16 11:37:57 +01:00
Geoffrey White
c56de30248 Rust: Fix merge conflict in .expected file. 2025-10-16 11:16:54 +01:00
Geoffrey White
c30e9a96d4 Rust: Accept changes to other test expectations. 2025-10-16 11:00:29 +01:00
Geoffrey White
217508e2c2 Merge branch 'main' into gen1 2025-10-16 09:35:29 +01:00
Geoffrey White
1936abaaee Merge pull request #20650 from geoffw0/mv2
Rust: Rename stdlib model files to be consistent with others.
2025-10-16 08:47:47 +01:00
Simon Friis Vindum
744b11e421 Merge pull request #20543 from paldepind/rust/model-actix-web
Rust: Add models for actix-web
2025-10-16 08:48:06 +02:00
REDMOND\brodes
25599e9b4b crypto: Update JCA model macs to take into consideration update calls (use prior pattern for signatures). Misc. bug fixes. 2025-10-15 16:25:36 -04:00
Geoffrey White
510597666a Rust: Change note. 2025-10-15 20:31:47 +01:00
Geoffrey White
612e95b7a4 Rust: More deduplication. 2025-10-15 20:31:46 +01:00
Geoffrey White
483ab5929a Rust: Combine and expand some of the models. 2025-10-15 20:31:43 +01:00
REDMOND\brodes
15e266db94 Crypto: Tweaks to bad crypto ordering queries. 2025-10-15 14:20:40 -04:00
REDMOND\brodes
9a6aac1300 Crypto: To get unreferenced parameters as general sources for Java, I've included the caveat that if a function is called, all the calls appear to be in test files. 2025-10-15 14:20:16 -04:00
REDMOND\brodes
c6174fbb93 Crypto: remove precision tag 2025-10-15 14:10:16 -04:00
Geoffrey White
ea6c7cfba0 Rust: Generalize stdlib 'a as b' models. 2025-10-15 19:08:05 +01:00
Geoffrey White
072eca233d Rust: Update consistency check .expected. 2025-10-15 16:50:47 +01:00
Geoffrey White
eb1555c45e Rust: Update the suite list .expected files. 2025-10-15 16:08:08 +01:00
Geoffrey White
f4a6efa9e0 Rust: Rename stdlib model files to be consistent with others. 2025-10-15 16:02:42 +01:00
REDMOND\brodes
631e482fd6 Crytpo: when key encapsulation or cipher operations have multiple modes at a node, the node name must reflect that it may be any mode. 2025-10-15 11:01:49 -04:00
Geoffrey White
c68112fb60 Rust: Move the CWE-328 test. 2025-10-15 15:24:25 +01:00
Geoffrey White
c7f0e41660 Rust: Move the existing CWE-327 test. 2025-10-15 15:24:14 +01:00
Geoffrey White
9dcc0a0d81 Rust: Move rust/weak-sensitive-data-hashing to CWE-327. 2025-10-15 15:14:16 +01:00
Geoffrey White
48ca04bc40 Rust: Repair test annotations following format and accept .expected changes. 2025-10-15 15:00:28 +01:00
Geoffrey White
28c139abfb Rust: Format the test. 2025-10-15 14:42:12 +01:00
Geoffrey White
5544dfff6d Update rust/ql/test/query-tests/security/CWE-089/mysql.rs
Co-authored-by: Simon Friis Vindum <paldepind@github.com>
2025-10-15 14:31:10 +01:00
REDMOND\brodes
c7be23e1fe Crypto: Remove all precision tags from all experimental queries. Precision is largely in flux while the models are being developed. 2025-10-15 09:22:04 -04:00
REDMOND\brodes
bf9a249624 Crypto: Experimental queries for mac ordering 2025-10-15 08:06:50 -04:00
REDMOND\brodes
ee08385e31 Crytpo: Update JCA keyagreement to type conversion, XDH is a type of ECDH. 2025-10-15 08:06:19 -04:00
Jeroen Ketema
129c8bf2e0 Merge pull request #20639 from jketema/swift-trace
Swift: Make tracer config handle resource-dirs passed to clang
2025-10-15 13:16:15 +02:00
Asger F
c6577c8590 JS: Avoid magic and improve a join in type resolution 2025-10-15 11:54:28 +02:00
Simon Friis Vindum
70a8c4f37f C++: Add range analysis examples that explode 2025-10-15 11:42:17 +02:00
Joe Farebrother
f57526eedc Merge pull request #20572 from joefarebrother/java-httponly-cookie-promote
Java: Promote Sensitive Cookie without HttpOnly query from experimental
2025-10-15 10:28:40 +01:00
Simon Friis Vindum
8aaf9f696a C++: Factor out widening of bounds 2025-10-15 11:11:45 +02:00
Anders Schack-Mulligen
b196714794 SSA: Add a shared signature for SSA and a module to implement it. 2025-10-15 11:01:58 +02:00
Jeroen Ketema
9fc8faa048 Swift: Address review comments 2025-10-15 10:09:13 +02:00
Napalys Klicius
7bf677d056 Merge pull request #20644 from Napalys/napalys/remove_quality_syntax_err
JS: remove quality tag from SyntaxError query
2025-10-15 09:45:02 +02:00
Napalys Klicius
45e8164f14 JS: remove quality tag from SyntaxError query 2025-10-15 09:07:11 +02:00
Joe Farebrother
e95e1a0386 Update integration test 2025-10-14 16:27:28 +01:00
Joe Farebrother
d8b37d0cde Review suggestions - update comments and description 2025-10-14 16:03:40 +01:00
Paolo Tranquilli
b6aee67b42 Pytest: fix the build-as-test mode on Windows
This mode (enabled with `--codeql=build-as-test` or setting
`PYTEST_CODEQL=build-as-test` in the environment) is an experimental
mode that makes the pytest dist installation run as a test. This
allows to avoid running the installation in case nothing changed in the
dist, leveraging bazel's test caching mechanism, and accelrating the
dev loop when working on integration test code. This mode might become
the default for devs in the future.

Up until now, this mode was only working on POSIX systems. This commit
fixes it on Windows. The issue was `native_test` being unable to wrap
a `py_binary` target because of an `.exe` suffix mismatch. Turning the
`native_test` into a full-fledged `py_test` solves the issue.
2025-10-14 15:44:07 +02:00
Owen Mansel-Chan
2e0915ebed Add missing links to "Creating path queries" 2025-10-14 13:21:52 +01:00
Henry Mercer
c2309a9aca Merge pull request #20638 from github/post-release-prep/codeql-cli-2.23.3
Post-release preparation for codeql-cli-2.23.3
2025-10-14 13:03:22 +01:00
Jeroen Ketema
b6b3767460 Swift: Make tracer config handle resource-dirs passed to clang 2025-10-14 13:50:36 +02:00
Anders Schack-Mulligen
da0b168b2e Merge pull request #20627 from hvitved/csharp/property-descriptor-get-value-neutral
C#: Add neutral model for `System.ComponentModel.PropertyDescriptor.GetValue`
2025-10-14 13:31:40 +02:00
github-actions[bot]
6dd07790ac Post-release preparation for codeql-cli-2.23.3 2025-10-14 11:16:33 +00:00
Henry Mercer
aa3000df13 Merge pull request #20637 from github/henrymercer/update-expected-output
Actions: Update `SecretExfiltration` output for typo fix
2025-10-14 11:47:18 +01:00
Henry Mercer
b737bccb07 Python: Fix "be be" typos in qhelp 2025-10-14 11:33:24 +01:00
Henry Mercer
5310469d69 Actions: Update SecretExfiltration output for typo fix 2025-10-14 11:33:01 +01:00
Henry Mercer
836e3958a9 Merge pull request #20635 from github/release-prep/2.23.3
Release preparation for version 2.23.3
2025-10-14 11:17:48 +01:00
Henry Mercer
17352a101d Rephrase C++ BMN changelog note 2025-10-14 11:13:23 +01:00
Henry Mercer
9466279909 Prefer code quotes for BMN 2025-10-14 11:10:42 +01:00
Henry Mercer
9507ec0853 Fix "be be" typos 2025-10-14 11:09:43 +01:00
github-actions[bot]
33542f7d40 Release preparation for version 2.23.3 2025-10-14 09:30:24 +00:00
REDMOND\brodes
55bbcee301 Crypto: Make WeakAsymmetricKeyGenSize a path problem. 2025-10-13 17:04:29 -04:00
REDMOND\brodes
7e8acd76c3 Crypto: Update WeakAsymmetricKeyGenSize to a path problem. 2025-10-13 15:48:32 -04:00
REDMOND\brodes
8b5a42328e Crypto: Convert ReusedNonce.ql into a path problem. 2025-10-13 15:34:41 -04:00
REDMOND\brodes
7847e92670 Crypto: Update KDF iteration and count to be path problems 2025-10-13 15:30:53 -04:00
REDMOND\brodes
76128ed8dc Crypto: Update InsecureIVorNonce to be a path problem. 2025-10-13 15:29:57 -04:00
Geoffrey White
93eb7ce1af Rust: Accept test changes following suggested edit. 2025-10-13 19:28:40 +01:00
Geoffrey White
35f3fbf357 Rust: Accept consistency regressions. 2025-10-13 19:19:18 +01:00
REDMOND\brodes
bd068c2a69 Crypto: Updating expected file for weak asymmetric key gen size. 2025-10-13 12:08:07 -04:00
REDMOND\brodes
4b241d7065 Crypto: adding initial weak hash query overhaul and tests, but no expected file yet. 2025-10-13 12:04:51 -04:00
REDMOND\brodes
08abdb8c85 Crypto: Adding a "javaConstant" concept to handle config files. 2025-10-13 12:03:41 -04:00
Geoffrey White
1d7ccb6f2b Update rust/ql/lib/codeql/rust/frameworks/mysql.model.yml
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-13 16:42:36 +01:00
yoff
ab78f2b724 Merge pull request #20630 from github/tausbn/python-fix-importerror-in-imp
Python: Fix `ImportError` in `imp.py` under Python 3.14
2025-10-13 17:31:47 +02:00
Simon Friis Vindum
d9c76f258e Rust: Add suggested model for into_inner for tuples 2025-10-13 16:22:03 +02:00
Simon Friis Vindum
9e2ee04879 Merge branch 'main' into rust/model-actix-web 2025-10-13 16:04:12 +02:00
Joe Farebrother
9cb593b020 Update tests 2025-10-13 14:51:37 +01:00
Joe Farebrother
093b04f79f Update comments 2025-10-13 14:51:30 +01:00
Joe Farebrother
696ec29dae Upgrade integration tests 2025-10-13 14:51:24 +01:00
Joe Farebrother
1c54296545 Add change note 2025-10-13 14:51:17 +01:00
Joe Farebrother
c4781146c0 Remove experimental query and tests 2025-10-13 14:51:10 +01:00
Joe Farebrother
c799f93811 Update tests and add inline expectations 2025-10-13 14:51:04 +01:00
Joe Farebrother
e1cf3d30d2 Update documentation, rename things and add more comments to explain how the implementation works, remove filter for test code (prefer to filter in code scanning ui than in query logic) 2025-10-13 14:50:57 +01:00
Joe Farebrother
54aefe0dce Copy experimental query to main 2025-10-13 14:50:51 +01:00
Taus
c4b27d5f28 Python: Fix ImportError in imp.py under Python 3.14
It seems `_ERR_MSG` was silently removed in Python 3.14, leading to an
`ImportError` when running the extractor.

To fix this, we explicitly set `_ERR_MSG` when the existing import fails
(using `_ERR_MSG_PREFIX` which is available in Python 3.14+, along with
the bits that make up the difference between this and `_ERR_MSG`).
2025-10-13 13:50:43 +00:00
Mathias Vorreiter Pedersen
b57243e073 Merge pull request #20579 from aschackmull/shared/rangeanalysis-joinorder
Rangeanalysis: Fix a bad join-order in boundedPhiRankStep.
2025-10-13 14:46:48 +02:00
Michael B. Gale
e65f8eacbc Merge pull request #20609 from github/dependabot/go_modules/go/extractor/extractor-dependencies-5148baeadc
Bump the extractor-dependencies group in /go/extractor with 2 updates
2025-10-13 10:33:14 +01:00
dependabot[bot]
500421d891 Bump the extractor-dependencies group in /go/extractor with 2 updates
Bumps the extractor-dependencies group in /go/extractor with 2 updates: [golang.org/x/mod](https://github.com/golang/mod) and [golang.org/x/tools](https://github.com/golang/tools).


Updates `golang.org/x/mod` from 0.28.0 to 0.29.0
- [Commits](https://github.com/golang/mod/compare/v0.28.0...v0.29.0)

Updates `golang.org/x/tools` from 0.37.0 to 0.38.0
- [Release notes](https://github.com/golang/tools/releases)
- [Commits](https://github.com/golang/tools/compare/v0.37.0...v0.38.0)

---
updated-dependencies:
- dependency-name: golang.org/x/mod
  dependency-version: 0.29.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: extractor-dependencies
- dependency-name: golang.org/x/tools
  dependency-version: 0.38.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: extractor-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-13 03:14:48 +00:00
Tom Hvitved
2577452849 C#: Add neutral model for System.ComponentModel.PropertyDescriptor.GetValue 2025-10-12 09:06:54 +02:00
REDMOND\brodes
e76ced1513 Crypto: Updating weak asymmetric key gen to include key exchange. 2025-10-10 15:32:39 -04:00
REDMOND\brodes
d68f3cff8b Crypto: InsecureIVorNonceSource now ignored null to avoid being too noisy. 2025-10-10 14:51:16 -04:00
REDMOND\brodes
ffd191d0e1 Crypto: missing new endpoint to get the creating operation for a key if known. 2025-10-10 14:50:50 -04:00
REDMOND\brodes
36673659ad Crypto: Weak asymmetric key gen size fixes and test. 2025-10-10 14:49:35 -04:00
REDMOND\brodes
758759a304 Crypto: Reused nonce query updates and test updates to address false positives. 2025-10-10 12:25:31 -04:00
Geoffrey White
106bad2764 Rust: Add test cases for bad use of prepared statements as well. 2025-10-10 17:17:08 +01:00
Geoffrey White
c102ce41b7 Rust: Claim support for the two libraries. 2025-10-10 17:12:48 +01:00
Geoffrey White
859c1ef55d Rust: Change note. 2025-10-10 17:11:20 +01:00
Geoffrey White
f16742bf74 Rust: Add models. 2025-10-10 17:09:46 +01:00
Michael B. Gale
47632cdbd1 C#: Improve log messages in DotNetCliInvoker 2025-10-10 17:08:24 +01:00
Owen Mansel-Chan
944e116cc0 Add path query example to other lang data flow docs 2025-10-10 16:22:50 +01:00
Geoffrey White
f15a34f361 Rust: Add test cases for transactions as well. 2025-10-10 16:10:57 +01:00
Geoffrey White
883e00558a Rust: Add test cases for the mysql_async library. 2025-10-10 16:10:56 +01:00
Geoffrey White
ef93b364da Rust: Add test cases for the mysql library. 2025-10-10 15:05:21 +01:00
Owen Mansel-Chan
3c80690ba8 Fix link syntax 2025-10-10 13:58:19 +01:00
Michael Nebel
9ec0c9d5f2 C#: Add change note. 2025-10-10 14:06:45 +02:00
Michael Nebel
56ff0baba3 C#: Use * IDs for source locations. 2025-10-10 14:03:49 +02:00
Michael Nebel
ab9f78fee2 Merge pull request #20617 from michaelnebel/csharp/unboundlocations
C#: Reduce location TRAP creation for Fields, Parameters, Constructors, Destructors and Operators.
2025-10-10 13:47:57 +02:00
Tom Hvitved
d842107633 Merge pull request #20621 from hvitved/rust/static-target-addressable
Rust: Include tuple structs/variants in `CallExprBase.getStaticTarget()`
2025-10-10 13:00:28 +02:00
Michael Nebel
b8c3a28de3 C#: Add change note. 2025-10-10 11:47:19 +02:00
Owen Mansel-Chan
100463572b Add path query example to python data flow docs 2025-10-10 10:37:09 +01:00
Owen Mansel-Chan
2930e793f1 Fix mistakes in Go data flow examples in docs 2025-10-10 10:36:23 +01:00
Owen Mansel-Chan
87f32dc49f Merge pull request #20613 from owen-mc/go/sanitize-simpletypes-request-forgery
Go: sanitize simple types in `go/request-forgery`
2025-10-10 09:15:30 +01:00
Tom Hvitved
0fc2875527 Rust: Include tuple structs/variants in CallExprBase.getStaticTarget() 2025-10-10 09:48:08 +02:00
Owen Mansel-Chan
2c6af0cdb7 Merge pull request #20580 from owen-mc/codeowners-for-shared-libs-and-catchall
Add code owners for `/shared/` and a catch-all
2025-10-09 16:31:17 +01:00
Michael Nebel
e8fd843e52 C#: Update some tuple related tests. 2025-10-09 16:33:47 +02:00
Owen Mansel-Chan
11f20457e2 Fix team name 2025-10-09 14:15:07 +01:00
REDMOND\brodes
fba80870a6 Crypto: Example query reorg - moving queries of this PR into 'examples' subdirectories. 2025-10-09 09:03:00 -04:00
REDMOND\brodes
deb43735be Crypto: Minor fixes to WeakSymmetricCipher, change to a singular name for consistency. 2025-10-09 08:39:39 -04:00
yoff
5109babd92 java: add qldoc
These interfaces were previously in a .ql file.
Also, use the XXAccess variants.
2025-10-09 14:20:28 +02:00
REDMOND\brodes
3dedda4233 Merge branch 'santander-java-crypto-check' of https://github.com/bdrodes/codeql into santander-java-crypto-check 2025-10-09 08:18:04 -04:00
REDMOND\brodes
c6cc4fff51 Crypto: Minor fixes to WeakBlockModes, WeakHash to consider SHA3 ok, Added unknown hash. 2025-10-09 08:16:28 -04:00
Michael Nebel
89681a49e6 C#: Only extract the unbound locations for constructors, destructors and user defined operators and use this in the QL code. 2025-10-09 14:13:27 +02:00
Michael Nebel
02428fc467 C#: Add some location examples for constructors, destructors and operators. 2025-10-09 14:13:24 +02:00
Michael Nebel
051b83f036 C#: Only extract the unbound location for fields and parameters and use this location in the QL code. 2025-10-09 14:04:13 +02:00
Michael Nebel
f200c3ce85 C#: Add field location example. 2025-10-09 14:04:10 +02:00
Michael Nebel
b9eae31172 C#: Add parameter locations test. 2025-10-09 14:04:08 +02:00
Nicolas Will
fdba3acc4b Crypto: Fix QL-for-QL alert and auto-format 2025-10-09 13:59:51 +02:00
yoff
1ad239459f java: move shared code into Concurrency.qll 2025-10-09 13:36:35 +02:00
Owen Mansel-Chan
37151791b4 Add change notes 2025-10-09 12:26:32 +01:00
Owen Mansel-Chan
3cbce80d0b Add SimpleTypeSanitizer to go/request-forgery 2025-10-09 12:17:21 +01:00
Owen Mansel-Chan
7599fdd8fa Add request forgery test for numeric type 2025-10-09 12:17:19 +01:00
Owen Mansel-Chan
0c9cd09140 Make NumericOrBooleanSanitizer easier to access and rename it 2025-10-09 12:17:17 +01:00
yoff
f90e9dbb5e java: favour inline_late over inline
This gives much greater control over the join-order
2025-10-09 13:01:25 +02:00
yoff
26c1b2f143 java: adjust test expectations; new queries are enabled in extended 2025-10-09 12:29:42 +02:00
Idriss Riouak
f52e3dcb7f Merge pull request #20601 from github/idrissrio/java-localhost
Java integration test: wait for test servers to come up before running test
2025-10-09 10:57:11 +02:00
Geoffrey White
a7c166d161 Merge pull request #20599 from geoffw0/rust-ga-change-note
Rust: Add change note for Rust GA.
2025-10-09 08:51:44 +01:00
yoff
830f02af1f java: fixes from the CI bots 2025-10-09 09:37:31 +02:00
yoff
93fc287ef1 java: add auto-generated overlay annotations 2025-10-09 09:25:57 +02:00
yoff
a1671ea8af java: small cleanups
- add missing qldoc
- remove use of `getErasure`
- remove use of `getTypeDescriptor`
- define `ExposedField`
2025-10-09 09:16:25 +02:00
yoff
821b1de5b3 java: inline char pred 2025-10-09 09:16:25 +02:00
yoff
01ddc11fa7 java: address some review comments 2025-10-09 09:16:25 +02:00
yoff
77734f83d5 java: better detection of thread safe fields.
Identified by triage of DCA results.
Previously, we did not use the erased type, so would not recgnize `CompletableFuture<R>`.
We now also recognize safe initializers.
2025-10-09 09:16:25 +02:00
yoff
bf138693a3 java: update expectations for java-code-quality suite 2025-10-09 09:16:07 +02:00
yoff
096d5f2a56 java: implement SCC contraction of the call graph
Our monitor analysis would be fooled by cycles in the call graph,
since it required all edges on a path to a conflicting access to be either
 - targetting a method where the access is monitored (recursively) or
 - monitored locally, that is the call is monitored in the calling method
For access to be monitored (first case) all outgoing edges (towards an access) need
to satisfy this property. For a loop, that is too strong, only edges out of the loop
actually need to be protected. This led to FPs.
2025-10-09 09:14:16 +02:00
yoff
5b30153113 java: add Escaping query (P1) 2025-10-09 09:14:16 +02:00
yoff
328b53576a java: add SafePublication query (P2) 2025-10-09 09:14:16 +02:00
yoff
fe487e8bf0 java: add ThreadSafe query (P3)
Co-authored-by: Raúl Pardo <raul.pardo@protonmail.com>
Co-authored-by: SimonJorgensenMancofi <simon.jorgensen@mancofi.dk>
Co-authored-by: Bjørnar Haugstad Jåtten <bjornjaat@hotmail.com>
2025-10-09 09:14:16 +02:00
idrissrio
546d59ff9d Java: Wait for test HTTP servers to be ready before running buildless test 2025-10-09 08:37:54 +02:00
REDMOND\brodes
f524de4afc Crypto: Updating insecure iv/nonce to consider if an operation is known for it, and if so do not alert on non-secure random if it is tied to decryption 2025-10-08 16:27:18 -04:00
REDMOND\brodes
7a57496c54 Crypto: Missing test update. 2025-10-08 14:16:47 -04:00
REDMOND\brodes
11e81395b5 Crypto: Updated default flows to use taint tracking (this is needed to fix false positives in the unknown IV/Nonce query). Add the unknown IV/Nonce query and associated test cases. Fix unknown IV/Nonce query to focus on cases where the oepration isn't known or the operation subtype is not encrypt or wrap. 2025-10-08 14:14:17 -04:00
REDMOND\brodes
75b5a9fda8 Crypto: Update general regression test results to account for removal of JCA random source. 2025-10-08 12:55:11 -04:00
REDMOND\brodes
8e10e1937d Crypto: Adding query for unknown IV initialization. 2025-10-08 12:49:54 -04:00
REDMOND\brodes
83ff70bcd8 Crypto: Adding tests for insecure iv or nonce. Updating generic literal sources to include array literals. 2025-10-08 12:47:58 -04:00
Jon Janego
83519a9fcc Merge pull request #20606 from github/changedocs-2.23.2
changedocs for 2.23.2
2025-10-08 11:07:58 -05:00
Jon Janego
4534d67107 Merge branch 'main' into changedocs-2.23.2 2025-10-08 11:00:45 -05:00
Jon Janego
9c610e8bab Update links in CodeQL CLI changelog 2025-10-08 10:57:17 -05:00
Owen Mansel-Chan
2f22acdd06 Remove hashing example when not covered by query 2025-10-08 16:48:57 +01:00
Jon Janego
f8626cd417 changedocs for 2.23.2 2025-10-08 10:42:10 -05:00
REDMOND\brodes
bd34b6ce02 Crypto: Removing JCA model of random, need to reassess this as this impacts the insecure IV/Nonce query. Updated name of the Insecure nonce query to be InsecureIVorNonce 2025-10-08 11:41:21 -04:00
REDMOND\brodes
143be8cc35 Crypto: Remove redundant queries. 2025-10-08 10:26:05 -04:00
REDMOND\brodes
1b1b333e8b Crypto: Modify suggested queries per misc. side conversations on standards. Remove redundant query. Fix QL-for-QL issues. 2025-10-08 10:21:06 -04:00
REDMOND\brodes
cf88e3f52d Crypto: Standardize naming where use of "family" and "type" have been used. Prefer 'type'. 2025-10-08 09:54:53 -04:00
REDMOND\brodes
bba541c016 Merge remote-tracking branch 'upstream/java-crypto-check' into santander-java-crypto-check 2025-10-08 09:30:26 -04:00
Owen Mansel-Chan
0bcdb91639 Improve qhelp for broken crypto algo queries
Previously it focussed too much on the risk of data being decrypted,
and didn't explain why using weak algorithms is a problem in other
contexts.
2025-10-08 14:10:54 +01:00
Owen Mansel-Chan
2a1c9d8ec1 Remove erroneous comma 2025-10-08 14:08:36 +01:00
Owen Mansel-Chan
90db349f4b State that ruby broken crypto algo doesn't deal with hashing 2025-10-08 14:05:00 +01:00
Geoffrey White
d39c8d155c Merge pull request #20574 from geoffw0/rustga3
Rust: Docs updates
2025-10-08 11:04:29 +01:00
Anders Schack-Mulligen
2d9b249367 Merge pull request #20600 from aschackmull/java/constant-exp-fix
Java: Fix bug in ConstantExpAppearsNonConstant.
2025-10-08 11:40:50 +02:00
Michael Nebel
4cc6a07620 Merge pull request #20593 from michaelnebel/csharp/reducetypeparameterandtuplelocations
C#: Reduce Type Parameter- and Tuple type location extraction.
2025-10-08 11:36:32 +02:00
Anders Schack-Mulligen
99f5dcaaa4 Java: Fix bug in ConstantExpAppearsNonConstant. 2025-10-08 10:32:51 +02:00
Michael Nebel
cdfa58645a C#: Add change-note. 2025-10-08 10:14:51 +02:00
Idriss Riouak
28fe20e3e4 Merge pull request #20595 from github/idrissrio/java-lambda
Java: Add integration test for buildless lambda recovery
2025-10-08 09:53:29 +02:00
Paolo Tranquilli
75a7507017 Merge pull request #20590 from github/redsun82/rust-test-compatibility
Rust: test with the 1.90 toolchain
2025-10-08 09:00:30 +02:00
Asger F
10c9b747a5 Merge pull request #20586 from asgerf/js/api-graphs-block-this
JS: Restrict receiver-flow in API graphs
2025-10-08 08:41:56 +02:00
Geoffrey White
8a2be0910c Rust: Add change note for Rust GA. 2025-10-07 23:10:31 +01:00
Ian Lynagh
2918d30697 Merge pull request #20597 from github/igfoo/bmn-ga
C++: Add a changenote for C/C++ BMN GA
2025-10-07 22:57:32 +01:00
Alexander Eyers-Taylor
825d3709d8 Merge pull request #20386 from github/alexet/overlay-informed-dataflow
Dataflow: Overlay informed dataflow.
2025-10-07 20:22:57 +01:00
Alex Eyers-Taylor
77d4af153d Java: Make some query libraries local. 2025-10-07 18:24:37 +01:00
Alex Eyers-Taylor
193cd46a76 DataFlow: Adress comments on overlay informed dataflow 2025-10-07 17:52:12 +01:00
Alex Eyers-Taylor
7a8d2392ee Daatflow: Fix bug 2025-10-07 17:52:12 +01:00
Alex Eyers-Taylor
542bdf0792 Java: Use Overlay dataflow in java. 2025-10-07 17:52:12 +01:00
Alex Eyers-Taylor
3c110f2eb8 DataFlow: Add code for merging base with overlay. 2025-10-07 17:52:12 +01:00
Alex Eyers-Taylor
c49e2ab2da DataFlow: Add code to do overlay informed dataflow. 2025-10-07 17:52:12 +01:00
Alex Eyers-Taylor
82e4fc9f0f AlertFiltering: Expose filtering further. 2025-10-07 17:52:12 +01:00
Alex Eyers-Taylor
8c02130bcf DataFlow: Rearrange files to group the parts that can be shared with overlay aware. 2025-10-07 17:52:12 +01:00
Ian Lynagh
791a92b146 C++: Add a changenote for C/C++ BMN GA 2025-10-07 17:32:36 +01:00
idrissrio
f69e5f5ffc Java: Accept new test results after extractor changes 2025-10-07 16:55:53 +02:00
idrissrio
55b15a261a Java: Add integration test for buildless lambda recovery 2025-10-07 16:55:52 +02:00
Michael Nebel
eb84b1441a C#: Add some locations tests for type parameters and tuple types. 2025-10-07 15:26:33 +02:00
Michael Nebel
f0842e430d C#: Respect the context when extracting locations for type parameters and tuple typles. 2025-10-07 15:26:31 +02:00
Anders Schack-Mulligen
18e33b193e Merge pull request #20589 from aschackmull/java/array-entrypoint-read-taint
Java: Allow taint-read-steps for array sources.
2025-10-07 15:04:03 +02:00
Michael Nebel
ea4d4751f3 Merge pull request #20581 from michaelnebel/csharp/reducetyplocationtuples
C#: Reduce location tuple extraction for named types.
2025-10-07 14:50:36 +02:00
Paolo Tranquilli
122b7ebba8 Rust: accept test changes 2025-10-07 14:49:08 +02:00
Michael Nebel
584d8c5377 C#: Add change-note. 2025-10-07 14:24:21 +02:00
Anders Schack-Mulligen
7dadbc43fb Java: Add change note. 2025-10-07 13:51:49 +02:00
Owen Mansel-Chan
b0c8fcda35 Merge pull request #20591 from owen-mc/shared/update-inline-expectations-qldoc
Shared: Correct comment about empty `.expected` file
2025-10-07 12:47:11 +01:00
Anders Schack-Mulligen
f0bfd7053e Java: Add test case. 2025-10-07 13:40:44 +02:00
Owen Mansel-Chan
db9bb83898 Move rule for /ql/ for consistency 2025-10-07 12:33:32 +01:00
Owen Mansel-Chan
f83b80a584 Add codeql-alert-coverage-eng as catch-all 2025-10-07 12:32:38 +01:00
Owen Mansel-Chan
101d2ddd4f Use new team for shared library reviewers 2025-10-07 12:12:49 +01:00
Kasper Svendsen
0396756cd9 Merge pull request #20184 from Marcono1234/patch-1
Doc: Fix link to `warnOnImplicitThis` GitHub docs
2025-10-07 13:08:32 +02:00
Kasper Svendsen
74fb46c849 Merge branch 'main' into patch-1 2025-10-07 12:59:56 +02:00
Owen Mansel-Chan
bf76cab7e0 Correct comment about empty .expected file 2025-10-07 11:48:25 +01:00
Idriss Riouak
c809cce170 Merge pull request #20588 from github/idrissrio/macos-26
Java: Fix buildless test HTTP server binding on macOS26
2025-10-07 12:17:51 +02:00
Paolo Tranquilli
ace2ff5775 Rust: test with the 1.90 toolchain 2025-10-07 11:32:20 +02:00
Nora Dimitrijević
c749607db8 Bump python extractor version to 7.1.5 2025-10-07 11:22:16 +02:00
Anders Schack-Mulligen
11665bea0a Java: Allow taint-read-steps for array sources. 2025-10-07 10:10:02 +02:00
Michael Nebel
f9d62a0efc C#: Narrow the use of unbound declaration locations to nested types. 2025-10-07 09:43:39 +02:00
idrissrio
5c6d187ef2 Java: Fix buildless test HTTP server binding on macOS26 2025-10-07 09:24:55 +02:00
Nicolas Will
e2a8d58e02 Merge pull request #20583 from bdrodes/jca_signature_extensions
Crypto: Add JCA signatures, RNG, and unit tests
2025-10-06 18:51:30 +02:00
REDMOND\brodes
cb812b47ed Crypto: more non-ascii removal. 2025-10-06 11:53:39 -04:00
Nicolas Will
9e278b9fa4 Merge pull request #20258 from bdrodes/java_nonce_reuse_tests
Crypto: Add reuse nonce test for Java
2025-10-06 17:42:25 +02:00
REDMOND\brodes
017a956d5e Crypto: more non-ascii removal. 2025-10-06 11:34:45 -04:00
REDMOND\brodes
abeb3141b1 Crypto: Formatting test cases, more removal of non-ascii 2025-10-06 10:46:09 -04:00
Michael Nebel
6149608c03 C#: Always use the unbound type declaration location for type location. 2025-10-06 16:41:12 +02:00
Michael Nebel
b362b4657f C#: Add some examples with nested types. 2025-10-06 16:40:13 +02:00
Nicolas Will
15e9bb9cc1 Format Test and update .expected 2025-10-06 16:29:25 +02:00
REDMOND\brodes
96f6832a6f Crypto: Updating expected files for unit tests. 2025-10-06 10:07:15 -04:00
REDMOND\brodes
606aef38cb Crypto: Removing non-ascii characters from unit tests 2025-10-06 09:56:14 -04:00
Ben Rodes
b32a6407b9 Update java/ql/lib/experimental/quantum/JCA.qll
Co-authored-by: Nicolas Will <nicolaswill@github.com>
2025-10-06 09:04:19 -04:00
Idriss Riouak
4a1157bff9 Merge pull request #20491 from github/idrissrio/java-maven
Java: Integration tests for Maven 4
2025-10-06 14:57:22 +02:00
Nicolas Will
378eb18db5 Merge branch 'main' into jca_signature_extensions 2025-10-06 14:50:15 +02:00
Nicolas Will
579da1dbd6 Fix QL-for-QL alerts 2025-10-06 14:45:45 +02:00
Michael Nebel
7b61a5fffa C#: Update some test expected output that uses the location of the implicit constructor. 2025-10-06 14:02:17 +02:00
Michael Nebel
0ba9b80d08 C#: Add some more partial class related tests. 2025-10-06 14:02:15 +02:00
Michael Nebel
12dc65d170 C#: For implicit constructors, pick a unique source location as reporting location (if any). 2025-10-06 14:02:13 +02:00
Michael Nebel
b5592ad42f C#: Add partial class example. 2025-10-06 14:02:12 +02:00
Michael Nebel
0cd7c37209 C#: Avoid extracting duplicate type locations. 2025-10-06 14:02:10 +02:00
Michael Nebel
f2b45b8726 C#: Add type locations test. 2025-10-06 14:02:07 +02:00
Geoffrey White
1c8ee0af89 Rust: Fix backticks. 2025-10-06 11:40:41 +01:00
Geoffrey White
a31c10c4fa Apply suggestions from code review
Co-authored-by: mc <42146119+mchammer01@users.noreply.github.com>
2025-10-06 11:37:40 +01:00
Nora Dimitrijević
ece121070b Add change note. 2025-10-06 12:31:21 +02:00
Nora Dimitrijević
9d7c52423a Basic python overlay tests
The base source is in basic-overlay-eval/orig_src,
the overlay source is in basic-full-eval.

We run two tests: a full evaluation test in basic-full-eval,
and an overlay evaluation test in basic-overlay-eval.

The test source and expected results are the SAME,
due to the .qlref, meaning we expect the same results
for full and overlay evaluation.
2025-10-06 12:30:08 +02:00
Nora Dimitrijević
20d4e429ca Add consistency query (exactly one path for every entity) 2025-10-06 11:47:56 +02:00
Nora Dimitrijević
7174d4c8ba Overlay.qll: discard predicates
for dbscheme elements with direct or indirect location links in dbscheme.

- Unify discardable entities under one Discardable superclass.
- Two discard predicates depending on TRAP ID type.
- Future-proof the XML and Yaml discard predicates for when their
  extractors become incremental.
2025-10-06 11:47:51 +02:00
Nora Dimitrijević
1a9683f986 Add @top database type 2025-10-06 11:47:14 +02:00
Nora Dimitrijević
6f208e9dec Write overlay metadata at end of extraction. 2025-10-06 11:47:12 +02:00
Nora Dimitrijević
49b18db044 Python extractor: in overlay mode, traverse only changed files
- fall back to full extraction on overlay changes json read error
- we filter both root modules and (transitive) imports against the overlay-changes json.
2025-10-06 11:47:09 +02:00
Asger F
587ad5c600 JS: Refine criteria so that explicit this-passing is not affected 2025-10-06 11:43:18 +02:00
Asger F
4d33190241 JS: Restrict this-argument passing in API graphs 2025-10-06 11:42:36 +02:00
Asger F
84c788a027 JS: Add API graph test for explicit 'this' passing 2025-10-06 11:40:40 +02:00
Nora Dimitrijević
e0cf719cb9 Path transformer: handle Windows-style paths
And don't add slash to start of path patterns on Windows.
2025-10-06 11:37:04 +02:00
Nora Dimitrijević
29b1a7403b Support CODEQL_PATH_TRANSFORMER env var in python path renamer
The new name is required by overlay support.
2025-10-06 11:37:02 +02:00
Nora Dimitrijević
1574b5fd91 Add synthetic data to dbscheme.stats for databaseMetadata/overlayChangedFiles 2025-10-06 11:37:00 +02:00
Nora Dimitrijević
1c3a7f2b1e Add database upgrade/downgrade scripts 2025-10-06 11:36:58 +02:00
Nora Dimitrijević
a88d3397cd Add overlay builtins to python dbscheme 2025-10-06 11:36:56 +02:00
Nora Dimitrijević
4c9ca93cdf Turn on overlay support in codeql-extractor.yml 2025-10-06 11:36:54 +02:00
Nora Dimitrijević
dac50fa0c1 Enable overlay compilation in lib/qlpack.yml 2025-10-06 11:36:51 +02:00
idrissrio
a22ec2d9c6 Java: Accept new test results after extractor changes 2025-10-06 11:18:16 +02:00
idrissrio
f6b6a007b1 Java: Add integration tests for Maven 4 2025-10-06 11:18:15 +02:00
Simon Friis Vindum
1f2cca7d00 Merge pull request #20547 from paldepind/rust/function-as-lambda
Rust: Handle functions as data flow lambdas
2025-10-06 10:15:55 +02:00
REDMOND\brodes
9fa30a3884 Crypto: Updating algorithm string literals and key generation algorithm literal sources to include signatures. 2025-10-03 18:09:27 -04:00
REDMOND\brodes
9c5765a48c Crypto: Add missing string constants for signature algorithms. 2025-10-03 17:17:07 -04:00
REDMOND\brodes
66e9d7671d Crypto: Add jca unit tests. 2025-10-03 13:32:02 -04:00
REDMOND\brodes
f4fea6d635 Crypto: Fix consistency update with "other" vs "unknown" naming convetions for openssl. 2025-10-03 12:10:48 -04:00
REDMOND\brodes
f1eb6511a7 Crypto: Add modeling for JCA signatures. Make consistent use of "unknown" or "other" for unrecognized types. 2025-10-03 12:07:37 -04:00
Anders Schack-Mulligen
84a65bef43 C#: Add change note. 2025-10-03 16:29:56 +02:00
Anders Schack-Mulligen
fad49ffbfb C++: Accept qltest change (useless guard tautology removed). 2025-10-03 15:59:54 +02:00
Anders Schack-Mulligen
613c789378 C#: Remove some obsolete tests. 2025-10-03 15:29:36 +02:00
Anders Schack-Mulligen
b392767252 C#: Accept qltest changes. 2025-10-03 15:29:35 +02:00
Anders Schack-Mulligen
df6172b1f3 C#: Update nullness qltest 2025-10-03 15:29:35 +02:00
Anders Schack-Mulligen
64810f6fb5 C#: Improve ConstantCondition.ql 2025-10-03 15:29:34 +02:00
Anders Schack-Mulligen
587901bc8a C#: Replace NullMaybe.ql implementation. 2025-10-03 15:29:34 +02:00
Anders Schack-Mulligen
6cfadbfe90 C#: Clean up. 2025-10-03 15:29:33 +02:00
Anders Schack-Mulligen
c2d21e95b9 C#: Instantiate ControlFlowReachability and implement new nullness. 2025-10-03 15:29:33 +02:00
Anders Schack-Mulligen
449059f1ac C#: Disable FinallySplit, BooleanSplit, and LoopSplit 2025-10-03 15:29:32 +02:00
Anders Schack-Mulligen
b52a9a818c C#: Instantiate shared Guards. 2025-10-03 15:29:32 +02:00
Anders Schack-Mulligen
c01ac307b0 Guards: Disregard more trivial guards. 2025-10-03 15:29:31 +02:00
Anders Schack-Mulligen
ca7d56023a ControlFlow: Rename getAPhiInput to getAnInput. 2025-10-03 15:29:31 +02:00
Anders Schack-Mulligen
64caae554a Guards: Refactor representation of false. 2025-10-03 15:29:30 +02:00
Simon Friis Vindum
402d58bc3a Merge pull request #20553 from paldepind/rust-ruby/update-cargo-deps
Rust, ruby: Update cargo dependencies
2025-10-03 14:50:55 +02:00
Owen Mansel-Chan
ef1fe6cabc Add code owners for /shared/ 2025-10-03 10:40:45 +01:00
Anders Schack-Mulligen
2e9e357d7e Rangeanalysis: Fix a join-order. 2025-10-03 10:52:52 +02:00
Jeroen Ketema
7807804f4d Merge pull request #20573 from MathiasVP/fix-bad-magic-on-get-file
C++: Fix bad magic on `Element.getFile`
2025-10-03 01:21:32 +02:00
Owen Mansel-Chan
218c2a59eb Merge pull request #14751 from owen-mc/go/feature/use-use-flow
Go: Switch from def-use flow to use-use flow
2025-10-02 23:53:54 +01:00
REDMOND\brodes
a46bd4c4ca Crypto: JCA random number generation model. 2025-10-02 15:21:28 -04:00
REDMOND\brodes
507174e44f Crypto: Fix bug in MacOperationNode constructor with detecting if the operation is also used for signatures. 2025-10-02 15:20:59 -04:00
Geoffrey White
479e735e77 Rust: Mirror information from supported-versions-compilers.rst in system-requirements.rst. 2025-10-02 19:00:30 +01:00
Geoffrey White
fb738f2d02 Rust: Update creating-path-queries.rst. 2025-10-02 18:36:39 +01:00
Ben Rodes
e823d80f0c Merge branch 'main' into java_nonce_reuse_tests 2025-10-02 13:31:40 -04:00
Geoffrey White
3b1d6cd3d9 Rust: Add missing link (to existing doc). 2025-10-02 18:31:26 +01:00
Nicolas Will
cbe34f101b Merge pull request #19944 from bdrodes/signature_model_refactor
Crypto: Refactor Model and signatures, fix models, add unit tests
2025-10-02 19:30:46 +02:00
Geoffrey White
4ec18c8a79 Rust: Remove the experimental note in supported-frameworks.rst. 2025-10-02 18:21:52 +01:00
Nicolas Will
4901cdf929 Crypto: Refactor and change casts to super 2025-10-02 18:43:38 +02:00
Mathias Vorreiter Pedersen
bc0b87632d C++: Fix bad magic on Element.getFile when running on InconsistentCheckReturnNull.qll:
Evaluated non-recursive predicate Element::Element.getFile/0#dispred#536cb5f3#bb@f6f5329i in 182326ms (size: 50437).
Evaluated relational algebra for predicate Element::Element.getFile/0#dispred#536cb5f3#bb@f6f5329i with tuple counts:
           2029351   ~0%    {2} r1 = SCAN `Expr::Expr.getLocation/0#dispred#0a3d90c6` OUTPUT In.1, In.0
           2029351   ~0%    {2}    | JOIN WITH `Location::Location.getStartLine/0#d54f9e6c` ON FIRST 1 OUTPUT Rhs.1, Lhs.1
           1168789   ~0%    {2}    | JOIN WITH `InconsistentCheckReturnNull::assertInvocation/2#b2a4c9e3_10#join_rhs` ON FIRST 1 OUTPUT Rhs.1, Lhs.1
        5533128288   ~0%    {3}    | JOIN WITH `Location::Location.getContainer/0#9edabfb6_10#join_rhs` ON FIRST 1 OUTPUT Lhs.1, Rhs.1, Lhs.0
             50413   ~0%    {2}    | JOIN WITH `Element::Element.getLocation/0#dispred#6c3f5b09#bf` ON FIRST 2 OUTPUT Lhs.0, Lhs.2

              3043   ~0%    {2} r2 = JOIN `project#InconsistentCheckReturnNull::relevantFunctionCall/2#d18cd566` WITH `Expr::Expr.getLocation/0#dispred#0a3d90c6` ON FIRST 1 OUTPUT Rhs.1, Lhs.0

              3043   ~0%    {2} r3 = JOIN r2 WITH locations_default ON FIRST 1 OUTPUT Rhs.4, Lhs.1
              1945   ~3%    {2}    | JOIN WITH `InconsistentCheckReturnNull::assertInvocation/2#b2a4c9e3_10#join_rhs` ON FIRST 1 OUTPUT Rhs.1, Lhs.1
           9106248   ~2%    {3}    | JOIN WITH `Location::Location.getContainer/0#9edabfb6_10#join_rhs` ON FIRST 1 OUTPUT Lhs.1, Rhs.1, Lhs.0
                 0   ~0%    {2}    | JOIN WITH `Element::Element.getLocation/0#dispred#6c3f5b09#bf` ON FIRST 2 OUTPUT Lhs.0, Lhs.2

              3043   ~0%    {3} r4 = JOIN r2 WITH locations_default ON FIRST 1 OUTPUT _, Lhs.1, Rhs.4
              3043   ~0%    {2}    | REWRITE WITH Tmp.0 := 1, Out.0 := (In.2 + Tmp.0) KEEPING 2
              2013   ~0%    {2}    | JOIN WITH `InconsistentCheckReturnNull::assertInvocation/2#b2a4c9e3_10#join_rhs` ON FIRST 1 OUTPUT Rhs.1, Lhs.1
           9621327   ~0%    {3}    | JOIN WITH `Location::Location.getContainer/0#9edabfb6_10#join_rhs` ON FIRST 1 OUTPUT Lhs.1, Rhs.1, Lhs.0
                24   ~3%    {2}    | JOIN WITH `Element::Element.getLocation/0#dispred#6c3f5b09#bf` ON FIRST 2 OUTPUT Lhs.0, Lhs.2

             50437   ~0%    {2} r5 = r1 UNION r3 UNION r4
                            return r5
2025-10-02 17:36:21 +01:00
Owen Mansel-Chan
f35d28de45 Change note for bug fix in go/unvalidated-url-redirection 2025-10-02 17:03:55 +01:00
Owen Mansel-Chan
cce44b1f54 Update change notes for api changes 2025-10-02 16:52:16 +01:00
Owen Mansel-Chan
4d4862899e Preserve old behaviour of Write.writesComponent 2025-10-02 16:50:18 +01:00
REDMOND\brodes
9673b81677 Crypto: Update JCA 'wihHmac" raw name to be the entire raw string, not just "Hmac" 2025-10-02 11:49:23 -04:00
REDMOND\brodes
704a06e1fa Crypto: Update JCA PBKDF2 modeling: 1) add further inheritance structures to make the inheritance decomposition and caveats clearer, and 2) use getConsumer to establish the hash and hmac consumer. Update the Model to expect hash node types specifically for HMAC getHashALgorithmOrUnknown. 2025-10-02 11:45:13 -04:00
Owen Mansel-Chan
d8891e34d1 Small improvement to go/unhandled-writable-file-close 2025-10-02 15:15:51 +01:00
REDMOND\brodes
850c1ec12d Crypto: Fix use of a member where a singleton set literal exists 2025-10-02 09:20:40 -04:00
REDMOND\brodes
b08533b322 Crypto: Fix missing output variable 2025-10-02 09:10:50 -04:00
REDMOND\brodes
c37b7c1389 Merge branch 'signature_model_refactor' of https://github.com/bdrodes/codeql into signature_model_refactor 2025-10-02 09:05:09 -04:00
REDMOND\brodes
38421cec94 Crypto: Missing casing fix for JCA classes 2025-10-02 09:04:23 -04:00
Ben Rodes
d251b3f9f7 Merge branch 'main' into signature_model_refactor 2025-10-02 09:02:34 -04:00
REDMOND\brodes
329a7dee1c Crypto: Fixing JCA class naming casing for PBKDF2 classes. 2025-10-02 09:02:17 -04:00
Tom Hvitved
b4c979f586 Merge pull request #20548 from hvitved/rust/macro-call-resolution
Rust: Macro call resolution
2025-10-02 14:54:10 +02:00
Jeroen Ketema
a34d6d484a Merge pull request #20485 from MathiasVP/use-shared-guards-library
C++: Switch to the shared Guards library
2025-10-02 14:19:49 +02:00
Owen Mansel-Chan
7fdda87b06 Fix go/impossible-interface-nil-check for separate post-update nodes
When tracing back from nil checks on interfaces, ignore post-update
nodes. There will always be a corresponding pre-update node that
contains the information we want.
2025-10-02 12:34:58 +01:00
Michael Nebel
b5aa972bd1 Merge pull request #20525 from michaelnebel/csharp/reducelocationtuples
C#: Reduce location tuples.
2025-10-02 12:32:35 +02:00
Michael Nebel
57efa05215 C#: Add change note. 2025-10-02 11:34:14 +02:00
Tom Hvitved
f8b104d174 Rust: Use doubleBoundedFastTC for resolving $crate paths 2025-10-02 11:22:56 +02:00
Philip Ginsbach
d889fa8d39 Merge pull request #20571 from github/ginsbach/MoreAnnotationDocs
document `extensible` and `additional` in QL reference and spec
2025-10-02 09:11:06 +01:00
Philip Ginsbach
a2d31be152 improve the wording based on PR review feedback 2025-10-02 09:02:20 +01:00
Michael Nebel
4f833ca7fe Merge pull request #20513 from ewillonermsft/systemwebhttprequest-test-stubs
Add additional SystemWeb HttpRequset properties to C# test stubs
2025-10-02 09:22:55 +02:00
Michael Nebel
191dae47fd C#: Add a stub for the System.Uri class for the CWE-611 test. 2025-10-01 14:44:54 -07:00
ewillonermsft
6f57e5a13e Merge branch 'main' into systemwebhttprequest-test-stubs 2025-10-01 14:33:09 -07:00
REDMOND\brodes
d49efefefa Crypto: Fix for non-monotonic recursion in JCA 2025-10-01 14:36:26 -04:00
Mark C
f38ab45e94 removed all @security.severity ratings to keep the main impartial 2025-10-01 17:49:45 +01:00
Mathias Vorreiter Pedersen
011739cbd9 Merge branch 'main' into use-shared-guards-library 2025-10-01 17:21:05 +01:00
Mathias Vorreiter Pedersen
6eb2aad7da Merge pull request #20569 from aschackmull/guards/uniquevalue-perf
Guards: Improve performance for phi nodes with many incoming constant values.
2025-10-01 17:19:42 +01:00
Owen Mansel-Chan
2629369c93 Improve additional flow step for Host field 2025-10-01 16:18:05 +01:00
Philip Ginsbach
f0b39099e3 discuss 'extensible' whenever the spec mentions 'external' 2025-10-01 16:18:04 +01:00
Owen Mansel-Chan
c006777714 Simplify PathAssignmentBarrier 2025-10-01 16:18:03 +01:00
Philip Ginsbach
3159b299f7 member predicates cannot be 'external' 2025-10-01 16:18:02 +01:00
Owen Mansel-Chan
6d6852fb8d Test PathAssignmentBarrier for OpenUrlRedirect 2025-10-01 16:18:02 +01:00
Philip Ginsbach
341a1191a3 language reference section on 'extensible' annotation 2025-10-01 16:18:00 +01:00
Owen Mansel-Chan
f0f5fc7eac Improve SSRF additional flow step 2025-10-01 16:18:00 +01:00
Philip Ginsbach
bd3bcf981a language reference section on 'additional' annotation 2025-10-01 16:17:58 +01:00
Owen Mansel-Chan
c9ce2c8043 Add test for assignment to Url.Host field 2025-10-01 16:17:58 +01:00
Owen Mansel-Chan
8b04d0a2b9 Convert SSRF tests to inline expectations tests 2025-10-01 16:17:57 +01:00
Philip Ginsbach
7893768cb2 update annotation docs to reference type unions 2025-10-01 16:17:55 +01:00
Philip Ginsbach
8160ef6e81 update annotation docs to reference signatures 2025-10-01 16:17:53 +01:00
Owen Mansel-Chan
6e4dbe8e22 Fix SafeUrlFlow so test passes 2025-10-01 16:17:52 +01:00
Owen Mansel-Chan
620ae33e0c Make SafeUrlFlow test more comprehensive (failing) 2025-10-01 16:17:04 +01:00
REDMOND\brodes
92dac0341c Crypto: Adding necessary model interfaces for MacOperationCall in JCA. 2025-10-01 11:13:37 -04:00
Owen Mansel-Chan
8a21a4ff92 Deprecate WriteNode.writesComponent 2025-10-01 16:13:33 +01:00
Owen Mansel-Chan
59e3c14a5e Add and use WriteNode.writesElementPreUpdate 2025-10-01 16:13:31 +01:00
Owen Mansel-Chan
6fcd35885e Fix pointer content store step for write to field of pointer dereference 2025-10-01 16:13:29 +01:00
Owen Mansel-Chan
2ffb638b7e Delete WriteNode.writesFieldOnSsaWithFields
This can be easily expressed in terms of `WriteNode.writesFieldPreUpdate`.
2025-10-01 16:13:27 +01:00
Owen Mansel-Chan
489b8431ea Add and use WriteNode.writesFieldPreUpdate 2025-10-01 16:13:25 +01:00
Owen Mansel-Chan
c9a2816bfe Fix OpenUrlRedirect barrier for write to Url.Host 2025-10-01 16:13:24 +01:00
Owen Mansel-Chan
414bab1f30 Add OpenUrlRedirect tests for Url.Host field 2025-10-01 16:13:22 +01:00
Owen Mansel-Chan
1144bb99b4 Convert OpenUrlRedirect tests to InlineExpectations 2025-10-01 16:13:21 +01:00
Owen Mansel-Chan
7b426186aa Rephrase change note to avoid technical terms 2025-10-01 16:13:19 +01:00
Owen Mansel-Chan
630a8446ad Rename confusing predicate and add qldoc 2025-10-01 16:13:17 +01:00
Owen Mansel-Chan
b1bcbec37d Use slightly less confusing syntax 2025-10-01 16:13:15 +01:00
Owen Mansel-Chan
1d9a93a731 Rename helper predicate 2025-10-01 16:13:14 +01:00
Owen Mansel-Chan
4ee236d73f Delete commented out code 2025-10-01 16:13:12 +01:00
Owen Mansel-Chan
25f182302d Fix email injection sink that needs local flow 2025-10-01 16:13:10 +01:00
Owen Mansel-Chan
f5f6d64d9d Add change notes 2025-10-01 16:13:08 +01:00
Owen Mansel-Chan
52b6539697 Typo
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-01 16:13:06 +01:00
Owen Mansel-Chan
a9420d46c8 Fix bad join order 2025-10-01 16:13:04 +01:00
Owen Mansel-Chan
6cb69535a5 Add missing qldocs 2025-10-01 16:13:03 +01:00
Owen Mansel-Chan
5efc8ac1a4 Fix backwards flow through TaintTracking::FunctionModel
We only do this for taint models as there isn't any backwards flow
through data flow function models.
2025-10-01 16:13:01 +01:00
Owen Mansel-Chan
3906f2560d Adjust Stack Exposure test so it passes
A minor bug in our CFG means that we evaluate the base of a
SliceExpr before the bounds. Since the bounds may have side
effects, as in this case, it would be better to evaluate them first.
But in the short term I am just adjusting the test to make it work.
2025-10-01 16:12:59 +01:00
Owen Mansel-Chan
62155876c5 Fix flow to variable capture
The jump step to a `SsaCaptureVariable` should start at the last use
before it, rather than from the previous definition.
2025-10-01 16:12:57 +01:00
Owen Mansel-Chan
748c53a791 Refactor: Create writesFieldOnSsaWithFields 2025-10-01 16:12:56 +01:00
Owen Mansel-Chan
cf6cfe2a1e Non-initializing writes should target post-update nodes 2025-10-01 16:12:54 +01:00
Owen Mansel-Chan
8a3bd8408b Fix test expectations for Cleartext Logging
One spurious alert was removed, one missing alert was added, and some
source locations changed.
2025-10-01 16:12:52 +01:00
Owen Mansel-Chan
3229630598 Make store step to send stmt's channel use post-update node 2025-10-01 16:12:51 +01:00
Owen Mansel-Chan
ac71f9cd8e Expected change in test output
These sources are now modeled using models-as-data, which (probably
correctly) uses the post-update node as the source. But the deprecated
QL models still exist, so we get two test results for each of these
calls.
2025-10-01 16:12:49 +01:00
Owen Mansel-Chan
d2230c531d Expected changes in test output 2025-10-01 16:12:47 +01:00
Owen Mansel-Chan
118def8d28 Make separate post-update nodes 2025-10-01 16:12:45 +01:00
Owen Mansel-Chan
a0c647ce83 Add Email Injection tests for reverse flow models 2025-10-01 16:12:43 +01:00
Owen Mansel-Chan
9892836f14 Switch order of PUN test output 2025-10-01 16:12:42 +01:00
Owen Mansel-Chan
89ae0e3bf3 Inline predicate only used once 2025-10-01 16:12:40 +01:00
Owen Mansel-Chan
05a16dc100 Convert post-update logic to IR (part 3) 2025-10-01 16:12:38 +01:00
Owen Mansel-Chan
ad1801827b Implement writesComponent at IR level 2025-10-01 16:12:37 +01:00
Owen Mansel-Chan
203952fa47 Convert post-update logic to IR (part 2)
Note that we don't create post-update nodes for method receivers if the
call to the method is indirect, via a function variable. We could aim to
do this in future.
2025-10-01 16:12:35 +01:00
Owen Mansel-Chan
c8b8e25fbb Convert post-update logic to IR (part 1) 2025-10-01 16:12:34 +01:00
Owen Mansel-Chan
7a515c101a Pull out post-update node logic into predicate 2025-10-01 16:12:32 +01:00
Owen Mansel-Chan
d13d7173ed Fix QLDoc typo 2025-10-01 16:12:30 +01:00
Owen Mansel-Chan
14301e0af4 Expected changes in dataflow edges 2025-10-01 16:12:28 +01:00
Owen Mansel-Chan
c20abf6d58 Line numbers change because 3 lines were added 2025-10-01 16:12:27 +01:00
Owen Mansel-Chan
521066578b Test result that was missing is now found 2025-10-01 16:12:25 +01:00
Owen Mansel-Chan
3594dba83c Make insecure randomness test more realistic 2025-10-01 16:12:24 +01:00
Owen Mansel-Chan
32de2113a6 Use _ instead of exists variable x2 2025-10-01 16:12:22 +01:00
Chris Smowton
a3eb0100a6 Optimise join order for varBlockReaches 2025-10-01 16:12:21 +01:00
Owen Mansel-Chan
9068315f03 Fix IncorrectIntegerConversion for use-use flow
We were assuming that `sink` only had one successor, the TypeCastNode, but it
can now have an adjacent use as well.
2025-10-01 16:12:19 +01:00
Owen Mansel-Chan
b2a9cecd69 Fix Allocation Size Overflow for use-use flow
We have an operator expression like `x * 5`. We want to follow where the
value of the operator expression goes. We used to follow local flow from
an operand, but now there is flow from that operand to the next use of
the variable. The fix is to explicitly start local flow from the
operator expression.

There are also some expected edge changes due to use-use flow.
2025-10-01 16:12:18 +01:00
Owen Mansel-Chan
4e04d27d32 Adjust SafeFormatArgumentSanitizer to use-use flow
Make it sanitize the result of the call rather than the input, so that
further uses of the input are still tainted. This means that it catches
things like `log.Print(fmt.Sprintf("user %q logged in.\n", username))`
where the argument to the LoggerCall contains a StringFormatCall, but
it misses things like `log.Printf("user %q logged in.\n", username)`. So
we extract the logic into a predicate and apply it as a condition in the
sink as well.

The downside of this approach is that if there are two tainted inputs
and only one has a safe format argument then we still sanitize the
result. Hopefully this is rare.
2025-10-01 16:12:16 +01:00
Owen Mansel-Chan
49b8b0bca3 Remove local flow step from SSA defn to SSA capture 2025-10-01 16:12:15 +01:00
Owen Mansel-Chan
b4743155f6 Include first step from SsaVariableCapture
Without this change the test
go/ql/test/query-tests/InconsistentCode/UnhandledCloseWritableHandle/UnhandledCloseWritableHandle.qlref
was failing.
2025-10-01 16:12:14 +01:00
Owen Mansel-Chan
5267671b15 Clean up code in basicLocalFlowStep
No changes in functionality.
2025-10-01 16:12:12 +01:00
Owen Mansel-Chan
4484d5bfa9 Add missing QLDoc 2025-10-01 16:12:09 +01:00
Owen Mansel-Chan
16a11b48ad Switch to use-use dataflow. This will make post-update nodes easy to implement.
Queries / tests that required changes:
* The CleartextLogging and MissingErrorCheck queries are updated because they assumed def-use flow
* The CommandInjection query works around the shortcomings of use-use flow by essentially reintroducing def-use flow when it applies a sanitizer
* The OpenUrlRedirect query currently just accepts its fate; the tests are updated to avoid excess sanitization while the query comments on the problem. We should choose this approach or the CommandInjection one.
2025-10-01 16:12:07 +01:00
Simon Friis Vindum
1408c245e0 Merge pull request #20557 from paldepind/rust/type-inference-delete-predicates
Rust: Remove member predicates on `Type`
2025-10-01 16:48:41 +02:00
Owen Mansel-Chan
ff3d795a8f Merge pull request #20556 from owen-mc/go/test/safeurlflow
Go: Add tests for SafeUrlFlow, and fix a latent bug
2025-10-01 15:05:55 +01:00
Geoffrey White
f96a42c075 Merge pull request #20561 from geoffw0/basicquery
Rust: Add Basic query for Rust code doc
2025-10-01 14:20:11 +01:00
Owen Mansel-Chan
8983ac9212 Phrase test in terms of safe URLs 2025-10-01 14:13:15 +01:00
Tom Hvitved
dd3debc2d5 Address review comments 2025-10-01 14:41:28 +02:00
Anders Schack-Mulligen
a1028d604c Guards: Improve performance for uniqueValue. 2025-10-01 14:08:37 +02:00
Mathias Vorreiter Pedersen
b0e9238ddf Merge branch 'main' into use-shared-guards-library 2025-10-01 11:59:17 +01:00
Geoffrey White
b02c19b5bf Rust: Slightly cleaner screenshots. 2025-10-01 11:59:08 +01:00
Mark C
c5cf0ffa75 added java cryptographic check queries 2025-10-01 11:55:51 +01:00
Geoffrey White
936702a0e5 Rust: Update graphics. 2025-10-01 11:49:54 +01:00
Mathias Vorreiter Pedersen
353ee8baa0 C++: Port a test from the experimental directory to show that it works in the non-experimental "new" range analysis. 2025-10-01 11:33:47 +01:00
Chris Smowton
f5ae5bed47 Merge pull request #20560 from smowton/smowton/fix/start-in-constructor-fp
Java: note that classes with entirely private constructors can't be subclassed
2025-10-01 11:16:50 +01:00
Geoffrey White
2c7291d27e Rust: Fix toctree bug. 2025-10-01 11:12:29 +01:00
Ben Ahmady
513dcf1cb4 Merge branch 'main' into basicquery 2025-10-01 11:02:19 +01:00
Owen Mansel-Chan
c93852d87a Improve comments in test file 2025-10-01 11:01:58 +01:00
Simon Friis Vindum
daf0cf1c1b Rust: Rename predicates 2025-10-01 11:43:51 +02:00
Owen Mansel-Chan
dd3f754cb3 Add change note. 2025-10-01 09:32:00 +01:00
Simon Friis Vindum
a359a24c9e Merge pull request #20559 from paldepind/rust/string-add-ref
Rust: Add taint model for add on `String`
2025-10-01 09:38:54 +02:00
Geoffrey White
372b5870b1 Merge pull request #20554 from geoffw0/docs1
Rust: Consistency fix for reusables/extractors.rst.
2025-09-30 17:41:05 +01:00
Geoffrey White
92122fef58 Rust: statement -> expression. 2025-09-30 15:48:26 +01:00
Geoffrey White
d9955ce93c Merge pull request #20503 from geoffw0/cookie
Rust: New query rust/insecure-cookie
2025-09-30 15:26:37 +01:00
Tom Hvitved
537e7a8ec3 Rust: Fix formatting 2025-09-30 16:24:38 +02:00
Tom Hvitved
701cff3ca4 Rust: Macro call resolution 2025-09-30 16:21:02 +02:00
Owen Mansel-Chan
a2a9575587 Add tests for safe URL flow 2025-09-30 15:05:42 +01:00
Simon Friis Vindum
19871a2653 Rust: Accept test changes 2025-09-30 15:26:30 +02:00
Geoffrey White
771d9345b5 Merge branch 'main' into basicquery 2025-09-30 14:19:00 +01:00
Mathias Vorreiter Pedersen
ca53a8e787 C++: Update QLDoc. 2025-09-30 14:15:55 +01:00
Mathias Vorreiter Pedersen
1b2bd30a29 Update cpp/ql/lib/semmle/code/cpp/controlflow/IRGuards.qll
Co-authored-by: Anders Schack-Mulligen <aschackmull@users.noreply.github.com>
2025-09-30 14:14:19 +01:00
Chris Smowton
f88daff45f Java: note that classes with entirely private constructors can't be subclassed 2025-09-30 13:57:44 +01:00
Simon Friis Vindum
49efd574a0 Rust: Add taint model for add on String 2025-09-30 14:48:03 +02:00
Idriss Riouak
fa8cbeeb44 Merge pull request #20546 from github/idrissrio/ql-constant
Java: Fix false positives in evaluation-to-constant query for ErrorType
2025-09-30 14:24:28 +02:00
Chris Smowton
ff4b97bf2d Reword 2025-09-30 13:08:03 +01:00
Simon Friis Vindum
c878af2b9d Rust: Remove member predicates on Type 2025-09-30 13:28:33 +02:00
Owen Mansel-Chan
5b07e8c9c4 Fix bug in UnsafeFieldReadSanitizer 2025-09-30 12:05:06 +01:00
Owen Mansel-Chan
b5fda88bd3 Remove duplication of UnsafeFieldReadSanitizer 2025-09-30 12:04:39 +01:00
idrissrio
63771110a5 Java: Address review comment 2025-09-30 11:46:37 +02:00
Michael Nebel
018ccb3354 C#: Update locations test expected output. 2025-09-30 11:33:28 +02:00
Michael Nebel
d7a2c7da18 C#: Adjust the QL library to use the locations of the unbound declarations. 2025-09-30 11:33:26 +02:00
Michael Nebel
b2cbac3250 C#: Temporarily update the test expected file. 2025-09-30 11:33:23 +02:00
Michael Nebel
443c183e41 C#: Only extract locations for unbound declarations (if a declaration can be unfound) and don't extract empty locations. 2025-09-30 11:33:21 +02:00
Michael Nebel
e9901305b2 C#: Rename GeneratedLocation to EmptyLocation and make sure that we always create one such location. 2025-09-30 11:33:19 +02:00
Michael Nebel
5843fdbdd8 C#: Add a locations example. 2025-09-30 11:33:17 +02:00
Geoffrey White
90a7a58929 Merge pull request #20515 from geoffw0/libs
Rust: Update Supported languages and frameworks
2025-09-30 09:56:09 +01:00
Geoffrey White
a286631018 Merge pull request #20512 from geoffw0/stmtlist
Rust: Improve StmtList
2025-09-30 09:53:55 +01:00
Nick Rolfe
9688d84f3e Merge pull request #20549 from github/post-release-prep/codeql-cli-2.23.2
Post-release preparation for codeql-cli-2.23.2
2025-09-30 09:45:22 +01:00
Simon Friis Vindum
ef80ff416f Bazel: regenerate vendored cargo dependencies 2025-09-30 10:28:42 +02:00
Simon Friis Vindum
4846cf4791 Cargo: upgrade dependencies 2025-09-30 10:21:17 +02:00
Chris Smowton
f1239352ce Note issue in related query 2025-09-29 18:43:59 +01:00
Chris Smowton
18c5cb10d9 Ruby: Update CSRF protection notes in documentation
Autofix is confused about how the `protect_from_forgery` method works in Rails >= 5: GPT-5 says:

> In modern Rails versions (>=5, including 6 and 7 which this gem permits), ActionController::Base already enables CSRF protection by default with the `:exception` strategy; an explicit call to `protect_from_forgery` without options does not weaken security.

This is false: manual testing confirms that it actually does downgrade from `:exception` to `:null-session` behaviour when a manual call is made.

I can't find any authoritative source showing this gotcha, so I can see how the AI is confused and how humans might also struggle to verify the truth.
2025-09-29 18:42:11 +01:00
github-actions[bot]
a7a4e43991 Post-release preparation for codeql-cli-2.23.2 2025-09-29 15:10:19 +00:00
Nick Rolfe
a05ffdbc81 Merge pull request #20545 from github/release-prep/2.23.2
Release preparation for version 2.23.2
2025-09-29 15:35:24 +01:00
Nick Rolfe
a76d736136 C#: tweak changelog wording 2025-09-29 15:32:52 +01:00
Simon Friis Vindum
98a20f9820 Rust: Add change note 2025-09-29 14:58:34 +02:00
Simon Friis Vindum
37ffe82ac9 Rust: Handle functions as lambdas 2025-09-29 14:49:04 +02:00
Simon Friis Vindum
0728692e93 Rust: Add tests for functions as lambdas 2025-09-29 14:46:53 +02:00
idrissrio
b82d8c2252 Java: Accept new test results after query change 2025-09-29 13:38:01 +02:00
idrissrio
659afb5f30 Java: Fix false positives in evaluation-to-constant query for ErrorType 2025-09-29 13:37:25 +02:00
idrissrio
e0444c531b Java: Add integration test for constant expr detection 2025-09-29 13:37:20 +02:00
Simon Friis Vindum
84c6a3a376 Rust: Add change note for actix-web models 2025-09-29 13:03:10 +02:00
Kasper Svendsen
b52fff2f81 Merge pull request #20505 from kaspersv/kaspersv/future-proof-java-discarding2
Overlay: Discard Java config and XML base entities in overlay extracted files
2025-09-29 13:01:08 +02:00
github-actions[bot]
d2130a589b Release preparation for version 2.23.2 2025-09-29 10:28:45 +00:00
Simon Friis Vindum
6b7d5d2902 Rust: Add models for actix-web 2025-09-29 09:14:03 +02:00
Jeroen Ketema
9dfd87c284 Merge pull request #20514 from jketema/permissive
C++: Update tests after extractor changes
2025-09-28 16:56:31 +02:00
Geoffrey White
c7f6f2c8e1 Rust: Consistency fix for reusables/extractors.rst. 2025-09-26 16:40:25 +01:00
Owen Mansel-Chan
18a1075e70 Merge pull request #20523 from smowton/smowton/fix/mistyped-exp-fp
Go: mistyped-exponentiation: notice constants with likely-bitmask values
2025-09-26 16:02:30 +01:00
Owen Mansel-Chan
f5f61193a0 Delete change note 2025-09-26 15:33:26 +01:00
Geoffrey White
1236e2b829 Rust: Add references to alternatives in the getStmtOrExpr methods. 2025-09-26 14:55:06 +01:00
Geoffrey White
a0b533bd40 Merge pull request #20529 from geoffw0/convert
Rust: Correct from model to taint
2025-09-26 14:48:58 +01:00
Geoffrey White
4570d7e46e Rust: Replace getBlockChildNode with uses of getStmtOrExpr. 2025-09-26 14:32:36 +01:00
Geoffrey White
27b6f12b3c Rust: Use the suggested cleaner implementation for getStmtOrExpr. 2025-09-26 14:30:31 +01:00
Florin Coada
ba07daa50a Merge pull request #20532 from github/coadaflorin/changelog-fixes
Update changelog for CodeQL CLI 2.23.1
2025-09-26 14:21:21 +01:00
Geoffrey White
1635ef9ad9 Merge branch 'main' into convert 2025-09-26 14:11:04 +01:00
Florin Coada
5a0bae27ac Update changelog for CodeQL CLI 2.23.1 2025-09-26 13:57:57 +01:00
Anders Schack-Mulligen
f4388c80d0 Merge pull request #20519 from aschackmull/controlflowreach/perf2
ControlFlow: Split only on relevant values.
2025-09-26 14:51:49 +02:00
Florin Coada
a4f5e9aaf5 Update changelog for CodeQL CLI 2.23.1
Added acknowledgment for the original contributor of the 'Permissive CORS configuration' query and clarified the detection of path injection in Go.
2025-09-26 13:46:12 +01:00
Florin Coada
f6fe469e02 Merge pull request #20531 from github/coadaflorin-formatingfix2
Fix formatting in codeql-cli-2.23.1.rst
2025-09-26 13:31:22 +01:00
Florin Coada
3e9332edfa Fix formatting in codeql-cli-2.23.1.rst 2025-09-26 13:16:45 +01:00
Florin Coada
f8388c521e Merge pull request #20530 from github/coadaflorin/attributer-query
Attribute `js/cors-permissive-configuration` to original author
2025-09-26 13:11:08 +01:00
Anders Schack-Mulligen
2c29f21004 Shared: Address review comments. 2025-09-26 13:59:53 +02:00
Tom Hvitved
615b0a0310 Merge pull request #20502 from hvitved/rust/path-resolution-check-arity
Rust: Check call arities in path resolution
2025-09-26 13:45:26 +02:00
Tom Hvitved
4c7b66c66a Address review comments 2025-09-26 13:14:44 +02:00
Geoffrey White
77e7898f71 Rust: Use US spelling in comment. 2025-09-26 11:49:23 +01:00
Geoffrey White
f458149655 Rust: Remove a sentance from the qhelp. 2025-09-26 11:32:45 +01:00
Geoffrey White
57f84873b4 Rust: Split off cookieOptionalBarrier predicate (as suggested) and expand / clarify the QLDoc. 2025-09-26 11:29:17 +01:00
Geoffrey White
21fe142955 Update rust/ql/src/queries/security/CWE-614/InsecureCookie.qhelp
Co-authored-by: Simon Friis Vindum <paldepind@github.com>
2025-09-26 10:39:49 +01:00
Florin Coada
ba520c60d2 Update 2.1.0.md 2025-09-26 10:11:03 +01:00
Florin Coada
09833e2541 Update CHANGELOG for query promotion and acknowledgment
Promote 'Permissive CORS configuration' query to default suite and acknowledge contributor.
2025-09-26 10:09:30 +01:00
Florin Coada
2f96e32ec9 Update 2.1.0.md 2025-09-26 10:08:31 +01:00
Geoffrey White
3a03bb5a0b Rust: Repair rust/hard-coded-cryptographic-value, which had an unintentional dependence on the taint flow. 2025-09-26 10:03:38 +01:00
Geoffrey White
74a350a432 Rust: Effect on tests. 2025-09-26 09:55:16 +01:00
Tom Hvitved
c52709a5f0 Merge pull request #20516 from hvitved/rust/type-inference-union-pointer-never
Rust: Model union, never, and pointer types
2025-09-26 10:26:05 +02:00
Tom Hvitved
7a74efcc82 Update rust/ql/lib/codeql/rust/elements/internal/UnionImpl.qll
Co-authored-by: Simon Friis Vindum <paldepind@github.com>
2025-09-26 09:57:13 +02:00
Geoffrey White
ff554055a6 Rust: Correct 'from' model to taint. 2025-09-26 08:43:35 +01:00
Simon Friis Vindum
6678e79239 Merge pull request #20526 from geoffw0/lock
Rust: Add missing Cargo.lock files
2025-09-26 08:57:21 +02:00
ewillonermsft
c89ce067a3 Merge branch 'main' into systemwebhttprequest-test-stubs 2025-09-25 12:58:34 -07:00
ewillonermsft
b267bd11e0 Update properties to getters which is inline with the actual implementation. 2025-09-25 10:37:56 -07:00
ewillonermsft
b49b84e072 Remove this[] logic from the commit.
Stub should not include code logic.
2025-09-25 10:10:48 -07:00
Geoffrey White
39ceadaa26 Merge pull request #20520 from geoffw0/gitignore
Add .orig files to the .gitignore.
2025-09-25 18:10:24 +01:00
Geoffrey White
656a7bc378 Rust: Add missing Cargo.lock files to query tests. 2025-09-25 17:40:59 +01:00
Chris Smowton
9e7a5214f3 Change note 2025-09-25 15:40:26 +01:00
Chris Smowton
e9cccb46c0 Go: mistyped-exponentiation: notice constants with likely-bitmask values 2025-09-25 15:19:40 +01:00
Tom Hvitved
1a4cfba93a Merge pull request #20427 from felickz/ruby-framework-grape
Ruby: Add support for Grape Framework
2025-09-25 16:12:34 +02:00
Taus
e592fd60ff Merge pull request #20495 from github/tausbn/python-fix-unmatchable-dollar-in-lookahead
Python: Fix false positive for unmatchable dollar/caret
2025-09-25 15:27:32 +02:00
Geoffrey White
dba4b5e5a9 Rust: Add images. 2025-09-25 14:21:54 +01:00
Geoffrey White
db3d177300 Rust: Port the code examples to Rust / CodeQL for Rust. 2025-09-25 14:21:53 +01:00
Geoffrey White
1211dc8f3c Rust: Replace 'swift' with 'rust'. 2025-09-25 14:21:52 +01:00
Geoffrey White
f4758fe3e5 Rust: Add a basic-query-for-rust-code.rst (copied from Swift). 2025-09-25 14:21:51 +01:00
Geoffrey White
b22227d0f4 Add .orig files to .gitignore. 2025-09-25 14:03:39 +01:00
Anders Schack-Mulligen
109b6a1d79 ControlFlow: Split only on relevant values. 2025-09-25 15:03:35 +02:00
Mathias Vorreiter Pedersen
c1c1f60241 C++: Delete incorrect comment and add a bunch of barrier guard tests. 2025-09-25 12:56:46 +01:00
Mathias Vorreiter Pedersen
04ce4057e1 C++: Add more comments to describe the constant expression hack. 2025-09-25 12:43:57 +01:00
Mathias Vorreiter Pedersen
5b5c1de05b C++: Fix fan-out. 2025-09-25 12:33:44 +01:00
Tom Hvitved
2a814dd37c Rust: Model union, never, and pointer types 2025-09-25 12:33:51 +02:00
Geoffrey White
a72eb87c93 Rust: Remove one that is essentially a duplicate. 2025-09-25 10:35:47 +01:00
Geoffrey White
a45a3e427c Rust: Update supported frameworks. 2025-09-25 10:28:10 +01:00
Joe Farebrother
cb7b1efe81 Update alert message 2025-09-25 09:52:27 +01:00
Jeroen Ketema
e41b5f2bc0 C++: Update tests after extractor changes 2025-09-25 09:52:22 +02:00
Mathias Vorreiter Pedersen
b169ccf29a C++: Fully delete TRange. 2025-09-25 08:30:42 +01:00
ewillonermsft
b2fc68ff81 Add additional SystemWeb HttpRequset properties to C# test stubs 2025-09-24 18:24:36 -07:00
Mathias Vorreiter Pedersen
a07d03f49b C++: Use the 'StoreInstruction' instead of the 'ReturnValueInstruction' when detecting return expressions. 2025-09-24 20:09:35 +01:00
Mathias Vorreiter Pedersen
26a8a4b3d2 C++: Add failing test demonstrating broken wrapper barrier guards. 2025-09-24 19:54:05 +01:00
Mathias Vorreiter Pedersen
b2269fb5f5 C++: Add more tests. 2025-09-24 19:06:02 +01:00
Geoffrey White
7e8e855f28 Rust: Fix bug when there are no statements. 2025-09-24 17:16:26 +01:00
Geoffrey White
93a0198326 Rust: Add a test for StmtList. 2025-09-24 17:04:39 +01:00
Geoffrey White
9bdac9d1cf Rust: Move 'operations' test into elements subdir. 2025-09-24 17:04:38 +01:00
Geoffrey White
b12b36f302 Rust: Codegen. 2025-09-24 17:04:28 +01:00
Geoffrey White
8debce0349 Rust: Add helper predicates for accessing statements and expressions together. 2025-09-24 17:04:08 +01:00
Florin Coada
2db5f0def5 Merge pull request #20510 from github/coadaflorin-patch-1
Fix escape character in changelog for Go query
2025-09-24 16:18:05 +01:00
Michael B. Gale
fd6f9cd2d5 Merge pull request #20368 from github/mbg/go/support-git-source
Go: Support `git_source`
2025-09-24 16:14:56 +01:00
Florin Coada
86fe68bb61 Fix formatting in changelog for Go path injection query
2 people + 2 models managed to tackle this insurmountable task.
2025-09-24 16:12:17 +01:00
Geoffrey White
85945dba29 Rust: Codegen. 2025-09-24 16:08:06 +01:00
Geoffrey White
7459eed435 Rust: Update doc comments for StmtList predicates. 2025-09-24 16:08:04 +01:00
Geoffrey White
ab30c786a5 Rust: Accept test changes. 2025-09-24 16:08:03 +01:00
Florin Coada
6c488e6e71 Fix formatting in codeql-cli-2.23.1.rst 2025-09-24 16:01:38 +01:00
Florin Coada
f3ef6ef3c9 Fix formatting issue in changelog for Go query 2025-09-24 16:00:40 +01:00
Florin Coada
8ad6952dda Fix escape character in changelog for Go query 2025-09-24 15:58:09 +01:00
Mathias Vorreiter Pedersen
d15e388f5c C++: Get rid of the case range constant value with and instead implement 'rangeGuard'. 2025-09-24 15:52:10 +01:00
Michael B. Gale
8c8499229d Configure git to use the certificate, if needed 2025-09-24 15:52:04 +01:00
Michael B. Gale
bc38b79c9a Convert URLs to expected format 2025-09-24 15:52:04 +01:00
Michael B. Gale
4ef8ff9a0f Append * to git_source URL if not present
Since `GOPRIVATE` / `GONOPROXY` expect a glob pattern
2025-09-24 15:52:03 +01:00
Michael B. Gale
a8fa1a76c4 Use git_source configurations for GOPRIVATE 2025-09-24 15:52:02 +01:00
Michael B. Gale
895399ff05 Rename proxy_configs to goproxy_servers and only store URLs 2025-09-24 15:52:01 +01:00
Michael B. Gale
23a04613c0 Set lower-case variants of HTTP_PROXY and HTTPS_PROXY 2025-09-24 15:52:00 +01:00
Michael B. Gale
711d49770f Improve logging to include proxy vars 2025-09-24 15:51:59 +01:00
Florin Coada
e78d0571f4 Merge pull request #20508 from github/changedocs/2.23.1
Add changelog entry for CodeQL 2.23.1 release
2025-09-24 15:35:18 +01:00
Mathias Vorreiter Pedersen
13cde4d700 C++: Add testcase demonstrating that a ConstantValue IPA branch representing a gcc case range is a bad idea. 2025-09-24 15:34:35 +01:00
Mathias Vorreiter Pedersen
d10d5fd05e C++: Rename in the name of consistency. 2025-09-24 15:34:03 +01:00
Geoffrey White
ed3a6fd799 Rust: Codegen. 2025-09-24 15:32:10 +01:00
Geoffrey White
ed2a14a3ec Rust: Update doc comments for StmtList. 2025-09-24 15:28:23 +01:00
Joe Farebrother
9f5bfeb7f4 Update test output 2025-09-24 15:03:40 +01:00
Florin Coada
6e0ce9a885 Add changelog entry for CodeQL 2.23.1 release 2025-09-24 13:30:11 +01:00
Joe Farebrother
654ed9ca12 Update integration tests 2025-09-24 10:58:53 +01:00
Mathias Vorreiter Pedersen
99e1a07b8e C++: Add a comment to the 'ConditionalBranchInstruction' case in 'additionalImpliesStep. 2025-09-24 10:58:47 +01:00
Mathias Vorreiter Pedersen
2b47ac83e8 C++: Remove superfluous inference logic. 2025-09-24 10:51:45 +01:00
Mathias Vorreiter Pedersen
b3cbdb5c1a C++: Add QLDoc to TRange. 2025-09-24 10:39:27 +01:00
Tom Hvitved
e6b1e8ec56 Rust: Check call arities in path resolution 2025-09-24 10:19:56 +02:00
Tom Hvitved
92cced201e Merge pull request #20496 from hvitved/rust/path-resolution-use-visibility
Rust: Visibility check for qualified path resolution
2025-09-24 10:19:22 +02:00
Simon Friis Vindum
26aa938acc Merge pull request #20452 from paldepind/rust/mad-source-parameter
Rust, shared: Support `Parameter` in source MaD models
2025-09-24 09:37:25 +02:00
Asger F
2e8091f0fb Merge pull request #20419 from asgerf/js/express-json-send
JS: Model Express json and jsonp methods
2025-09-24 09:25:32 +02:00
Joe Farebrother
85f886932d Update changenote 2025-09-23 15:51:31 +01:00
Joe Farebrother
55fd7c85c6 Update documentation 2025-09-23 15:50:27 +01:00
Joe Farebrother
1208195d8a Align alert messages across languages. 2025-09-23 15:46:53 +01:00
Joe Farebrother
2cffb21604 Update and fix tests 2025-09-23 15:41:09 +01:00
Chad Bentz
46d330cb21 Merge branch 'ruby-framework-grape' of github.com:felickz/codeql into ruby-framework-grape 2025-09-23 10:40:46 -04:00
Chad Bentz
37e0c30842 Add expected output for VariablesConsistency test case 2025-09-23 10:40:30 -04:00
Kasper Svendsen
f02da68c55 Overlay: Discard base XML entities in overlay extracted files 2025-09-23 12:27:51 +02:00
Kasper Svendsen
718c0abdb6 Overlay: Discard base config entities in overlay extracted files 2025-09-23 12:27:51 +02:00
Joe Farebrother
d28e8004fd Add sensitive data heuristic 2025-09-23 10:08:08 +01:00
Chad Bentz
7a9a259c03 Merge branch 'main' into ruby-framework-grape 2025-09-22 19:29:36 -04:00
Chad Bentz
89fd9694ce codeql query format 2025-09-22 19:25:05 -04:00
Chad Bentz
6e56c549b2 Refactor Grape method call classes to simplify handling of API instance calls for headers, request, route_param, and cookies 2025-09-22 19:21:23 -04:00
Chad Bentz
0665c39a07 Refactor GrapeHelperMethod constructor to reuse getHelperSelf to traverse dataflow instead of AST
- add tests to check for nested helpers
2025-09-22 19:08:34 -04:00
Tom Hvitved
1183e50435 Update rust/ql/lib/change-notes/2025-09-19-parameter-mad.md 2025-09-22 19:45:34 +02:00
Geoffrey White
5ad332e37f Merge pull request #20432 from github/copilot/fix-f50317f8-0a91-4bb4-a01b-353dcf0f6f3f
Rust: Implement new query for non-HTTPS URLs (CWE-319)
2025-09-22 18:03:52 +01:00
Chad Bentz
ecd0ce65fe Refactor GrapeHeadersBlockCall and GrapeCookiesBlockCall to simplify method call checks 2025-09-22 12:52:30 -04:00
Geoffrey White
266624dd0f Rust: The test needs to have Source tags now. 2025-09-22 17:12:52 +01:00
Geoffrey White
86c8c3c8c0 Rust: Fix warning by making the query a path-problem. 2025-09-22 17:01:12 +01:00
Geoffrey White
6362884d16 Rust: Autoformat. 2025-09-22 16:59:11 +01:00
Geoffrey White
43ac75ed62 Rust: Address another tiny suggestion from review. 2025-09-22 16:58:07 +01:00
Geoffrey White
5b4632b432 Apply suggestions from code review
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-09-22 16:55:43 +01:00
Geoffrey White
cc9c4149d7 Apply suggestions from code review 2025-09-22 16:54:08 +01:00
Geoffrey White
3de191177c Rust: Change note. 2025-09-22 16:12:30 +01:00
Geoffrey White
ae9025334e Rust: Add the new query to suite lists. 2025-09-22 16:12:29 +01:00
Geoffrey White
4662e42584 Rust: Add examples as tests (and fix them). 2025-09-22 16:12:27 +01:00
Geoffrey White
bd07350bc3 Rust: Add qhelp and examples. 2025-09-22 16:12:26 +01:00
Geoffrey White
94afc82304 Rust: Fix an issue with the local flow. 2025-09-22 16:12:25 +01:00
Geoffrey White
a3ed83bfff Rust: Make state transition / barrier nodes more reliable. 2025-09-22 16:12:23 +01:00
Geoffrey White
2654affeee Rust: Account for the 'secure' and 'partitioned' attributes. 2025-09-22 16:12:22 +01:00
Geoffrey White
257a1b0179 Rust: Refactor sources, sinks into an extensions source file. 2025-09-22 16:09:30 +01:00
Geoffrey White
eadf922280 Rust: Use models-as-data, add source/sink/flow models. 2025-09-22 16:04:56 +01:00
Geoffrey White
d52b668149 Rust: Add security-severity tag. 2025-09-22 16:04:54 +01:00
Geoffrey White
7e75c1d242 Rust: Add very basic query prototype. 2025-09-22 16:04:53 +01:00
Geoffrey White
513ae2ab54 Rust: Add tests for insecure cookies. 2025-09-22 16:04:52 +01:00
Chad Bentz
b837c56bec Refactor RootApi and GrapeApiClass constructors for improved readability; add getHelperSelf method to retrieve self parameter in helpers block. 2025-09-22 10:13:33 -04:00
Simon Friis Vindum
45b84ffb31 Rust: Ensure singleton 2025-09-22 14:23:50 +02:00
Simon Friis Vindum
4244a6569c Rust: Add change note 2025-09-22 14:19:01 +02:00
Simon Friis Vindum
a4c61f6945 Rust: Accept test changes 2025-09-22 14:18:59 +02:00
Simon Friis Vindum
7d6e2060e5 Adapt all languages to changes in shared library 2025-09-22 14:18:58 +02:00
Simon Friis Vindum
265e8b3623 Shared: Pass SummaryComponentStack to isSource and getSourceType 2025-09-22 14:18:54 +02:00
Simon Friis Vindum
014c27ee8a Rust: Discard sources with spaces in inline flow tests 2025-09-22 14:13:39 +02:00
Simon Friis Vindum
05a58323c1 Rust: Add Warp test to request forgery query tests 2025-09-22 14:13:38 +02:00
Simon Friis Vindum
cd807533f2 Rust: Add tests for parameter in source model 2025-09-22 14:13:37 +02:00
Joe Farebrother
463f79bed2 Merge pull request #20263 from joefarebrother/python-qual-exceptions
Python: Modernize the Unreachable Except Block query
2025-09-22 09:42:09 +01:00
Tom Hvitved
be260befd4 Merge pull request #20497 from hvitved/rust/missing-model
Rust: Add missing model
2025-09-22 10:30:25 +02:00
Napalys Klicius
a0ea0c9e47 Merge pull request #20492 from Napalys/js/graph-ql-obj-type
JS: mark `GraphQLObjectType` resolvers args as remote sources
2025-09-22 09:59:20 +02:00
Tom Hvitved
78641b4dde Rust: Reduce size of unqualifiedPathLookup 2025-09-22 09:46:28 +02:00
Tom Hvitved
b5b6f06005 Rust: Fix bad join
```
Evaluated relational algebra for predicate _PathResolution::CrateItemNode.getName/0#dispred#91b4dd6b_PathResolution::SourceFileItemNode#bd8f490__#antijoin_rhs@e84aee8k with tuple counts:
        35406180  ~0%    {3} r1 = JOIN PathResolution::SourceFileItemNode#bd8f4905 WITH `PathResolution::CrateItemNode.getName/0#dispred#91b4dd6b` CARTESIAN PRODUCT OUTPUT Lhs.0, Rhs.1, Rhs.0
            8455  ~2%    {4}    | JOIN WITH `PathResolution::declaresDirectly/3#7d0350fb_021#join_rhs` ON FIRST 2 OUTPUT Rhs.2, Lhs.0, Lhs.2, Lhs.1
            3259  ~0%    {3}    | JOIN WITH num#PathResolution::TTypeNamespace#4897e416 ON FIRST 1 OUTPUT Lhs.1, Lhs.2, Lhs.3
                         return r1
```
2025-09-22 09:38:43 +02:00
Tom Hvitved
b2cc01c490 Rust: Visibility check for qualified path resolution 2025-09-22 09:38:30 +02:00
Kasper Svendsen
97d62950a8 Merge pull request #20484 from kaspersv/kaspersv/future-proof-java-discarding
Overlay: Future-proof Java config & XML discard predicates
2025-09-22 08:16:44 +02:00
Chad Bentz
1bf6101967 Remove redundant exclusion of base Grape::API module from GrapeApiClass
- should not impact extracted application code
2025-09-21 20:52:28 -04:00
Chad Bentz
50bf9ae756 Refactor RootApi class to use getAnImmediateDescendent for clarity 2025-09-21 20:44:46 -04:00
Tom Hvitved
8d5d219c0f Rust: Update expected test output 2025-09-21 15:36:22 +02:00
Tom Hvitved
223ab5e60c Rust: Add missing model 2025-09-21 15:28:50 +02:00
Tom Hvitved
bdeeb3217e Rust: Add path resolution tests 2025-09-20 09:30:55 +02:00
Tom Hvitved
fdb0c6ebb5 Merge pull request #20454 from paldepind/rust/path-resolution-attribute-expansion
Rust: Account for attribute expansions in path resolution
2025-09-20 09:21:00 +02:00
Chad Bentz
f4bbbc346f Refactor Grape framework to be encapsulated properly in Module 2025-09-19 19:06:50 -04:00
Chad Bentz
89e9ee43c0 Convert from GrapeHelperMethodTaintStep extends AdditionalTaintStep to a simplified GrapeHelperMethodTarget extends AdditionalCallTarget 2025-09-19 18:28:45 -04:00
Joe Farebrother
6eac6b7258 Rename qhelp file 2025-09-19 17:03:19 +01:00
Geoffrey White
c26a07bb10 Apply suggestions from code review
Co-authored-by: Simon Friis Vindum <simonfv@gmail.com>
2025-09-19 16:49:54 +01:00
Taus
b9f073e596 Python: Update test output 2025-09-19 15:39:12 +00:00
Geoffrey White
523ec9d633 Merge pull request #20439 from geoffw0/assignment
Rust: Add a couple of simple data flow test cases
2025-09-19 16:27:14 +01:00
Taus
95a84ad655 Python: Fix false positive for unmatchable dollar/caret
Our previous modelling did not account for the fact that a lookahead can
potentially extend all the way to the end of the input (and similarly,
that a lookbehind can extend all the way to the beginning).

To fix this, I extended `firstPart` and `lastPart` to handle lookbehinds
and lookaheads correctly, and added some test cases (all of which yield
no new results).

Fixes #20429.
2025-09-19 15:06:46 +00:00
Joe Farebrother
a9a258e743 Add changenote 2025-09-19 15:11:02 +01:00
Joe Farebrother
2e95c2b3c2 Split test cases for insecure cookie queries 2025-09-19 14:41:02 +01:00
Alexander Eyers-Taylor
c1c0828082 Merge pull request #20378 from github/alexet/java-regex-local
Jave: Use force local to make parsing local after global regex finding.
2025-09-19 13:48:43 +01:00
Alexander Eyers-Taylor
27e2c4d580 Merge pull request #20459 from github/alexet/caller_tc
Java: Make a TC overlay caller.
2025-09-19 13:48:34 +01:00
Napalys Klicius
3a6a537986 JS: Add change note 2025-09-19 14:47:58 +02:00
Napalys Klicius
6cfc950159 JS: Model GraphQLObjectType resolve params as sources 2025-09-19 14:39:36 +02:00
Simon Friis Vindum
afb6d30762 Rust: Fix typo in superseded 2025-09-19 14:27:14 +02:00
Simon Friis Vindum
72103adacc Rust: Fix spurious path resolution
The annotated impl block was filtered away, but it's children where not. This caused the associated type `Foo` to appear as if it was an item in the scope outside of the impl block.
2025-09-19 14:25:11 +02:00
Simon Friis Vindum
60ceb89f01 Rust: Add debug predicate for ItemNode 2025-09-19 14:23:44 +02:00
Napalys Klicius
d88bc8e408 JS: Add test case for GraphQLObjectType 2025-09-19 14:23:40 +02:00
Simon Friis Vindum
a9d7662bb7 Rust: Add path resolution test with attribute on impl block 2025-09-19 14:23:39 +02:00
Simon Friis Vindum
2c84b49ced Rust: Update test expecations 2025-09-19 14:22:10 +02:00
Simon Friis Vindum
32365fd673 Rust: Account for attribute expansions in path resolution 2025-09-19 14:22:00 +02:00
Simon Friis Vindum
c7a9cc5a42 Rust: Use annotations also for items in macro expansions 2025-09-19 14:19:27 +02:00
Joe Farebrother
04316d306f Update qhelp 2025-09-19 12:42:30 +01:00
Tom Hvitved
5d3b5424ba Merge pull request #20453 from hvitved/rust/path-resolution-use-reexport
Rust: Path resolution improvements
2025-09-19 13:34:56 +02:00
Philip Ginsbach
b85ab3c0ab Merge pull request #20490 from github/ginsbach/AdditionalAndExtensible
documentation: add some missing mentions of `additional` and `extensible`
2025-09-19 11:54:45 +01:00
Philip Ginsbach
b27d374578 mention 'additional' and 'extensible' annotations 2025-09-19 10:57:03 +01:00
Philip Ginsbach
a6c1ffc45d sort the annotations alphabetically 2025-09-19 10:56:57 +01:00
Tom Hvitved
f6bdfba3b3 Rust: Path resolution improvements 2025-09-19 09:43:22 +02:00
Tom Hvitved
c831a8c2d9 Rust: Add more path resolution tests 2025-09-19 09:36:54 +02:00
Joe Farebrother
7eabed6594 Split insecure cookies queries into 3 queries 2025-09-18 13:34:10 +01:00
Mathias Vorreiter Pedersen
c481be8ea7 C++: Accept test changes for tests that select all types of an expression. 2025-09-18 12:16:28 +01:00
Mathias Vorreiter Pedersen
a4dbee3b13 C++: Add change note. 2025-09-18 12:16:26 +01:00
Mathias Vorreiter Pedersen
e22d6656fe C++: Fix barrier guards. 2025-09-18 12:16:25 +01:00
Mathias Vorreiter Pedersen
d8f34dba17 C++: Do not use the deprecated predicate in queries. 2025-09-18 12:16:23 +01:00
Mathias Vorreiter Pedersen
5e82eb9b24 C++: Fixup queries which assumes that a guard is always an expression. 2025-09-18 12:16:21 +01:00
Mathias Vorreiter Pedersen
fbd877a118 C++: Delete a test. This is no longer useful when every expression is a guard condition. 2025-09-18 12:16:20 +01:00
Mathias Vorreiter Pedersen
2dc783d91f C++: Accept test changes. 2025-09-18 12:16:16 +01:00
Mathias Vorreiter Pedersen
0b81fbbb2b C++: Fixup tests. 2025-09-18 12:16:11 +01:00
Mathias Vorreiter Pedersen
9ed8b75c5d C++: Add a few helper predicates on 'Definition' which the guards library needs. 2025-09-18 11:05:55 +01:00
Mathias Vorreiter Pedersen
ac5233d19c C++: Lots of renamings. 2025-09-18 11:05:54 +01:00
Mathias Vorreiter Pedersen
840097f121 C++: Instantiate the shared guards library. 2025-09-18 11:05:52 +01:00
Mathias Vorreiter Pedersen
3a8f77d6f4 C++: Qualified import of cpp. 2025-09-18 11:05:50 +01:00
Mathias Vorreiter Pedersen
2b0b8402ce C++: Delete a bunch of predicates. Also set up things so that they work after instantiating the shared guards library. 2025-09-18 11:05:49 +01:00
Mathias Vorreiter Pedersen
f0f4311b65 C++: Sync identical files. 2025-09-18 11:05:47 +01:00
Mathias Vorreiter Pedersen
70a8364a38 C++: Add another convenience predicate on 'BinaryInstruction'. 2025-09-18 11:05:45 +01:00
Mathias Vorreiter Pedersen
19b8e0db9c C++: Add a few subclasses to 'EdgeKind'. 2025-09-18 11:05:43 +01:00
Mathias Vorreiter Pedersen
be8195ab7d C++: Do not rely on dataflow nodes when implement 'getAUse' and 'getAnIndirectUse'. This will solve a non-monotonic recursion issue later. 2025-09-18 11:05:39 +01:00
Mathias Vorreiter Pedersen
f47dd2bbc6 C++: Add a 'hasInputFromBlock' predicate. 2025-09-18 11:05:38 +01:00
Kasper Svendsen
dbb9a26f78 Overlay: Future-proof Java XML discarding 2025-09-18 11:37:38 +02:00
Mathias Vorreiter Pedersen
f55ace8311 C++: Make the return type a bit more precise. 2025-09-18 10:10:07 +01:00
Kasper Svendsen
3cd737e40d Overlay: Future-proof Java config discarding 2025-09-18 10:57:22 +02:00
Joe Farebrother
2cd1d2fd2f Merge pull request #20392 from joefarebrother/python-qual-file-not-closed
Python: Improve File Not Closed query to reduce false positives and provide clearer alerts
2025-09-18 09:33:08 +01:00
Anders Schack-Mulligen
8f859647c4 Merge pull request #20457 from aschackmull/shared/cfg-fix-joinblock-pred
Shared/Cfg: Fix missing JoinBlockPredecessor.
2025-09-18 09:28:24 +02:00
Tom Hvitved
51a33c279d Merge pull request #20460 from hvitved/rust/source-inline-flow-path-problem 2025-09-18 09:27:06 +02:00
Anders Schack-Mulligen
d93b2edc0d Ruby: Accept test changes. 2025-09-18 08:13:43 +02:00
Tom Hvitved
aba2cb487e Rust: Convert data flow test to @kind path-problem 2025-09-17 20:52:17 +02:00
Chad Bentz
141b470002 Merge branch 'main' into ruby-framework-grape 2025-09-17 12:12:13 -04:00
Alex Eyers-Taylor
34b40a14e8 Java: Make a TC overlay caller. 2025-09-17 16:22:22 +01:00
Anders Schack-Mulligen
d5a238768c Shared/Cfg: Fix missing JoinBlockPredecessor. 2025-09-17 16:37:23 +02:00
Napalys Klicius
4f8166a661 Merge pull request #20450 from Napalys/js/graph-ql-ench
JS: Improve graphql flow
2025-09-17 16:32:01 +02:00
Simon Friis Vindum
203788d4f1 Merge pull request #20408 from paldepind/rust/update-rust-analyzer
Rust: Upgrade to rust-analyzer 0.0.301
2025-09-17 16:04:35 +02:00
Geoffrey White
1bccf42556 Rust: Update test results following fix on main. 2025-09-17 14:02:06 +01:00
Geoffrey White
3910a348fd Merge branch 'main' into assignment 2025-09-17 13:56:57 +01:00
Michael Nebel
398f29a995 Merge pull request #20292 from michaelnebel/csharp/code-quality-extended
C#: Add most `medium` precision queries to the `code-quality-extended` suite.
2025-09-17 14:34:08 +02:00
Joe Farebrother
f3802ec60f Merge pull request #20217 from joefarebrother/python-qual-signature-mismatch
Python: Modernize the Signature Mismatch query
2025-09-17 13:29:33 +01:00
Ian Lynagh
c653d939d9 Merge pull request #20451 from github/post-release-prep/codeql-cli-2.23.1
Post-release preparation for codeql-cli-2.23.1
2025-09-17 13:00:14 +01:00
Michael Nebel
34ebed1a24 Merge pull request #20402 from michaelnebel/python/code-quality-extended
Python: Add most `medium` precision queries to the `code-quality-extended` suite.
2025-09-17 13:48:35 +02:00
Michael Nebel
6d330891db Merge pull request #20395 from michaelnebel/javascript/code-quality-extended
JS: Add most `medium` precision queries to the `code-quality-extended` suite.
2025-09-17 13:47:02 +02:00
Michael Nebel
7589d0a18a Merge pull request #20394 from michaelnebel/java/code-quality-extended
Java: Add most `medium` precision queries to the `code-quality-extended` suite.
2025-09-17 13:46:24 +02:00
Taus
f5a06bef4a Merge pull request #19929 from github/tausbn/python-update-tree-sitter-dependency
Python: Update `tree-sitter` dependency
2025-09-17 13:40:13 +02:00
Napalys Klicius
4226fd29f5 Merge pull request #20162 from Napalys/python/global_variable_tracking
Python: Add jump steps for global variable nested field access
2025-09-17 13:38:07 +02:00
Anders Schack-Mulligen
ab5f6717b6 Merge pull request #20449 from aschackmull/csharp/nullguard-pattern
C#: Bugfix for nullguards for complex patterns.
2025-09-17 13:10:16 +02:00
Anders Schack-Mulligen
afc98cacbe C#: Add change note. 2025-09-17 12:49:25 +02:00
Napalys Klicius
7affcf40c2 JS: Add variableValues to the previous summaryModel to enchance the flow. 2025-09-17 12:24:14 +02:00
Napalys Klicius
6c18b4de40 JS: Add test case for graph ql variableValues injection 2025-09-17 12:21:21 +02:00
github-actions[bot]
4e8343664f Post-release preparation for codeql-cli-2.23.1 2025-09-17 10:13:40 +00:00
Anders Schack-Mulligen
5e76d5ff3f C#: Rename predicate as per review, and fixup qltest. 2025-09-17 11:58:39 +02:00
Napalys Klicius
6d461d6b50 JS: Add change note 2025-09-17 11:48:49 +02:00
Napalys Klicius
4282005e32 JS: Add summary model for graphql's rootValue 2025-09-17 11:48:44 +02:00
Simon Friis Vindum
05d5c1dda7 Merge pull request #20398 from paldepind/rust/warp-model
Rust: Add tests and models for Warp
2025-09-17 11:37:56 +02:00
Ian Lynagh
ce9c8e6e9f Merge pull request #20447 from github/release-prep/2.23.1
Release preparation for version 2.23.1
2025-09-17 10:26:24 +01:00
Napalys Klicius
a6d728a66d JS: Add test case with missing alert using graphql 2025-09-17 11:23:49 +02:00
Napalys Klicius
e1d27f340e Merge pull request #20135 from Napalys/js/dynamodb
JS: Modeling of `aws-sdk` clients*
2025-09-17 10:47:39 +02:00
Simon Friis Vindum
c1ebe920a1 Rust: Update expected file 2025-09-17 10:38:00 +02:00
Napalys Klicius
ca667b5131 JS: fix test expectations from rebasing 2025-09-17 10:24:45 +02:00
Napalys Klicius
4df8db0d7e Renamed AWS-V3-Common to @aws-sdk/client.Client 2025-09-17 10:21:29 +02:00
Napalys Klicius
10f3a83fcb Fixed model type names
Co-authored-by: asgerf <asgerf@users.noreply.github.com>
2025-09-17 10:21:23 +02:00
Napalys Klicius
9ca4773227 Added modeling for CreatePreparedStatementCommand 2025-09-17 10:21:10 +02:00
Napalys Klicius
872b6d8bee Added test case for CreatePreparedStatementCommand 2025-09-17 10:21:01 +02:00
Napalys Klicius
b89e70b5a0 Added test cases for aws sources 2025-09-17 10:20:52 +02:00
Napalys Klicius
801a34f6a1 Moved typeModel at the start of the file 2025-09-17 10:20:24 +02:00
Napalys Klicius
9beac51586 Unified aws-db modeling into singular file 2025-09-17 10:20:10 +02:00
Napalys Klicius
5b31350e83 Added tests and modeling of database-access-result 2025-09-17 10:20:01 +02:00
Napalys Klicius
93d9ae73b7 Updated change note 2025-09-17 10:19:52 +02:00
Napalys Klicius
e5f02852e1 Added modeling of rds v2 and v3 for sql injections 2025-09-17 10:19:22 +02:00
Napalys Klicius
5b5c17100c Added test cases for client-rds-data for sql injections 2025-09-17 10:19:10 +02:00
Napalys Klicius
0e6bac73a7 Added modeling of athena v2 and v3 for sql injections 2025-09-17 10:18:58 +02:00
Napalys Klicius
af97b0edc2 Added test cases for athena v2 and v3 for sql injections 2025-09-17 10:16:38 +02:00
Napalys Klicius
ee1af432fe Added modeling of client-s3 v2 and v3 2025-09-17 10:16:25 +02:00
Napalys Klicius
5e6118ef3f Added test cases for client-s v2 and v3 sql injection 2025-09-17 10:15:43 +02:00
Napalys Klicius
1149617f7b Added change note 2025-09-17 10:15:32 +02:00
Napalys Klicius
06ab918985 Added modeling for V2 of dynamoDB 2025-09-17 10:15:19 +02:00
Napalys Klicius
ae2e8b1292 Added modeling of dynamodb v3 for sql injections 2025-09-17 10:13:24 +02:00
Napalys Klicius
0a3343a07d Added test cases for v2 and v3 sql injection of dynamodb 2025-09-17 10:11:31 +02:00
Simon Friis Vindum
e80c192cf2 Rust: Use async closure instead of async block 2025-09-17 10:01:51 +02:00
Anders Schack-Mulligen
62c8f28e74 C#: Bugfix for nullguards for complex patterns. 2025-09-17 09:28:54 +02:00
Tom Hvitved
a7173e0c05 Merge pull request #20443 from hvitved/rust/ssa-adjust-write-note
Rust: Adjust SSA write node for (compound) assignments
2025-09-17 09:25:50 +02:00
Simon Friis Vindum
46cd62bd51 Rust: Use .. notation in model 2025-09-17 09:18:41 +02:00
Simon Friis Vindum
f432498574 Rust: Use comma notation in Warp model 2025-09-17 09:18:40 +02:00
Simon Friis Vindum
1af6b37fc4 Rust: Add models for Warp 2025-09-17 09:18:39 +02:00
Simon Friis Vindum
bfe934118d Rust: Add web framework tests for Warp 2025-09-17 09:18:37 +02:00
Chad Bentz
c5e3be2c4c Grape - detect params calls inside helper methods
- added unit tests for flow using inline format
- removed grape from Arel tests (temporary)
2025-09-16 17:09:18 -04:00
Geoffrey White
6f1fcbf41b Rust: Add IPv6 private address range (and explanatory comments). 2025-09-16 17:21:08 +01:00
Taus
8fd62252fd Python: Fix bad join in globalVariableNestedFieldJumpStep 2025-09-16 18:12:29 +02:00
Napalys Klicius
431fc8880e Python: Add change note 2025-09-16 18:08:53 +02:00
Napalys Klicius
e82fe9d919 Python: Updated doc string and removed redundant predicate. 2025-09-16 18:08:53 +02:00
Taus
e228aac61f Python: Use AttrWrite.writes
Also applies @napalys' fix to the base case.
2025-09-16 18:08:53 +02:00
Taus
6f9e06c59e Python: Add AttrWrite.writes and AttrRead.reads
The latter of these is identical to `AttrRef.accesses`, but makes the
API a bit more intuitive.
2025-09-16 18:08:53 +02:00
Napalys Klicius
8393ccf39d Python: Update globalVariableAttrPathAtDepth base case 2025-09-16 18:08:53 +02:00
Taus
6133f01c81 Python: Rewrite access path computation 2025-09-16 18:08:53 +02:00
Taus
69b5853477 Python: Keep track of access path 2025-09-16 18:08:53 +02:00
Napalys Klicius
e60d0c88f1 Python: Add global variable nested field jump steps 2025-09-16 18:08:53 +02:00
Napalys Klicius
9d4b168977 Python: Added extra test for global variable nested attribute reads/writes. 2025-09-16 18:08:53 +02:00
Napalys Klicius
6c779c7fa5 Python: Added extra test cases for path injection with FastAPI 2025-09-16 18:08:53 +02:00
Napalys Klicius
f209e3a0fe Python: Updated PathInjection tests to use inline test expectations 2025-09-16 18:08:53 +02:00
Alex Eyers-Taylor
2201974844 Jave: Use force local to make parsing local after global regex finding. 2025-09-16 15:55:04 +01:00
github-actions[bot]
02a1b1efcb Release preparation for version 2.23.1 2025-09-16 14:14:42 +00:00
Geoffrey White
7c22fe269f Merge branch 'main' into https 2025-09-16 14:28:23 +01:00
Chad Bentz
ffd32efba2 codeql query format 2025-09-16 09:08:07 -04:00
Geoffrey White
31bf86fd1b Rust: Improve the flow around the qhelp example. 2025-09-16 14:04:55 +01:00
Geoffrey White
0eb602aad2 Rust: Update a redirected URL. 2025-09-16 14:00:43 +01:00
Asger F
7670a2bd77 Merge pull request #20375 from asgerf/js/promise-try
JS: Support Promise.try and Array.prototype.with
2025-09-16 14:44:07 +02:00
Geoffrey White
5d40075944 Merge branch 'main' into assignment 2025-09-16 13:30:20 +01:00
Jonas Jensen
eac8a79d49 Merge pull request #20420 from jbj/no-qll-deprecation
Docs: remove 1-year deprecation period for QL libraries
2025-09-16 14:18:36 +02:00
Napalys Klicius
97a11de1e3 Merge pull request #20435 from Napalys/js/promisification_modeling
JS: Promisification library modeling and enhance flow
2025-09-16 14:07:53 +02:00
Geoffrey White
4b281fdf12 Rust: Use case insensitive regexps. 2025-09-16 13:02:54 +01:00
Michael Nebel
d903448695 C#: Add change note. 2025-09-16 13:58:28 +02:00
Michael Nebel
f9cecfb666 C#: Update integration test expected output. 2025-09-16 13:56:14 +02:00
Michael Nebel
98a7cd24c0 C#: Remove all cs/xmldoc/* queries from the code-quality-extended suite. 2025-09-16 13:56:13 +02:00
Michael Nebel
0ce0e834ed C#: Update integration tests expected output. 2025-09-16 13:56:11 +02:00
Michael Nebel
cdd379113e C#: Remove cs/captured-foreach-variable from the code-quality-extended suite. 2025-09-16 13:56:09 +02:00
Michael Nebel
47873c20de C#: Fix incorrect tagging. 2025-09-16 13:56:07 +02:00
Michael Nebel
c9a761f202 C#: Remove the cs/xmldoc/missing-xmldoc from the code-quality-extended. 2025-09-16 13:56:05 +02:00
Michael Nebel
906e9de5ee C#: Update query-suite integration tests expected output. 2025-09-16 13:56:04 +02:00
Michael Nebel
17735a9a43 C#: Add queries medium precision queries to the code-quality-extended suite (and update tags). 2025-09-16 13:56:02 +02:00
Geoffrey White
80ce55ab10 Rust: Make the private address spaces URL more accurate. 2025-09-16 12:53:44 +01:00
Asger F
edf79a3730 JS: Change note 2025-09-16 13:53:31 +02:00
Asger F
0b900711bf Update javascript/ql/lib/semmle/javascript/frameworks/Express.qll
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-09-16 13:48:26 +02:00
Geoffrey White
0f5aa857b8 Rust: Remove unnecessary import. 2025-09-16 12:41:28 +01:00
Geoffrey White
9c7fc58337 Rust: Add tests for a few more edge cases. 2025-09-16 12:41:00 +01:00
Michael Nebel
6d9e489e7c Merge pull request #20445 from michaelnebel/csharp/fixintegrationtest
C#: Fix failing integration test after new version of `NewtonSoft.JSon` has been released.
2025-09-16 13:38:55 +02:00
Geoffrey White
0924dec545 Rust: Make the tests of the example code closer to the actual example code. 2025-09-16 12:28:52 +01:00
Tom Hvitved
a2d83274bc Merge pull request #20441 from geoffw0/fixrfquery
Rust: Fix a minor issue with the test for rust/request-forgery
2025-09-16 13:22:58 +02:00
Geoffrey White
7b04cf1a73 Rust: Fix up the test annotations. 2025-09-16 12:20:29 +01:00
Michael Nebel
8fbd720fe5 C#: Fix failing integration test after new version of NewtonSoft.JSon has been released. 2025-09-16 13:14:23 +02:00
Napalys Klicius
49ccb8ce2b JS: Simplify exist clause to use Promisify::PromisifyAllCall instead of DataFlow::SourceNode 2025-09-16 13:13:15 +02:00
Asger F
429c4eac96 JS: Add support for Array.prototype.with
Note: This was authored by Copilot
2025-09-16 13:06:59 +02:00
Asger F
ee78b7dc96 JS: Add support for Promise.try 2025-09-16 13:06:57 +02:00
Tom Hvitved
7cac226ad9 Rust: Adjust SSA write node for (compound) assignments 2025-09-16 13:05:50 +02:00
Tom Hvitved
4e77b1b9b8 Rust: Add self-assignment variable test 2025-09-16 13:05:48 +02:00
Asger F
45eff3dac8 Merge pull request #20399 from asgerf/js/default-interop2
JS: Refactor handling of ambiguous default imports
2025-09-16 13:02:22 +02:00
Asger F
78bfdfd931 Merge pull request #20390 from asgerf/post-update-consistency
DataFlow: Permit local flow between post-update nodes
2025-09-16 13:00:29 +02:00
Geoffrey White
49de716f10 Rust: Accept consistency check changes. 2025-09-16 10:50:28 +01:00
Mathias Vorreiter Pedersen
fa36d9f84e Merge pull request #20438 from MathiasVP/remove-antijoin-in-shared-guards
Shared: Remove antijoin from `Guards.qll`
2025-09-16 10:40:45 +01:00
Anders Schack-Mulligen
0ceb2f3f72 Merge pull request #20442 from aschackmull/csharp/default-tostring-enum
C#: Exclude enum types as they don't inherit the default toString.
2025-09-16 11:12:21 +02:00
Anders Schack-Mulligen
57e15b9a91 Merge pull request #20367 from aschackmull/shared/controlflow
Shared/Java: Introduce a shared control flow reachability library and replace the Java Nullness implementation.
2025-09-16 10:44:44 +02:00
Anders Schack-Mulligen
107d142b24 C#: Exclude enum types as they don't inherit the default toString. 2025-09-16 10:33:25 +02:00
Jeroen Ketema
6264f46970 Merge pull request #20440 from MathiasVP/converted-barrier-in-unbounded-write
C++: Fix barrier in `cpp/unbounded-write`
2025-09-16 10:19:21 +02:00
Geoffrey White
61faeef1d3 Rust: Pretty print models, so that the MaD IDs aren't reported raw / in continual flux. 2025-09-16 09:00:40 +01:00
Geoffrey White
5c33af32e3 Rust: Update .expected file. 2025-09-16 08:55:49 +01:00
Asger F
65102a073a Merge pull request #19770 from trailofbits/VF/async-package-improvements
Improve data flow in the `async` package
2025-09-16 08:55:52 +02:00
Asger F
f587273828 Merge pull request #19768 from trailofbits/VF/lodash-group-by
Add lodash GroupBy as taint step
2025-09-16 08:55:13 +02:00
Chad Bentz
0d0ce32ef2 Merge branch 'ruby-framework-grape' of github.com:felickz/codeql into ruby-framework-grape 2025-09-15 22:11:38 -04:00
Chad Bentz
fc98cd8d08 Fix naming standards 2025-09-15 22:11:33 -04:00
Chad Bentz
19cb187436 Update ruby/ql/lib/codeql/ruby/frameworks/Grape.qll
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-09-15 22:03:27 -04:00
Chad Bentz
6cea93919e Merge branch 'main' into ruby-framework-grape 2025-09-15 22:02:24 -04:00
Chad Bentz
a8d4d6b563 Apply naming standards + changenote 2025-09-15 22:02:03 -04:00
Chris Smowton
c375f24598 Merge pull request #20423 from smowton/smowton/fix/length-comparison-off-by-one-fp
JS: Recognise that a less-than test is as good as a non-equal test for mitigating off-by-one array access
2025-09-15 18:24:45 +01:00
Geoffrey White
3ca287454a Merge branch 'main' into assignment 2025-09-15 18:01:19 +01:00
Geoffrey White
8442146a0f Rust: Add a couple of simple data flow test cases. 2025-09-15 17:37:30 +01:00
Napalys Klicius
278a1efb4b JS: Add change note 2025-09-15 18:21:45 +02:00
Mathias Vorreiter Pedersen
18c96fd7d4 Shared: Remove antijoin. 2025-09-15 17:12:23 +01:00
Ian Lynagh
9231119b07 Merge pull request #20437 from github/igfoo/tweak-release-note
C++: Tweak a release note
2025-09-15 16:39:51 +01:00
Mathias Vorreiter Pedersen
a4c845c418 C++: Fix barrier in 'cpp/unbounded-write'. 2025-09-15 16:34:05 +01:00
Ian Lynagh
cc72314219 C++: Tweak a release note 2025-09-15 16:26:32 +01:00
Ian Lynagh
7860857b55 Merge pull request #20434 from github/igfoo/fix-typo
javascript: Fix spelling error in documentation
2025-09-15 16:21:57 +01:00
Ian Lynagh
b797df6ad5 Merge pull request #20436 from github/igfoo/fix-typo-substract
Csharp: Fix typo in LeapYear qhelp
2025-09-15 16:21:26 +01:00
Napalys Klicius
3a75500f54 JS: Add modeling for call-me-maybe 2025-09-15 17:15:31 +02:00
Napalys Klicius
0d23ab07db JS: Add data flow modeling for promisified user-defined functions 2025-09-15 17:13:13 +02:00
Napalys Klicius
2c6db00cbc JS: Add modeling for util promisify* 2025-09-15 17:09:28 +02:00
Napalys Klicius
e002f2088f JS: Add modeling for es6-promisify 2025-09-15 17:04:34 +02:00
Napalys Klicius
35c75c00ba JS: Add modeling for @gar/promisify 2025-09-15 16:58:11 +02:00
Napalys Klicius
312471e9db JS: Add modeling for @google-cloud/promisify 2025-09-15 16:55:27 +02:00
Napalys Klicius
d37425ae3e JS: Treat promisify(obj).member as obj.member 2025-09-15 16:51:19 +02:00
Ian Lynagh
5cf052dec1 Csharp: Fix typo in LeapYear qhelp
Corrects "add/substract" to "add/subtract" in the UnsafeYearConstruction.qhelp
file to improve clarity.
2025-09-15 15:44:11 +01:00
Napalys Klicius
22b61852a1 JS: Add modeling for thenify-all 2025-09-15 16:31:14 +02:00
Napalys Klicius
d6a14e63ba JS: Add test cases for promisification libraries. 2025-09-15 16:21:12 +02:00
Ian Lynagh
d0091e1b3c javascript: Fix spelling error in documentation
Corrects the spelling of "occurrences" in the Incomplete Multi-Character
Sanitization documentation to improve clarity.
2025-09-15 14:53:22 +01:00
copilot-swe-agent[bot]
e630bf86bd Implement Rust non-HTTPS URL query (CWE-319)
Co-authored-by: geoffw0 <40627776+geoffw0@users.noreply.github.com>
2025-09-15 11:44:05 +00:00
copilot-swe-agent[bot]
459f00ab41 Initial plan 2025-09-15 11:25:11 +00:00
Simon Friis Vindum
78389c8897 Merge pull request #20133 from paldepind/rust/type-inference-blanket-impl
Rust: Support blanket implementations
2025-09-15 12:46:41 +02:00
Simon Friis Vindum
af49301332 Merge pull request #20381 from paldepind/rust/request-forgery-query
Rust: Add basic request forgery query
2025-09-15 12:46:23 +02:00
Geoffrey White
00f644888c Merge pull request #20426 from geoffw0/cookie2
Rust: cookie and biscotti crypto query sinks
2025-09-15 11:07:46 +01:00
Anders Schack-Mulligen
acb4d9f681 Shared: Copy some qldoc from Guards.qll 2025-09-15 11:41:23 +02:00
Simon Friis Vindum
35438294d1 Rust: Remove condition that always holds 2025-09-15 10:58:27 +02:00
Anders Schack-Mulligen
be39c4c0cd Shared: Minor precision improvement. 2025-09-15 10:38:49 +02:00
Simon Friis Vindum
875c7da87c Rust: Improve comments in type inference 2025-09-15 10:37:38 +02:00
Anders Schack-Mulligen
b308c5438f Java: Add a change note, and a minor ql comment. 2025-09-15 10:14:26 +02:00
Simon Friis Vindum
50bdc658ba Rust: Apply documentation tweaks 2025-09-15 09:32:33 +02:00
Chad Bentz
5cfa6e83b3 Add support for route parameters(+ blocks), headers, and cookies in Grape API 2025-09-12 22:51:47 -04:00
Chad Bentz
3252bd39d2 Enhance Grape framework with additional data flow modeling and helper method support 2025-09-12 22:13:21 -04:00
Chad Bentz
738ab6fba7 Refactor Grape framework code for improved readability and consistency 2025-09-12 19:23:15 -04:00
Chad Bentz
d295acc3c3 Add initial support for Ruby Grape 2025-09-12 19:22:05 -04:00
Geoffrey White
989081ba4a Rust: Change note. 2025-09-12 18:12:59 +01:00
Geoffrey White
118ac07b71 Rust: Convert 'from' models into one generic one. 2025-09-12 18:05:30 +01:00
Geoffrey White
9f83b67a7c Rust: Model vec::from_elem. 2025-09-12 17:30:44 +01:00
Geoffrey White
e2d94127d6 Rust: Model vec::from. 2025-09-12 16:44:47 +01:00
Geoffrey White
5d3ea2f4d3 Rust: Add models for the cookie and biscotti crates. 2025-09-12 16:13:14 +01:00
Geoffrey White
2bb9e2f7be Rust: Add test cases for hardcoded cryptographic constants in cookies. 2025-09-12 15:42:56 +01:00
Simon Friis Vindum
e2e6fd0683 Rust: Address feedback from PR review 2025-09-12 16:10:58 +02:00
Simon Friis Vindum
19c529e87b Bazel: regenerate vendored cargo dependencies 2025-09-12 15:48:23 +02:00
Simon Friis Vindum
3cf1a16a13 Cargo: upgrade dependencies 2025-09-12 15:45:37 +02:00
Anders Schack-Mulligen
e302616135 Java: Accept qltest change. 2025-09-12 15:41:18 +02:00
Anders Schack-Mulligen
f9ffee010f Java: Minor nullness cleanup. 2025-09-12 15:41:17 +02:00
Anders Schack-Mulligen
2743fc0be1 Guards: Include ConditionalExpr in exprHasValue. 2025-09-12 15:41:17 +02:00
Anders Schack-Mulligen
e8f1ec68db Java: Accept guards test results. 2025-09-12 15:41:17 +02:00
Anders Schack-Mulligen
60d07cf30d Java: Clean up IntegerGuards.qll 2025-09-12 15:41:16 +02:00
Anders Schack-Mulligen
03321ff910 Java: Replace nullness implementation. 2025-09-12 15:41:16 +02:00
Anders Schack-Mulligen
4a8ffea0f6 Shared: Add control flow reachability lib. 2025-09-12 15:41:15 +02:00
Simon Friis Vindum
f48b643375 Bazel: regenerate vendored cargo dependencies 2025-09-12 15:38:18 +02:00
Simon Friis Vindum
12dcd751d3 Rust: Accept test changes 2025-09-12 15:34:09 +02:00
Simon Friis Vindum
29ba013580 Rust: Add support for resolving methods from blanket implementations 2025-09-12 15:34:04 +02:00
Chris Smowton
db5c58180e Change note 2025-09-12 14:32:12 +01:00
Chris Smowton
f5780ae369 Amend docstring 2025-09-12 14:32:10 +01:00
Chris Smowton
4fb133a43d Recognise that a less-than test is as good as a non-equal test for mitigating off-by-one array access 2025-09-12 14:32:07 +01:00
Simon Friis Vindum
d10cdfb7f1 Rust: Move existing blanket implementation test 2025-09-12 15:31:42 +02:00
Simon Friis Vindum
69a1c7e1e8 Rust: Add tests with blanket implementation 2025-09-12 15:26:19 +02:00
Anders Schack-Mulligen
452bbf7289 Java: Add some more nullness tests. 2025-09-12 13:38:21 +02:00
Anders Schack-Mulligen
924a8eac5c Java: Improve precision of SuccessorType labels in CFG. 2025-09-12 13:38:21 +02:00
Anders Schack-Mulligen
1ebdcdfa8c Guards: Support integer ranges. 2025-09-12 13:38:20 +02:00
Anders Schack-Mulligen
db1f399067 Java: Preparatory Nullness refactor. 2025-09-12 13:38:20 +02:00
Anders Schack-Mulligen
e8ddac08b7 Merge pull request #20377 from aschackmull/java/preconditions
Java: Consolidate Assertions.qll and Preconditions.qll.
2025-09-12 13:37:41 +02:00
Alexander Eyers-Taylor
e9fcd985f9 Merge pull request #20357 from github/alexet/java-global-virtual-dispatch
Java: Make Virtual Dispatch Global, but keep SSA local.
2025-09-12 12:20:46 +01:00
Geoffrey White
d638ee9741 Merge pull request #20404 from geoffw0/rustanalyzerdoc
Rust: add `rust-analyzer` update instructions
2025-09-12 11:17:10 +01:00
Jeroen Ketema
7c35835e25 Merge pull request #20422 from jketema/go-log
Go: Retrofit the change log to mention Go 1.25
2025-09-12 11:20:03 +02:00
Jeroen Ketema
a773042c5d Merge pull request #20407 from jketema/dyn-too-many
C++: Add `cpp/uninitialized-local` test
2025-09-12 11:12:28 +02:00
Jeroen Ketema
0f5bd3799e Merge branch 'main' into go-log 2025-09-12 11:12:01 +02:00
Jeroen Ketema
3de9356141 Go: Retrofit the change log to mention Go 1.25
This can only be a minor change (or something similar) to stay within the
semantic versioning contraints. This is because only the patch version of
the Go ql library pack was bumped during the release. Since there were no new
language features in Go 1.25, this might also be the most accurate choice here.
2025-09-12 11:08:42 +02:00
Jeroen Ketema
352610d651 C++: Add GOOD annotation 2025-09-12 10:29:27 +02:00
Simon Friis Vindum
fd5b5baa8f Merge pull request #20403 from paldepind/rust/certain-struct-expr
Rust: Infer certain type information for struct expressions
2025-09-12 10:28:07 +02:00
Geoffrey White
92124a9033 Update rust/README.md 2025-09-12 09:01:13 +01:00
Jonas Jensen
5ac80353d2 Docs: remove outdated link to change notes.
The change notes are now maintained under each query pack, so there's no
single place where we can link to it.
2025-09-12 09:26:23 +02:00
Jonas Jensen
cb766de37e Docs: remove 1-year deprecation period for QL libs
Internal reference: codeql-team ADR 0011.
2025-09-12 09:24:13 +02:00
Simon Friis Vindum
b456a8c4e5 Apply suggestions from code review
Co-authored-by: mc <42146119+mchammer01@users.noreply.github.com>
2025-09-12 09:09:00 +02:00
Asger F
132a8b8b53 JS: Model json and jsonp methods 2025-09-12 08:51:23 +02:00
Asger F
d729ab501b JS: Add test that calls .json or .jsonp 2025-09-12 08:51:21 +02:00
Alex Eyers-Taylor
d5ee91b1e8 Java: Adress comments form code review. 2025-09-11 17:14:08 +01:00
Geoffrey White
aaa67a2da9 Update rust/README.md
Co-authored-by: Simon Friis Vindum <paldepind@github.com>
2025-09-11 17:12:22 +01:00
Ian Lynagh
ffeece1179 Merge pull request #20410 from igfoo/igfoo/bmn-med
C++: Remove the BMN filter from some queries, but reduce precision to medium
2025-09-11 17:01:35 +01:00
Ian Lynagh
050a9e155f C++: Add changenote for changes to some queries
Queries affected:
    cpp/wrong-type-format-argument
    cpp/comparison-with-wider-type
    cpp/integer-multiplication-cast-to-long
    cpp/implicit-function-declaration
    cpp/suspicious-add-sizeof
2025-09-11 15:56:41 +01:00
Idriss Riouak
8ce2d3954e Merge pull request #20413 from github/idrissrio/java25-change-note
Java: Add change note and update supported versions
2025-09-11 16:39:28 +02:00
Ian Lynagh
cc131a09a1 C++: Accept changes to cpp/ql/integration-tests/query-suite 2025-09-11 15:01:04 +01:00
Michael Nebel
0b43203349 Merge pull request #20401 from michaelnebel/csharp/deprecatecapturedforeachvariable
C#: Deprecate `cs/captured-foreach-variable`.
2025-09-11 15:01:29 +02:00
Asger F
ae4cf302f2 Remove failures from dataflow-consistency expectations 2025-09-11 14:49:58 +02:00
Asger F
511308746c DataFlow: Permit local flow between post-update nodes 2025-09-11 14:49:56 +02:00
idrissrio
a0e963f769 Java: Add change note and update supported versions 2025-09-11 14:37:36 +02:00
Ian Lynagh
b3f4c68a1d C++: Remove the BMN filter from some queries, but reduce precision to medium
Remove the `not any(Compilation c).buildModeNone() and` clause from:
    cpp/wrong-type-format-argument
    cpp/comparison-with-wider-type
    cpp/integer-multiplication-cast-to-long
    cpp/implicit-function-declaration
    cpp/suspicious-add-sizeof
but reduce their precision to `medium`.
2025-09-11 13:32:11 +01:00
Idriss Riouak
0b5745c24b Merge pull request #20405 from github/workflow/coverage/update
Update CSV framework coverage reports
2025-09-11 14:17:08 +02:00
Michael B. Gale
f4575d9d03 Merge pull request #20406 from github/dependabot/go_modules/go/extractor/extractor-dependencies-93606d20ee
Bump golang.org/x/tools from 0.36.0 to 0.37.0 in /go/extractor in the extractor-dependencies group
2025-09-11 13:11:28 +01:00
Simon Friis Vindum
4d0635dc8a Update qhelp for request forgery query
Co-authored-by: mc <42146119+mchammer01@users.noreply.github.com>
2025-09-11 13:55:51 +02:00
Jeroen Ketema
d87e9ec095 Merge pull request #20409 from jketema/jketema/swift-changenote
Swift: Mention in update playbook that we want a change note
2025-09-11 13:03:56 +02:00
Owen Mansel-Chan
f74913aa4d Merge pull request #20411 from owen-mc/go/improve-pun-tests
Go: improve post-update node tests
2025-09-11 12:03:21 +01:00
Simon Friis Vindum
671bea58af Rust: Add certain type information for struct patterns 2025-09-11 12:43:26 +02:00
Owen Mansel-Chan
d9e7c89af0 Add indirect method calls 2025-09-11 11:31:28 +01:00
Owen Mansel-Chan
84e70e166e Add direct method calls 2025-09-11 11:27:56 +01:00
Owen Mansel-Chan
fa18fd2782 Add method defs 2025-09-11 11:24:53 +01:00
Owen Mansel-Chan
cbbf7c2578 Include pre-update node in output 2025-09-11 11:22:17 +01:00
Paolo Tranquilli
051da9d407 Merge branch 'main' into rustanalyzerdoc 2025-09-11 11:48:17 +02:00
Geoffrey White
32131cf9ae Update rust/README.md
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-09-11 10:36:04 +01:00
Simon Friis Vindum
50b3571124 Cargo: Revert changes to the Ruby extractors Cargo file 2025-09-11 11:35:33 +02:00
Simon Friis Vindum
61eea66c51 Bazel: regenerate vendored cargo dependencies 2025-09-11 11:35:15 +02:00
Jeroen Ketema
2f9961888a Swift: Mention in update playbook that we want a change note 2025-09-11 11:31:36 +02:00
Asger F
7a2391f848 JS: Deprecate Portals and delete tests
This is a super old attempt at model generation, from before MaD even existed. It's obsolete and just have to be removed.
2025-09-11 11:05:36 +02:00
Simon Friis Vindum
55d022f6eb Cargo: upgrade dependencies 2025-09-11 10:47:26 +02:00
Geoffrey White
8af8c6d95a Rust: Move upgrade script to the very end, add a few details. 2025-09-11 09:47:15 +01:00
Geoffrey White
9a96372f53 Rust: Add some more details. 2025-09-11 09:40:36 +01:00
Jeroen Ketema
2bc035cfcf C++: Update test results after extractor changes 2025-09-11 10:31:01 +02:00
Jeroen Ketema
d224f85b24 C++: Add uninitialized variable FP test 2025-09-11 10:31:00 +02:00
Idriss Riouak
59fc7aa8e1 Merge pull request #20385 from github/idrissrio/java-regression-statsfile
Java: Revert wrongly generated stats file
2025-09-11 10:28:59 +02:00
Anders Schack-Mulligen
e7df1b220c Java: Add change note. 2025-09-11 10:00:53 +02:00
Simon Friis Vindum
eea70069e7 Rust: Infer certain type information for struct expressions 2025-09-11 09:53:56 +02:00
Michael Nebel
c2628fe1df Python: Update integration tests expected output. 2025-09-11 08:44:18 +02:00
Michael Nebel
a774c65162 Python: Remove py/missing-docstring from code-quality-extended. 2025-09-11 08:41:33 +02:00
dependabot[bot]
b996dc3b62 Bump golang.org/x/tools
Bumps the extractor-dependencies group in /go/extractor with 1 update: [golang.org/x/tools](https://github.com/golang/tools).


Updates `golang.org/x/tools` from 0.36.0 to 0.37.0
- [Release notes](https://github.com/golang/tools/releases)
- [Commits](https://github.com/golang/tools/compare/v0.36.0...v0.37.0)

---
updated-dependencies:
- dependency-name: golang.org/x/tools
  dependency-version: 0.37.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: extractor-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-11 03:08:27 +00:00
github-actions[bot]
a6714809c4 Add changed framework coverage reports 2025-09-11 00:22:32 +00:00
Paolo Tranquilli
a9a0cb928e Rust: add rust-analyzer update instructions 2025-09-10 18:30:37 +01:00
Alex Eyers-Taylor
dcc5572767 Java: Hnalde global files as exceptions rather than annotating them
This allows us to merge them without redundent annoations for now.
2025-09-10 17:26:54 +01:00
Alex Eyers-Taylor
5c19aad012 Java: Make Virtual Dispatch Global, but keep SSA local.
Use forceLocal to achive this.
2025-09-10 17:26:54 +01:00
Mathias Vorreiter Pedersen
4227dd7d73 Merge pull request #20400 from MathiasVP/cleanup-incorrect-scanf-query
C++: Cleanup `ScanfChecks.qll`
2025-09-10 16:31:49 +01:00
Michael Nebel
07932590b5 Java: Update integration test expected output. 2025-09-10 16:15:48 +02:00
Michael Nebel
8e392cf8de Java: Remove java/undocumented-* queries from the code-quality-extended suite. 2025-09-10 16:13:24 +02:00
Michael Nebel
6ff6d0f6bd Java: Update integration test expected output. 2025-09-10 16:11:22 +02:00
Michael Nebel
56802035df Java: Add some medium precision queries to the code-quality-extended suite. 2025-09-10 16:11:20 +02:00
Michael Nebel
7c58098f12 Python: Update integration tests expected output. 2025-09-10 16:08:14 +02:00
Michael Nebel
7c0aa78e39 Python: Add many medium precision queries to the code-quality-extended suite. 2025-09-10 16:06:38 +02:00
Anders Schack-Mulligen
b5c7bc1b33 Java: Accept test output. 2025-09-10 15:42:18 +02:00
Anders Schack-Mulligen
3815503314 Java: Consolidate Assertions.qll and Preconditions.qll. 2025-09-10 15:42:18 +02:00
Simon Friis Vindum
065388df91 Rust: Fix formatting 2025-09-10 14:50:35 +02:00
Simon Friis Vindum
d1a3294f06 Merge branch 'main' into rust/request-forgery-query 2025-09-10 14:48:22 +02:00
idrissrio
762d2ef793 Java: Manually add new relation to stats file 2025-09-10 14:44:52 +02:00
idrissrio
a20737308a Java: Revert wrongly generated stats file
The stats file generated in commit
a6b68ec7de (diff-a4cfdde566085b7f1c1315487c13ef64e4869729ae7886b6c8f4267e3cd4eab6)
was created using the wrong process.

This commit reverts that change and manually adds the new relation
for isImplicitClass.
2025-09-10 14:44:50 +02:00
Simon Friis Vindum
c73d081a32 Rust: Fix based on review 2025-09-10 14:41:20 +02:00
Simon Friis Vindum
50cd200ec5 Apply suggestions from code review
Co-authored-by: Geoffrey White <40627776+geoffw0@users.noreply.github.com>
2025-09-10 14:34:54 +02:00
Mathias Vorreiter Pedersen
edec76ae10 Merge pull request #20370 from MathiasVP/source-bounded-fast-tc-in-typetracking
Shared: Use `sourceBoundedFastTC` in TypeTracking
2025-09-10 13:04:49 +01:00
Michael Nebel
186e42b1fe C#: Add change note. 2025-09-10 14:04:02 +02:00
Michael Nebel
e5da0b90ce C#: Deprecate cs/captured-foreach-variable. 2025-09-10 14:04:01 +02:00
Asger F
d39263dcac Merge pull request #20317 from asgerf/js/xunit
JS: Avoid overriding Expr predicates in xUnit.qll
2025-09-10 13:41:21 +02:00
Mathias Vorreiter Pedersen
72d7223fd0 C++: Small drive by cleanup. Delete unnecessary nested 'exists'. 2025-09-10 12:35:59 +01:00
Mathias Vorreiter Pedersen
d097946e1f C++: No need for this additional case. 2025-09-10 12:35:24 +01:00
Mathias Vorreiter Pedersen
5a9b562f19 Merge branch 'main' into source-bounded-fast-tc-in-typetracking 2025-09-10 12:14:01 +01:00
Asger F
dacc9e26e9 JS: Refactor 'default' import interop 2025-09-10 13:03:36 +02:00
Mathias Vorreiter Pedersen
f8bdf924db Shared: Make 'standardFlowsTo' private. 2025-09-10 11:26:36 +01:00
Mathias Vorreiter Pedersen
b7bc94b987 Update shared/typetracking/codeql/typetracking/internal/TypeTrackingImpl.qll
Co-authored-by: Anders Schack-Mulligen <aschackmull@users.noreply.github.com>
2025-09-10 11:21:25 +01:00
Michael Nebel
046d0d4938 Merge pull request #20396 from michaelnebel/csharp/improveintegrationteststability
C#: Increase attempts to reach nuget.org in integration tests to reduce flakiness.
2025-09-10 12:19:49 +02:00
Asger F
2a4d6830ec JS: An array of constants should be considered "filtered" 2025-09-10 11:07:32 +02:00
Asger F
602dae0592 JS: Add test showing FP 2025-09-10 10:58:34 +02:00
Asger F
36e18c2a89 JS: Enable inline expectations in BuildArtifactLeak
The tests already have the annotations, it just seems to have been disable by accident
2025-09-10 10:56:34 +02:00
Michael Nebel
fbc4f0b84f C#: Increase attempts to reach nuget.org in integration tests to reduce flakiness. 2025-09-10 09:03:11 +02:00
Joe Farebrother
f9e094de61 Simplify choosaASignatureMismatchWitness for improved performance 2025-09-09 17:25:48 +01:00
Joe Farebrother
ea562de3e6 Fix tests 2025-09-09 15:17:16 +01:00
Michael Nebel
1c801bd856 JavaScript: Update integration test expected output. 2025-09-09 15:48:31 +02:00
Michael Nebel
58862f4ace JavaScript: Add some medium precision queries to the code-quality-extended suite. 2025-09-09 15:47:03 +02:00
Joe Farebrother
ec40ea800d Update qldoc 2025-09-09 13:46:52 +01:00
Joe Farebrother
b01b40b51b Update test output 2025-09-09 13:44:03 +01:00
Mathias Vorreiter Pedersen
3aee4a88aa Shared: Cache the sourceBoundedFastTC structure instead of the resulting materialized relation. 2025-09-09 12:22:37 +01:00
Mathias Vorreiter Pedersen
fd7d216fe3 Shared: Replace explicit recursion with a HOP. 2025-09-09 12:22:36 +01:00
Joe Farebrother
e382f7cd43 Improve check for containment in with statement 2025-09-09 11:26:17 +01:00
Simon Friis Vindum
4f9d8271a2 Rust: Add change node for request forgery query 2025-09-09 10:38:01 +02:00
Simon Friis Vindum
387d08a1b3 Rust: Update query suite expected files 2025-09-09 10:37:59 +02:00
Simon Friis Vindum
1c922f0f45 Rust: Add request forgery query qhelp 2025-09-09 10:37:58 +02:00
Simon Friis Vindum
e1047dc40b Rust: Add request forgery query 2025-09-09 10:37:57 +02:00
Simon Friis Vindum
63a2c9da76 Rust: Add request forgery tests 2025-09-09 10:37:56 +02:00
Simon Friis Vindum
eea11dbf5f Rust: Relabel reqwest sinks as request-url 2025-09-08 13:05:58 +02:00
Joe Farebrother
eb246f6f71 Performance experiment - add getFunctionFIle for better join order 2025-09-08 09:43:22 +01:00
Joe Farebrother
ff4c11f503 Update test output. Accepting some FNs due to dataflow issue. 2025-09-06 00:45:15 +01:00
Joe Farebrother
0b293eaba5 Update test output 2025-09-05 22:43:21 +01:00
Joe Farebrother
bd3fa7fb21 Switch to dataflow check for guards exceptions
This reduces some confusing FPs, though appears to introduce another
2025-09-05 16:03:55 +01:00
Taus
f6732a927b Python: Bump extractor version 2025-09-03 11:56:54 +00:00
Taus
13a93c7e32 Python: Add suggestions from Copilot 2025-09-03 11:55:49 +00:00
Joe Farebrother
71dec0b23e Fix typos 2025-09-03 11:22:46 +01:00
Joe Farebrother
9fa630faf5 Add comments documenting helper predicates, and add call resolve condition to callMatchesSignature to avoid cartesian product 2025-09-03 11:00:59 +01:00
Taus
bda522052b Python: Update bazel dependencies 2025-09-02 12:51:36 +00:00
Taus
9802ad77dc Python: Update types_new.py and test output 2025-09-02 12:41:57 +00:00
Taus
235822d782 Python: Improve handling of syntax errors
Rather than relying on matching arbitrary nodes inside tree-sitter-graph
and then checking whether they are of type ERROR or MISSING (which seems
to have stopped working in later versions of tree-sitter), we now
explicitly go through the tree-sitter tree, locating all of the error
and missing nodes along the way. We then add these on to the graph
output in the same format as was previously produced by
tree-sitter-graph.

Note that it's very likely that some of the syntax errors will move
around a bit as a consequence of this change. In general, we don't
expect syntax errors to have stable locations, as small changes in the
grammar can cause an error to appear in a different position, even if
the underlying (erroneous) code has not changed.
2025-09-02 12:41:57 +00:00
Taus
b108d47b26 Python: Update parser test output
It seems that with a newer version of tree-sitter, we no longer parse
the (not actually valid!) syntax `Spam[**P2]` as if the `**` is an
exponentiation operation (with a missing left operand).
2025-09-02 12:41:55 +00:00
Taus
5fb28b9f6d Python: Update bazel dependencies 2025-09-02 12:41:48 +00:00
Taus
76f15a890c Python: Update tree-sitter dependency
Updates the Python extractor to depend on version 0.24.7 of tree-sitter
(and 0.12.0 of tree-sitter-graph).

A few changes were needed in order to make the code build and run after
updating the dependencies:

- In `main.rs`, the `Language` parameter is now passed as a reference.
- In `python.tsg`, many queries had captures that were not actually used
in the body of the stanza. This is no longer allowed (unless the
captures start with an underscore), as it may indicate an error. To fix
this, I added underscores in the appropriate places (and verified that
none of these unused captures were in fact bugs).
2025-09-02 12:40:20 +00:00
Joe Farebrother
318d1cd392 Increase precision in detecting call matches signature 2025-09-02 12:02:08 +01:00
Joe Farebrother
125c6534b7 Use new option name 2025-09-01 23:41:28 +01:00
Joe Farebrother
6587ad435e Update python/ql/src/Functions/SignatureOverriddenMethod.ql
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-09-01 16:31:24 +01:00
Joe Farebrother
0a83c11f42 Add changenote.+ fix typo 2025-09-01 16:31:18 +01:00
Joe Farebrother
900a5cd9d7 Update documentation 2025-09-01 16:31:11 +01:00
Joe Farebrother
502ea82c91 Updae other test output 2025-09-01 16:31:04 +01:00
Joe Farebrother
2bbf24b3ea Add additional test cases 2025-09-01 16:30:53 +01:00
Joe Farebrother
f429b9038c Update tests, update alert messages 2025-09-01 16:30:44 +01:00
Joe Farebrother
067c98d3ee Include conditional alert messages for various cases 2025-09-01 16:30:35 +01:00
Joe Farebrother
4212d1b5b6 Update alert messages and choose one witness 2025-09-01 16:30:26 +01:00
Joe Farebrother
5ba5007076 Modernize signature mismatch 2025-09-01 16:30:17 +01:00
Asger F
57b4534d30 JS: Avoid overriding Expr predicates in xUnit.qll 2025-08-29 13:06:05 +02:00
REDMOND\brodes
74ce7cd188 Crypto: Moving all data flow analyses to taint tracking. 2025-08-28 20:40:05 -04:00
REDMOND\brodes
7c8177de97 Crypto: Added missing ArtifactPassthrough.qll (forgot to add to merged in branch). Acronym casing fix. 2025-08-26 17:12:21 -04:00
Ben Rodes
73b3398b46 Merge pull request #2 from bdrodes/signature_model_refactor_experimental
Signature model refactor experimental
2025-08-26 17:05:01 -04:00
REDMOND\brodes
938b47c2ad Crypto: Debug missing hashes associated with HMAC. EVP_PKEY_get1_RSA is now just a passthrough, it is not a known implicit operation call. Some final operations generating null outputs are now removed from possible final operartions (typically used to determine buffer lenghth and not actually performing the operation). Misc. false positive/error fixes and code clean up, and added missing models. 2025-08-26 16:07:04 -04:00
REDMOND\brodes
422352c632 Crypto: Continued refactoring of operation steps and bug fixes. 2025-08-26 11:49:26 -04:00
REDMOND\brodes
48dc280e6c Crypto: Fix issue with OAEP padding edges regressing. 2025-08-26 08:51:52 -04:00
REDMOND\brodes
5d29240f27 Crypto: OperationStep overhaul to account for errors and missing interproc flow. 2025-08-25 16:59:09 -04:00
Joe Farebrother
eb4841230a Add tests (WIP) 2025-08-25 13:30:45 +01:00
REDMOND\brodes
b7ceeb399f Crypto: nodes.expected update and removed dead code from Language.qll 2025-08-22 14:50:31 -04:00
REDMOND\brodes
ec7e41cb30 Crypto: Fixed issues in CBOM representations (gaps in the underlying model) and simplified unit tests in terms of the graph complexity to aid visual assessments of model correctness. 2025-08-21 15:05:45 -04:00
Joe Farebrother
9edfd7a6fb Use generator script directly 2025-08-21 14:12:26 +01:00
Joe Farebrother
f24f7d5146 Add builtin subclass models, incorporate into query 2025-08-21 13:50:26 +01:00
REDMOND\brodes
30a07763e8 Crypto: Copilot suggested code changes. 2025-08-20 13:28:28 -04:00
REDMOND\brodes
33aa6c94df Crypto: Adding tests for reuse nonce query for JAVA/JCA. 2025-08-20 13:21:18 -04:00
Ben Rodes
65ff72719e Merge branch 'main' into signature_model_refactor 2025-08-20 12:34:06 -04:00
Joe Farebrother
e42002e1d7 Promote IncorrectExceptOrder.
However, we lose some results due to not considering builtin/stdlib types.
2025-08-19 15:30:47 +01:00
Marcono1234
adf01e76cd Doc: Fix link to warnOnImplicitThis GitHub docs 2025-08-07 16:02:36 +02:00
REDMOND\brodes
a98f4c29d3 Crypto: Code scanning warning fix. 2025-07-01 12:26:50 -04:00
REDMOND\brodes
ff93045938 Crypto: remove JCA bad import. 2025-07-01 12:21:51 -04:00
REDMOND\brodes
88d36aa574 Crypto: Intermediate JCA updates to support new MAC model. Work in progress. 2025-07-01 12:19:15 -04:00
REDMOND\brodes
0270fac4e7 Crypto: Update model to have a mac operation instance that extends the signature or mac operation instance. 2025-07-01 11:51:40 -04:00
REDMOND\brodes
d32e09ac37 Crypto: Misc. cleanup and completed model refactor for Mac. Passing tests for openssl, refactor still required for JCA. 2025-07-01 10:37:09 -04:00
REDMOND\brodes
8b64a72fe1 Crypto: Initial sketch for refactoring MAC and signatures to account for APIs having one function to do both. Incomplete. Work in progress. 2025-06-30 15:36:55 -04:00
REDMOND\brodes
e6b363b81b Crypto: fix Ql-for-QL alerts. 2025-06-30 11:08:30 -04:00
REDMOND\brodes
eba120444e Merge branch 'main' into openssl_padding_refactor 2025-06-27 13:54:27 -04:00
REDMOND\brodes
97cd083f65 Merge branch 'operation_step_refactor' into openssl_padding_refactor
# Conflicts:
#	cpp/ql/lib/experimental/quantum/OpenSSL/AlgorithmInstances/AlgToAVCFlow.qll
#	cpp/ql/lib/experimental/quantum/OpenSSL/AlgorithmInstances/PaddingAlgorithmInstance.qll
2025-06-27 09:42:06 -04:00
REDMOND\brodes
6e5734adca Crypto: Fix openssl padding to propery link async padding to hashing configs. 2025-06-26 09:18:30 -04:00
Vasco-jofra
575da5c31c Merge SummarizedCallable into single class 2025-06-26 10:10:52 +02:00
Vasco-jofra
8c4dbca23c Improve data flow in the async library 2025-06-15 17:59:49 +02:00
Vasco-jofra
26f3b40d35 Add lodash GroupBy as taint step 2025-06-14 00:13:03 +02:00
2413 changed files with 148538 additions and 59664 deletions

View File

@@ -1,4 +0,0 @@
When reviewing code:
* do not review changes in files with `.expected` extension (they are automatically ensured to be correct).
* in `.ql` and `.qll` files, do not try to review the code itself as you don't understand the programming language
well enough to make comments in these languages. You can still check for typos or comment improvements.

View File

@@ -0,0 +1,4 @@
---
applyTo: "**/*.expected"
---
Ignore these files. These are generated to be correct by running the tests, and should not be edited manually.

View File

@@ -0,0 +1,6 @@
---
applyTo: "**/*.ql,**/*.qll"
---
When reviewing these QL files, do not make any comment on the code itself. You don't understand the QL programming language well enough yet. You can only make comments about the following aspects:
* comments (lines starting with `//` or block comments enclosed in `/* ... */`): you can suggest improvements to the clarity of comments, or point out spelling mistakes
* typos in identifiers

View File

@@ -32,7 +32,7 @@ jobs:
steps:
- name: Setup dotnet
uses: actions/setup-dotnet@v5
uses: actions/setup-dotnet@v4
with:
dotnet-version: 9.0.300

View File

@@ -41,7 +41,7 @@ jobs:
steps:
- uses: actions/checkout@v5
- name: Setup dotnet
uses: actions/setup-dotnet@v5
uses: actions/setup-dotnet@v4
with:
dotnet-version: 9.0.300
- name: Extractor unit tests

3
.gitignore vendored
View File

@@ -76,3 +76,6 @@ node_modules/
# some upgrade/downgrade checks create these files
**/upgrades/*/*.dbscheme.stats
**/downgrades/*/*.dbscheme.stats
# Mergetool files
*.orig

View File

@@ -1,3 +1,7 @@
# Catch-all for anything which isn't matched by a line lower down
* @github/code-scanning-alert-coverage
# CodeQL language libraries
/actions/ @github/codeql-dynamic
/cpp/ @github/codeql-c-analysis
/csharp/ @github/codeql-csharp
@@ -7,8 +11,10 @@
/java/ @github/codeql-java
/javascript/ @github/codeql-javascript
/python/ @github/codeql-python
/ql/ @github/codeql-ql-for-ql-reviewers
/ruby/ @github/codeql-ruby
/rust/ @github/codeql-rust
/shared/ @github/codeql-shared-libraries-reviewers
/swift/ @github/codeql-swift
/misc/codegen/ @github/codeql-swift
/java/kotlin-extractor/ @github/codeql-kotlin
@@ -25,9 +31,6 @@
/docs/codeql/ql-language-reference/ @github/codeql-frontend-reviewers
/docs/query-*-style-guide.md @github/codeql-analysis-reviewers
# QL for QL reviewers
/ql/ @github/codeql-ql-for-ql-reviewers
# Bazel (excluding BUILD.bazel files)
MODULE.bazel @github/codeql-ci-reviewers
.bazelversion @github/codeql-ci-reviewers

763
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -10,4 +10,3 @@ members = [
"rust/ast-generator",
"rust/autobuild",
]
exclude = ["mad-generation-build"]

View File

@@ -19,8 +19,8 @@ bazel_dep(name = "rules_go", version = "0.56.1")
bazel_dep(name = "rules_pkg", version = "1.0.1")
bazel_dep(name = "rules_nodejs", version = "6.2.0-codeql.1")
bazel_dep(name = "rules_python", version = "0.40.0")
bazel_dep(name = "rules_shell", version = "0.3.0")
bazel_dep(name = "bazel_skylib", version = "1.7.1")
bazel_dep(name = "rules_shell", version = "0.5.0")
bazel_dep(name = "bazel_skylib", version = "1.8.1")
bazel_dep(name = "abseil-cpp", version = "20240116.1", repo_name = "absl")
bazel_dep(name = "nlohmann_json", version = "3.11.3", repo_name = "json")
bazel_dep(name = "fmt", version = "10.0.0")
@@ -28,7 +28,7 @@ bazel_dep(name = "rules_kotlin", version = "2.1.3-codeql.1")
bazel_dep(name = "gazelle", version = "0.40.0")
bazel_dep(name = "rules_dotnet", version = "0.19.2-codeql.1")
bazel_dep(name = "googletest", version = "1.14.0.bcr.1")
bazel_dep(name = "rules_rust", version = "0.63.0")
bazel_dep(name = "rules_rust", version = "0.66.0")
bazel_dep(name = "zstd", version = "1.5.5.bcr.1")
bazel_dep(name = "buildifier_prebuilt", version = "6.4.0", dev_dependency = True)
@@ -89,8 +89,8 @@ use_repo(
"vendor_py__cc-1.2.14",
"vendor_py__clap-4.5.30",
"vendor_py__regex-1.11.1",
"vendor_py__tree-sitter-0.20.4",
"vendor_py__tree-sitter-graph-0.7.0",
"vendor_py__tree-sitter-0.24.7",
"vendor_py__tree-sitter-graph-0.12.0",
)
# deps for ruby+rust
@@ -98,54 +98,54 @@ use_repo(
tree_sitter_extractors_deps = use_extension("//misc/bazel/3rdparty:tree_sitter_extractors_extension.bzl", "r")
use_repo(
tree_sitter_extractors_deps,
"vendor_ts__anyhow-1.0.99",
"vendor_ts__anyhow-1.0.100",
"vendor_ts__argfile-0.2.1",
"vendor_ts__chalk-ir-0.104.0",
"vendor_ts__chrono-0.4.41",
"vendor_ts__clap-4.5.44",
"vendor_ts__chrono-0.4.42",
"vendor_ts__clap-4.5.48",
"vendor_ts__dunce-1.0.5",
"vendor_ts__either-1.15.0",
"vendor_ts__encoding-0.2.33",
"vendor_ts__figment-0.10.19",
"vendor_ts__flate2-1.1.0",
"vendor_ts__flate2-1.1.2",
"vendor_ts__glob-0.3.3",
"vendor_ts__globset-0.4.15",
"vendor_ts__globset-0.4.16",
"vendor_ts__itertools-0.14.0",
"vendor_ts__lazy_static-1.5.0",
"vendor_ts__mustache-0.9.0",
"vendor_ts__num-traits-0.2.19",
"vendor_ts__num_cpus-1.17.0",
"vendor_ts__proc-macro2-1.0.97",
"vendor_ts__quote-1.0.40",
"vendor_ts__ra_ap_base_db-0.0.300",
"vendor_ts__ra_ap_cfg-0.0.300",
"vendor_ts__ra_ap_hir-0.0.300",
"vendor_ts__ra_ap_hir_def-0.0.300",
"vendor_ts__ra_ap_hir_expand-0.0.300",
"vendor_ts__ra_ap_hir_ty-0.0.300",
"vendor_ts__ra_ap_ide_db-0.0.300",
"vendor_ts__ra_ap_intern-0.0.300",
"vendor_ts__ra_ap_load-cargo-0.0.300",
"vendor_ts__ra_ap_parser-0.0.300",
"vendor_ts__ra_ap_paths-0.0.300",
"vendor_ts__ra_ap_project_model-0.0.300",
"vendor_ts__ra_ap_span-0.0.300",
"vendor_ts__ra_ap_stdx-0.0.300",
"vendor_ts__ra_ap_syntax-0.0.300",
"vendor_ts__ra_ap_vfs-0.0.300",
"vendor_ts__proc-macro2-1.0.101",
"vendor_ts__quote-1.0.41",
"vendor_ts__ra_ap_base_db-0.0.301",
"vendor_ts__ra_ap_cfg-0.0.301",
"vendor_ts__ra_ap_hir-0.0.301",
"vendor_ts__ra_ap_hir_def-0.0.301",
"vendor_ts__ra_ap_hir_expand-0.0.301",
"vendor_ts__ra_ap_hir_ty-0.0.301",
"vendor_ts__ra_ap_ide_db-0.0.301",
"vendor_ts__ra_ap_intern-0.0.301",
"vendor_ts__ra_ap_load-cargo-0.0.301",
"vendor_ts__ra_ap_parser-0.0.301",
"vendor_ts__ra_ap_paths-0.0.301",
"vendor_ts__ra_ap_project_model-0.0.301",
"vendor_ts__ra_ap_span-0.0.301",
"vendor_ts__ra_ap_stdx-0.0.301",
"vendor_ts__ra_ap_syntax-0.0.301",
"vendor_ts__ra_ap_vfs-0.0.301",
"vendor_ts__rand-0.9.2",
"vendor_ts__rayon-1.10.0",
"vendor_ts__regex-1.11.1",
"vendor_ts__serde-1.0.219",
"vendor_ts__serde_json-1.0.142",
"vendor_ts__serde_with-3.14.0",
"vendor_ts__syn-2.0.104",
"vendor_ts__toml-0.9.5",
"vendor_ts__rayon-1.11.0",
"vendor_ts__regex-1.11.3",
"vendor_ts__serde-1.0.228",
"vendor_ts__serde_json-1.0.145",
"vendor_ts__serde_with-3.14.1",
"vendor_ts__syn-2.0.106",
"vendor_ts__toml-0.9.7",
"vendor_ts__tracing-0.1.41",
"vendor_ts__tracing-flame-0.2.0",
"vendor_ts__tracing-subscriber-0.3.19",
"vendor_ts__tree-sitter-0.24.6",
"vendor_ts__tree-sitter-embedded-template-0.23.2",
"vendor_ts__tracing-subscriber-0.3.20",
"vendor_ts__tree-sitter-0.25.9",
"vendor_ts__tree-sitter-embedded-template-0.25.0",
"vendor_ts__tree-sitter-json-0.24.8",
"vendor_ts__tree-sitter-ql-0.23.1",
"vendor_ts__tree-sitter-ruby-0.23.1",

View File

@@ -1,3 +1,15 @@
## 0.4.19
No user-facing changes.
## 0.4.18
No user-facing changes.
## 0.4.17
No user-facing changes.
## 0.4.16
No user-facing changes.

View File

@@ -0,0 +1,3 @@
## 0.4.17
No user-facing changes.

View File

@@ -0,0 +1,3 @@
## 0.4.18
No user-facing changes.

View File

@@ -0,0 +1,3 @@
## 0.4.19
No user-facing changes.

View File

@@ -1,2 +1,2 @@
---
lastReleaseVersion: 0.4.16
lastReleaseVersion: 0.4.19

View File

@@ -100,8 +100,6 @@ private module ArgumentInjectionConfig implements DataFlow::ConfigSig {
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSourceLocation(DataFlow::Node source) { none() }
Location getASelectedSinkLocation(DataFlow::Node sink) {
result = sink.getLocation()
or

View File

@@ -333,8 +333,6 @@ private module ArtifactPoisoningConfig implements DataFlow::ConfigSig {
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSourceLocation(DataFlow::Node source) { none() }
Location getASelectedSinkLocation(DataFlow::Node sink) {
result = sink.getLocation()
or

View File

@@ -80,8 +80,6 @@ private module CodeInjectionConfig implements DataFlow::ConfigSig {
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSourceLocation(DataFlow::Node source) { none() }
Location getASelectedSinkLocation(DataFlow::Node sink) {
result = sink.getLocation()
or

View File

@@ -130,8 +130,6 @@ private module EnvPathInjectionConfig implements DataFlow::ConfigSig {
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSourceLocation(DataFlow::Node source) { none() }
Location getASelectedSinkLocation(DataFlow::Node sink) {
result = sink.getLocation()
or

View File

@@ -184,8 +184,6 @@ private module EnvVarInjectionConfig implements DataFlow::ConfigSig {
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSourceLocation(DataFlow::Node source) { none() }
Location getASelectedSinkLocation(DataFlow::Node sink) {
result = sink.getLocation()
or

View File

@@ -212,8 +212,6 @@ private module OutputClobberingConfig implements DataFlow::ConfigSig {
}
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSourceLocation(DataFlow::Node sink) { none() }
}
/** Tracks flow of unsafe user input that is used to construct and evaluate an environment variable. */

View File

@@ -18,8 +18,6 @@ private module RequestForgeryConfig implements DataFlow::ConfigSig {
predicate isSink(DataFlow::Node sink) { sink instanceof RequestForgerySink }
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSourceLocation(DataFlow::Node sink) { none() }
}
/** Tracks flow of unsafe user input that is used to construct and evaluate a system command. */

View File

@@ -17,8 +17,6 @@ private module SecretExfiltrationConfig implements DataFlow::ConfigSig {
predicate isSink(DataFlow::Node sink) { sink instanceof SecretExfiltrationSink }
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSourceLocation(DataFlow::Node sink) { none() }
}
/** Tracks flow of unsafe user input that is used in a context where it may lead to a secret exfiltration. */

View File

@@ -1,5 +1,5 @@
name: codeql/actions-all
version: 0.4.17-dev
version: 0.4.20-dev
library: true
warnOnImplicitThis: true
dependencies:

View File

@@ -1,3 +1,17 @@
## 0.6.11
No user-facing changes.
## 0.6.10
No user-facing changes.
## 0.6.9
### Minor Analysis Improvements
* Actions analysis now reports file coverage information on the CodeQL status page.
## 0.6.8
No user-facing changes.

View File

@@ -26,8 +26,6 @@ private module MyConfig implements DataFlow::ConfigSig {
}
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSourceLocation(DataFlow::Node sink) { none() }
}
module MyFlow = TaintTracking::Global<MyConfig>;

View File

@@ -36,8 +36,6 @@ private module MyConfig implements DataFlow::ConfigSig {
}
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSourceLocation(DataFlow::Node sink) { none() }
}
module MyFlow = TaintTracking::Global<MyConfig>;

View File

@@ -27,8 +27,6 @@ private module MyConfig implements DataFlow::ConfigSig {
}
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSourceLocation(DataFlow::Node sink) { none() }
}
module MyFlow = TaintTracking::Global<MyConfig>;

View File

@@ -26,8 +26,6 @@ private module MyConfig implements DataFlow::ConfigSig {
}
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSourceLocation(DataFlow::Node sink) { none() }
}
module MyFlow = TaintTracking::Global<MyConfig>;

View File

@@ -36,8 +36,6 @@ private module MyConfig implements DataFlow::ConfigSig {
}
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSourceLocation(DataFlow::Node sink) { none() }
}
module MyFlow = TaintTracking::Global<MyConfig>;

View File

@@ -27,8 +27,6 @@ private module MyConfig implements DataFlow::ConfigSig {
}
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSourceLocation(DataFlow::Node sink) { none() }
}
module MyFlow = TaintTracking::Global<MyConfig>;

View File

@@ -0,0 +1,3 @@
## 0.6.10
No user-facing changes.

View File

@@ -0,0 +1,3 @@
## 0.6.11
No user-facing changes.

View File

@@ -1,4 +1,5 @@
---
category: minorAnalysis
---
## 0.6.9
### Minor Analysis Improvements
* Actions analysis now reports file coverage information on the CodeQL status page.

View File

@@ -1,2 +1,2 @@
---
lastReleaseVersion: 0.6.8
lastReleaseVersion: 0.6.11

View File

@@ -19,5 +19,5 @@ import SecretExfiltrationFlow::PathGraph
from SecretExfiltrationFlow::PathNode source, SecretExfiltrationFlow::PathNode sink
where SecretExfiltrationFlow::flowPath(source, sink)
select sink.getNode(), source, sink,
"Potential secret exfiltration in $@, which may be be leaked to an attacker-controlled resource.",
"Potential secret exfiltration in $@, which may be leaked to an attacker-controlled resource.",
sink, sink.getNode().asExpr().(Expression).getRawExpression()

View File

@@ -1,5 +1,5 @@
name: codeql/actions-queries
version: 0.6.9-dev
version: 0.6.12-dev
library: false
warnOnImplicitThis: true
groups: [actions, queries]

View File

@@ -3,4 +3,4 @@ nodes
| .github/workflows/test1.yml:15:11:16:75 | github.event.pull_request.title | semmle.label | github.event.pull_request.title |
subpaths
#select
| .github/workflows/test1.yml:15:11:16:75 | github.event.pull_request.title | .github/workflows/test1.yml:15:11:16:75 | github.event.pull_request.title | .github/workflows/test1.yml:15:11:16:75 | github.event.pull_request.title | Potential secret exfiltration in $@, which may be be leaked to an attacker-controlled resource. | .github/workflows/test1.yml:15:11:16:75 | github.event.pull_request.title | ${{ github.event.pull_request.title }} |
| .github/workflows/test1.yml:15:11:16:75 | github.event.pull_request.title | .github/workflows/test1.yml:15:11:16:75 | github.event.pull_request.title | .github/workflows/test1.yml:15:11:16:75 | github.event.pull_request.title | Potential secret exfiltration in $@, which may be leaked to an attacker-controlled resource. | .github/workflows/test1.yml:15:11:16:75 | github.event.pull_request.title | ${{ github.event.pull_request.title }} |

View File

@@ -177,6 +177,12 @@ def insert_overlay_caller_annotations(lines):
out_lines.append(line)
return out_lines
explicitly_global = set([
"java/ql/lib/semmle/code/java/dispatch/VirtualDispatch.qll",
"java/ql/lib/semmle/code/java/dispatch/DispatchFlow.qll",
"java/ql/lib/semmle/code/java/dispatch/ObjFlow.qll",
"java/ql/lib/semmle/code/java/dispatch/internal/Unification.qll",
])
def annotate_as_appropriate(filename, lines):
'''
@@ -196,6 +202,9 @@ def annotate_as_appropriate(filename, lines):
((filename.endswith("Query.qll") or filename.endswith("Config.qll")) and
any("implements DataFlow::ConfigSig" in line for line in lines))):
return None
elif filename in explicitly_global:
# These files are explicitly global and should not be annotated.
return None
elif not any(line for line in lines if line.strip()):
return None

View File

@@ -9,6 +9,7 @@
"fragments": [
"/*- Compilations -*/",
"/*- External data -*/",
"/*- Overlay support -*/",
"/*- Files and folders -*/",
"/*- Diagnostic messages -*/",
"/*- Diagnostic messages: severity -*/",

View File

@@ -7,12 +7,10 @@ ql/cpp/ql/src/Diagnostics/ExtractedFiles.ql
ql/cpp/ql/src/Diagnostics/ExtractionWarnings.ql
ql/cpp/ql/src/Diagnostics/FailedExtractorInvocations.ql
ql/cpp/ql/src/Likely Bugs/Arithmetic/BadAdditionOverflowCheck.ql
ql/cpp/ql/src/Likely Bugs/Arithmetic/IntMultToLong.ql
ql/cpp/ql/src/Likely Bugs/Arithmetic/SignedOverflowCheck.ql
ql/cpp/ql/src/Likely Bugs/Conversion/CastArrayPointerArithmetic.ql
ql/cpp/ql/src/Likely Bugs/Format/SnprintfOverflow.ql
ql/cpp/ql/src/Likely Bugs/Format/WrongNumberOfFormatArguments.ql
ql/cpp/ql/src/Likely Bugs/Format/WrongTypeFormatArguments.ql
ql/cpp/ql/src/Likely Bugs/Memory Management/AllocaInLoop.ql
ql/cpp/ql/src/Likely Bugs/Memory Management/PointerOverflow.ql
ql/cpp/ql/src/Likely Bugs/Memory Management/ReturnStackAllocatedMemory.ql
@@ -30,7 +28,6 @@ ql/cpp/ql/src/Security/CWE/CWE-120/VeryLikelyOverrunWrite.ql
ql/cpp/ql/src/Security/CWE/CWE-131/NoSpaceForZeroTerminator.ql
ql/cpp/ql/src/Security/CWE/CWE-134/UncontrolledFormatString.ql
ql/cpp/ql/src/Security/CWE/CWE-190/ArithmeticUncontrolled.ql
ql/cpp/ql/src/Security/CWE/CWE-190/ComparisonWithWiderType.ql
ql/cpp/ql/src/Security/CWE/CWE-191/UnsignedDifferenceExpressionComparedZero.ql
ql/cpp/ql/src/Security/CWE/CWE-253/HResultBooleanConversion.ql
ql/cpp/ql/src/Security/CWE/CWE-311/CleartextFileWrite.ql
@@ -43,7 +40,6 @@ ql/cpp/ql/src/Security/CWE/CWE-367/TOCTOUFilesystemRace.ql
ql/cpp/ql/src/Security/CWE/CWE-416/IteratorToExpiredContainer.ql
ql/cpp/ql/src/Security/CWE/CWE-416/UseOfStringAfterLifetimeEnds.ql
ql/cpp/ql/src/Security/CWE/CWE-416/UseOfUniquePointerAfterLifetimeEnds.ql
ql/cpp/ql/src/Security/CWE/CWE-468/SuspiciousAddWithSizeof.ql
ql/cpp/ql/src/Security/CWE/CWE-497/ExposedSystemData.ql
ql/cpp/ql/src/Security/CWE/CWE-611/XXE.ql
ql/cpp/ql/src/Security/CWE/CWE-676/DangerousFunctionOverflow.ql

View File

@@ -1,3 +1,27 @@
## 6.0.0
### Breaking Changes
* The "Guards" libraries (`semmle.code.cpp.controlflow.Guards` and `semmle.code.cpp.controlflow.IRGuards`) have been totally rewritten to recognize many more guards. The API remains unchanged, but the `GuardCondition` class now extends `Element` instead of `Expr`.
### New Features
* C/C++ `build-mode: none` support is now generally available.
## 5.6.1
No user-facing changes.
## 5.6.0
### Deprecated APIs
* The predicate `getAContructorCall` in the class `SslContextClass` has been deprecated. Use `getAConstructorCall` instead.
### New Features
* Added predicates `getTransitiveNumberOfVlaDimensionStmts`, `getTransitiveVlaDimensionStmt`, and `getParentVlaDecl` to `VlaDeclStmt` for handling `VlaDeclStmt`s whose base type is defined in terms of another `VlaDeclStmt` via a `typedef`.
## 5.5.0
### New Features

View File

@@ -1,4 +0,0 @@
---
category: feature
---
* Added predicates `getTransitiveNumberOfVlaDimensionStmts`, `getTransitiveVlaDimensionStmt`, and `getParentVlaDecl` to `VlaDeclStmt` for handling `VlaDeclStmt`s whose base type defined in terms of an other `VlaDeclStmt` via a `typedef`.

View File

@@ -1,4 +0,0 @@
---
category: deprecated
---
* The predicate `getAContructorCall` in the class `SslContextClass` has been deprecated. Use `getAConstructorCall` instead.

View File

@@ -0,0 +1,4 @@
---
category: fix
---
* Improve performance of the range analysis in cases where it would otherwise take an exorbitant amount of time.

View File

@@ -0,0 +1,9 @@
## 5.6.0
### Deprecated APIs
* The predicate `getAContructorCall` in the class `SslContextClass` has been deprecated. Use `getAConstructorCall` instead.
### New Features
* Added predicates `getTransitiveNumberOfVlaDimensionStmts`, `getTransitiveVlaDimensionStmt`, and `getParentVlaDecl` to `VlaDeclStmt` for handling `VlaDeclStmt`s whose base type is defined in terms of another `VlaDeclStmt` via a `typedef`.

View File

@@ -0,0 +1,3 @@
## 5.6.1
No user-facing changes.

View File

@@ -0,0 +1,9 @@
## 6.0.0
### Breaking Changes
* The "Guards" libraries (`semmle.code.cpp.controlflow.Guards` and `semmle.code.cpp.controlflow.IRGuards`) have been totally rewritten to recognize many more guards. The API remains unchanged, but the `GuardCondition` class now extends `Element` instead of `Expr`.
### New Features
* C/C++ `build-mode: none` support is now generally available.

View File

@@ -1,2 +1,2 @@
---
lastReleaseVersion: 5.5.0
lastReleaseVersion: 6.0.0

View File

@@ -14,8 +14,8 @@ module CryptoInput implements InputSig<Language::Location> {
result = node.asExpr() or
result = node.asParameter() or
result = node.asVariable() or
result = node.asDefiningArgument()
// TODO: do we need asIndirectExpr()?
result = node.asDefiningArgument() or
result = node.asIndirectExpr()
}
string locationToFileBaseNameAndLineNumberString(Location location) {
@@ -53,7 +53,7 @@ module ArtifactFlowConfig implements DataFlow::ConfigSig {
}
}
module ArtifactFlow = DataFlow::Global<ArtifactFlowConfig>;
module ArtifactFlow = TaintTracking::Global<ArtifactFlowConfig>;
/**
* An artifact output to node input configuration
@@ -93,7 +93,13 @@ module GenericDataSourceFlow = TaintTracking::Global<GenericDataSourceFlowConfig
private class ConstantDataSource extends Crypto::GenericConstantSourceInstance instanceof OpenSslGenericSourceCandidateLiteral
{
override DataFlow::Node getOutputNode() { result.asExpr() = this }
override DataFlow::Node getOutputNode() {
// OpenSSL algorithms may be referenced either by string name or by numeric ID:
// String names (e.g. "AES-256-CBC") appear in the AST as character pointer
// literals. For these we must use `asIndirectExpr`. Numeric IDs (e.g. NID_aes_256_cbc)
// appear as integer literals. For these, we must use `asExpr` to get the "value" node.
[result.asIndirectExpr(), result.asExpr()] = this
}
override predicate flowsTo(Crypto::FlowAwareElement other) {
// TODO: separate config to avoid blowing up data-flow analysis
@@ -103,28 +109,4 @@ private class ConstantDataSource extends Crypto::GenericConstantSourceInstance i
override string getAdditionalDescription() { result = this.toString() }
}
module ArtifactUniversalFlowConfig implements DataFlow::ConfigSig {
predicate isSource(DataFlow::Node source) {
source = any(Crypto::ArtifactInstance artifact).getOutputNode()
}
predicate isSink(DataFlow::Node sink) {
sink = any(Crypto::FlowAwareElement other).getInputNode()
}
predicate isBarrierOut(DataFlow::Node node) {
node = any(Crypto::FlowAwareElement element).getInputNode()
}
predicate isBarrierIn(DataFlow::Node node) {
node = any(Crypto::FlowAwareElement element).getOutputNode()
}
predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) {
node1.(AdditionalFlowInputStep).getOutput() = node2
}
}
module ArtifactUniversalFlow = DataFlow::Global<ArtifactUniversalFlowConfig>;
import OpenSSL.OpenSSL

View File

@@ -14,9 +14,13 @@ private import PaddingAlgorithmInstance
*/
module KnownOpenSslAlgorithmToAlgorithmValueConsumerConfig implements DataFlow::ConfigSig {
predicate isSource(DataFlow::Node source) {
source.asExpr() instanceof KnownOpenSslAlgorithmExpr and
(
source.asExpr() instanceof KnownOpenSslAlgorithmExpr or
source.asIndirectExpr() instanceof KnownOpenSslAlgorithmExpr
) and
// No need to flow direct operations to AVCs
not source.asExpr() instanceof OpenSslDirectAlgorithmOperationCall
not source.asExpr() instanceof OpenSslDirectAlgorithmOperationCall and
not source.asIndirectExpr() instanceof OpenSslDirectAlgorithmOperationCall
}
predicate isSink(DataFlow::Node sink) {
@@ -46,10 +50,12 @@ module KnownOpenSslAlgorithmToAlgorithmValueConsumerConfig implements DataFlow::
}
module KnownOpenSslAlgorithmToAlgorithmValueConsumerFlow =
DataFlow::Global<KnownOpenSslAlgorithmToAlgorithmValueConsumerConfig>;
TaintTracking::Global<KnownOpenSslAlgorithmToAlgorithmValueConsumerConfig>;
module RsaPaddingAlgorithmToPaddingAlgorithmValueConsumerConfig implements DataFlow::ConfigSig {
predicate isSource(DataFlow::Node source) { source.asExpr() instanceof OpenSslPaddingLiteral }
predicate isSource(DataFlow::Node source) {
source.asExpr() instanceof OpenSslSpecialPaddingLiteral
}
predicate isSink(DataFlow::Node sink) {
exists(PaddingAlgorithmValueConsumer c | c.getInputNode() = sink)
@@ -61,7 +67,7 @@ module RsaPaddingAlgorithmToPaddingAlgorithmValueConsumerConfig implements DataF
}
module RsaPaddingAlgorithmToPaddingAlgorithmValueConsumerFlow =
DataFlow::Global<RsaPaddingAlgorithmToPaddingAlgorithmValueConsumerConfig>;
TaintTracking::Global<RsaPaddingAlgorithmToPaddingAlgorithmValueConsumerConfig>;
class OpenSslAlgorithmAdditionalFlowStep extends AdditionalFlowInputStep {
OpenSslAlgorithmAdditionalFlowStep() { exists(AlgorithmPassthroughCall c | c.getInNode() = this) }

View File

@@ -53,7 +53,8 @@ class KnownOpenSslBlockModeConstantAlgorithmInstance extends OpenSslAlgorithmIns
// Sink is an argument to a CipherGetterCall
sink = getterCall.getInputNode() and
// Source is `this`
src.asExpr() = this and
// NOTE: src literals can be ints or strings, so need to consider asExpr and asIndirectExpr
this = [src.asExpr(), src.asIndirectExpr()] and
// This traces to a getter
KnownOpenSslAlgorithmToAlgorithmValueConsumerFlow::flow(src, sink)
)

View File

@@ -2,12 +2,10 @@ import cpp
private import experimental.quantum.Language
private import KnownAlgorithmConstants
private import Crypto::KeyOpAlg as KeyOpAlg
private import OpenSSLAlgorithmInstanceBase
private import PaddingAlgorithmInstance
private import experimental.quantum.OpenSSL.AlgorithmValueConsumers.OpenSSLAlgorithmValueConsumerBase
private import experimental.quantum.OpenSSL.AlgorithmValueConsumers.DirectAlgorithmValueConsumer
private import experimental.quantum.OpenSSL.Operations.OpenSSLOperationBase
private import experimental.quantum.OpenSSL.AlgorithmValueConsumers.OpenSSLAlgorithmValueConsumers
private import OpenSSLAlgorithmInstances
private import AlgToAVCFlow
private import BlockAlgorithmInstance
/**
* Given a `KnownOpenSslCipherAlgorithmExpr`, converts this to a cipher family type.
@@ -79,7 +77,8 @@ class KnownOpenSslCipherConstantAlgorithmInstance extends OpenSslAlgorithmInstan
// Sink is an argument to a CipherGetterCall
sink = getterCall.getInputNode() and
// Source is `this`
src.asExpr() = this and
// NOTE: src literals can be ints or strings, so need to consider asExpr and asIndirectExpr
this = [src.asExpr(), src.asIndirectExpr()] and
// This traces to a getter
KnownOpenSslAlgorithmToAlgorithmValueConsumerFlow::flow(src, sink)
)
@@ -97,10 +96,13 @@ class KnownOpenSslCipherConstantAlgorithmInstance extends OpenSslAlgorithmInstan
}
override Crypto::PaddingAlgorithmInstance getPaddingAlgorithm() {
//TODO: the padding is either self, or it flows through getter ctx to a set padding call
// like EVP_PKEY_CTX_set_rsa_padding
result = this
// TODO or trace through getter ctx to set padding
or
exists(OperationStep s |
this.getAvc().(AvcContextCreationStep).flowsToOperationStep(s) and
s.getAlgorithmValueConsumerForInput(PaddingAlgorithmIO()) =
result.(OpenSslAlgorithmInstance).getAvc()
)
}
override string getRawAlgorithmName() {
@@ -117,7 +119,7 @@ class KnownOpenSslCipherConstantAlgorithmInstance extends OpenSslAlgorithmInstan
knownOpenSslConstantToCipherFamilyType(this, result)
or
not knownOpenSslConstantToCipherFamilyType(this, _) and
result = Crypto::KeyOpAlg::TUnknownKeyOperationAlgorithmType()
result = Crypto::KeyOpAlg::TOtherKeyOperationAlgorithmType()
}
override OpenSslAlgorithmValueConsumer getAvc() { result = getterCall }

View File

@@ -21,7 +21,8 @@ class KnownOpenSslEllipticCurveConstantAlgorithmInstance extends OpenSslAlgorith
// Sink is an argument to a CipherGetterCall
sink = getterCall.getInputNode() and
// Source is `this`
src.asExpr() = this and
// NOTE: src literals can be ints or strings, so need to consider asExpr and asIndirectExpr
this = [src.asExpr(), src.asIndirectExpr()] and
// This traces to a getter
KnownOpenSslAlgorithmToAlgorithmValueConsumerFlow::flow(src, sink)
)
@@ -39,7 +40,7 @@ class KnownOpenSslEllipticCurveConstantAlgorithmInstance extends OpenSslAlgorith
result = this.(Call).getTarget().getName()
}
override Crypto::EllipticCurveFamilyType getEllipticCurveFamilyType() {
override Crypto::EllipticCurveType getEllipticCurveType() {
if
Crypto::ellipticCurveNameToKnownKeySizeAndFamilyMapping(this.getParsedEllipticCurveName(), _,
_)

View File

@@ -59,7 +59,8 @@ class KnownOpenSslHashConstantAlgorithmInstance extends OpenSslAlgorithmInstance
// Sink is an argument to a CipherGetterCall
sink = getterCall.getInputNode() and
// Source is `this`
src.asExpr() = this and
// NOTE: src literals can be ints or strings, so need to consider asExpr and asIndirectExpr
this = [src.asExpr(), src.asIndirectExpr()] and
// This traces to a getter
KnownOpenSslAlgorithmToAlgorithmValueConsumerFlow::flow(src, sink)
)
@@ -71,7 +72,7 @@ class KnownOpenSslHashConstantAlgorithmInstance extends OpenSslAlgorithmInstance
override OpenSslAlgorithmValueConsumer getAvc() { result = getterCall }
override Crypto::THashType getHashFamily() {
override Crypto::THashType getHashType() {
knownOpenSslConstantToHashFamilyType(this, result)
or
not knownOpenSslConstantToHashFamilyType(this, _) and result = Crypto::OtherHashType()

View File

@@ -37,7 +37,8 @@ class KnownOpenSslKeyAgreementConstantAlgorithmInstance extends OpenSslAlgorithm
// Sink is an argument to a CipherGetterCall
sink = getterCall.getInputNode() and
// Source is `this`
src.asExpr() = this and
// NOTE: src literals can be ints or strings, so need to consider asExpr and asIndirectExpr
this = [src.asExpr(), src.asIndirectExpr()] and
// This traces to a getter
KnownOpenSslAlgorithmToAlgorithmValueConsumerFlow::flow(src, sink)
)

View File

@@ -171,9 +171,15 @@ class KnownOpenSslKeyAgreementAlgorithmExpr extends Expr instanceof KnownOpenSsl
}
predicate knownOpenSslAlgorithmOperationCall(Call c, string normalized, string algType) {
c.getTarget().getName() in ["EVP_RSA_gen", "RSA_generate_key_ex", "RSA_generate_key", "RSA_new"] and
c.getTarget().getName() in [
"EVP_RSA_gen", "RSA_generate_key_ex", "RSA_generate_key", "RSA_new", "RSA_sign", "RSA_verify"
] and
normalized = "RSA" and
algType = "ASYMMETRIC_ENCRYPTION"
or
c.getTarget().getName() in ["DSA_do_sign", "DSA_do_verify"] and
normalized = "DSA" and
algType = "SIGNATURE"
}
/**

View File

@@ -2,12 +2,13 @@ import cpp
private import experimental.quantum.Language
private import KnownAlgorithmConstants
private import experimental.quantum.OpenSSL.AlgorithmValueConsumers.OpenSSLAlgorithmValueConsumers
private import experimental.quantum.OpenSSL.AlgorithmInstances.OpenSSLAlgorithmInstanceBase
private import experimental.quantum.OpenSSL.AlgorithmInstances.OpenSSLAlgorithmInstances
private import experimental.quantum.OpenSSL.Operations.OpenSSLOperations
private import Crypto::KeyOpAlg as KeyOpAlg
private import AlgToAVCFlow
class KnownOpenSslMacConstantAlgorithmInstance extends OpenSslAlgorithmInstance,
Crypto::MacAlgorithmInstance instanceof KnownOpenSslMacAlgorithmExpr
Crypto::KeyOperationAlgorithmInstance instanceof KnownOpenSslMacAlgorithmExpr
{
OpenSslAlgorithmValueConsumer getterCall;
@@ -21,7 +22,8 @@ class KnownOpenSslMacConstantAlgorithmInstance extends OpenSslAlgorithmInstance,
// Sink is an argument to a CipherGetterCall
sink = getterCall.getInputNode() and
// Source is `this`
src.asExpr() = this and
// NOTE: src literals can be ints or strings, so need to consider asExpr and asIndirectExpr
this = [src.asExpr(), src.asIndirectExpr()] and
// This traces to a getter
KnownOpenSslAlgorithmToAlgorithmValueConsumerFlow::flow(src, sink)
)
@@ -33,17 +35,34 @@ class KnownOpenSslMacConstantAlgorithmInstance extends OpenSslAlgorithmInstance,
override OpenSslAlgorithmValueConsumer getAvc() { result = getterCall }
override string getRawMacAlgorithmName() {
override string getRawAlgorithmName() {
result = this.(Literal).getValue().toString()
or
result = this.(Call).getTarget().getName()
}
override Crypto::MacType getMacType() {
this instanceof KnownOpenSslHMacAlgorithmExpr and result = Crypto::HMAC()
or
this instanceof KnownOpenSslCMacAlgorithmExpr and result = Crypto::CMAC()
override Crypto::KeyOpAlg::AlgorithmType getAlgorithmType() {
if this instanceof KnownOpenSslHMacAlgorithmExpr
then result = KeyOpAlg::TMac(KeyOpAlg::HMAC())
else
if this instanceof KnownOpenSslCMacAlgorithmExpr
then result = KeyOpAlg::TMac(KeyOpAlg::CMAC())
else result = KeyOpAlg::TMac(KeyOpAlg::OtherMacAlgorithmType())
}
override Crypto::ConsumerInputDataFlowNode getKeySizeConsumer() {
// TODO: trace to any key size initializer?
none()
}
override int getKeySizeFixed() {
// TODO: are there known fixed key sizes to consider?
none()
}
override Crypto::ModeOfOperationAlgorithmInstance getModeOfOperationAlgorithm() { none() }
override Crypto::PaddingAlgorithmInstance getPaddingAlgorithm() { none() }
}
class KnownOpenSslHMacConstantAlgorithmInstance extends Crypto::HmacAlgorithmInstance,
@@ -60,9 +79,13 @@ class KnownOpenSslHMacConstantAlgorithmInstance extends Crypto::HmacAlgorithmIns
// where the current AVC traces to a HashAlgorithmIO consuming operation step.
// TODO: need to consider getting reset values, tracing down to the first set for now
exists(OperationStep s, AvcContextCreationStep avc |
avc = this.getAvc() and
avc = super.getAvc() and
avc.flowsToOperationStep(s) and
s.getAlgorithmValueConsumerForInput(HashAlgorithmIO()) = result
)
}
override Crypto::ModeOfOperationAlgorithmInstance getModeOfOperationAlgorithm() { none() }
override Crypto::PaddingAlgorithmInstance getPaddingAlgorithm() { none() }
}

View File

@@ -1,10 +1,10 @@
import cpp
private import experimental.quantum.Language
private import OpenSSLAlgorithmInstanceBase
private import experimental.quantum.OpenSSL.Operations.OpenSSLOperationBase
private import experimental.quantum.OpenSSL.AlgorithmInstances.KnownAlgorithmConstants
private import AlgToAVCFlow
private import experimental.quantum.OpenSSL.AlgorithmValueConsumers.DirectAlgorithmValueConsumer
private import experimental.quantum.OpenSSL.AlgorithmValueConsumers.OpenSSLAlgorithmValueConsumerBase
private import experimental.quantum.OpenSSL.AlgorithmValueConsumers.OpenSSLAlgorithmValueConsumers
private import codeql.quantum.experimental.Standardization::Types::KeyOpAlg as KeyOpAlg
/**
@@ -18,13 +18,14 @@ private import codeql.quantum.experimental.Standardization::Types::KeyOpAlg as K
* # define RSA_PKCS1_WITH_TLS_PADDING 7
* # define RSA_PKCS1_NO_IMPLICIT_REJECT_PADDING 8
*/
class OpenSslPaddingLiteral extends Literal {
class OpenSslSpecialPaddingLiteral extends Literal {
// TODO: we can be more specific about where the literal is in a larger expression
// to avoid literals that are clealy not representing an algorithm, e.g., array indices.
OpenSslPaddingLiteral() { this.getValue().toInt() in [0, 1, 3, 4, 5, 6, 7, 8] }
OpenSslSpecialPaddingLiteral() { this.getValue().toInt() in [0, 1, 3, 4, 5, 6, 7, 8] }
}
/**
* Holds if `e` has the given `type`.
* Given a `KnownOpenSslPaddingAlgorithmExpr`, converts this to a padding family type.
* Does not bind if there is no mapping (no mapping to 'unknown' or 'other').
*/
@@ -45,9 +46,6 @@ predicate knownOpenSslConstantToPaddingFamilyType(
)
}
//abstract class OpenSslPaddingAlgorithmInstance extends OpenSslAlgorithmInstance, Crypto::PaddingAlgorithmInstance{}
// TODO: need to alter this to include known padding constants which don't have the
// same mechanics as those with known nids
class KnownOpenSslPaddingConstantAlgorithmInstance extends OpenSslAlgorithmInstance,
Crypto::PaddingAlgorithmInstance instanceof Expr
{
@@ -66,7 +64,8 @@ class KnownOpenSslPaddingConstantAlgorithmInstance extends OpenSslAlgorithmInsta
// Sink is an argument to a CipherGetterCall
sink = getterCall.getInputNode() and
// Source is `this`
src.asExpr() = this and
// NOTE: src literals can be ints or strings, so need to consider asExpr and asIndirectExpr
this = [src.asExpr(), src.asIndirectExpr()] and
// This traces to a getter
KnownOpenSslAlgorithmToAlgorithmValueConsumerFlow::flow(src, sink) and
isPaddingSpecificConsumer = false
@@ -79,12 +78,13 @@ class KnownOpenSslPaddingConstantAlgorithmInstance extends OpenSslAlgorithmInsta
isPaddingSpecificConsumer = false
or
// Possibility 3: padding-specific literal
this instanceof OpenSslPaddingLiteral and
this instanceof OpenSslSpecialPaddingLiteral and
exists(DataFlow::Node src, DataFlow::Node sink |
// Sink is an argument to a CipherGetterCall
sink = getterCall.getInputNode() and
// Source is `this`
src.asExpr() = this and
// NOTE: src literals can be ints or strings, so need to consider asExpr and asIndirectExpr
this = [src.asExpr(), src.asIndirectExpr()] and
// This traces to a padding-specific consumer
RsaPaddingAlgorithmToPaddingAlgorithmValueConsumerFlow::flow(src, sink)
) and
@@ -124,44 +124,6 @@ class KnownOpenSslPaddingConstantAlgorithmInstance extends OpenSslAlgorithmInsta
}
}
// // Values used for EVP_PKEY_CTX_set_rsa_padding, these are
// // not the same as 'typical' constants found in the set of known algorithm constants
// // they do not have an NID
// // TODO: what about setting the padding directly?
// class KnownRSAPaddingConstant extends OpenSslPaddingAlgorithmInstance, Crypto::PaddingAlgorithmInstance instanceof Literal
// {
// KnownRSAPaddingConstant() {
// // from rsa.h in openssl:
// // # define RSA_PKCS1_PADDING 1
// // # define RSA_NO_PADDING 3
// // # define RSA_PKCS1_OAEP_PADDING 4
// // # define RSA_X931_PADDING 5
// // /* EVP_PKEY_ only */
// // # define RSA_PKCS1_PSS_PADDING 6
// // # define RSA_PKCS1_WITH_TLS_PADDING 7
// // /* internal RSA_ only */
// // # define RSA_PKCS1_NO_IMPLICIT_REJECT_PADDING 8
// this instanceof Literal and
// this.getValue().toInt() in [0, 1, 3, 4, 5, 6, 7, 8]
// // TODO: trace to padding-specific consumers
// RsaPaddingAlgorithmToPaddingAlgorithmValueConsumerFlow
// }
// override string getRawPaddingAlgorithmName() { result = this.(Literal).getValue().toString() }
// override Crypto::TPaddingType getPaddingType() {
// if this.(Literal).getValue().toInt() in [1, 6, 7, 8]
// then result = Crypto::PKCS1_v1_5()
// else
// if this.(Literal).getValue().toInt() = 3
// then result = Crypto::NoPadding()
// else
// if this.(Literal).getValue().toInt() = 4
// then result = Crypto::OAEP()
// else
// if this.(Literal).getValue().toInt() = 5
// then result = Crypto::ANSI_X9_23()
// else result = Crypto::OtherPadding()
// }
// }
class OaepPaddingAlgorithmInstance extends Crypto::OaepPaddingAlgorithmInstance,
KnownOpenSslPaddingConstantAlgorithmInstance
{
@@ -170,10 +132,18 @@ class OaepPaddingAlgorithmInstance extends Crypto::OaepPaddingAlgorithmInstance,
}
override Crypto::HashAlgorithmInstance getOaepEncodingHashAlgorithm() {
none() //TODO
exists(OperationStep s |
this.getAvc().(AvcContextCreationStep).flowsToOperationStep(s) and
s.getAlgorithmValueConsumerForInput(HashAlgorithmOaepIO()) =
result.(OpenSslAlgorithmInstance).getAvc()
)
}
override Crypto::HashAlgorithmInstance getMgf1HashAlgorithm() {
none() //TODO
exists(OperationStep s |
this.getAvc().(AvcContextCreationStep).flowsToOperationStep(s) and
s.getAlgorithmValueConsumerForInput(HashAlgorithmMgf1IO()) =
result.(OpenSslAlgorithmInstance).getAvc()
)
}
}

View File

@@ -47,7 +47,8 @@ class KnownOpenSslSignatureConstantAlgorithmInstance extends OpenSslAlgorithmIns
// Sink is an argument to a signature getter call
sink = getterCall.getInputNode() and
// Source is `this`
src.asExpr() = this and
// NOTE: src literals can be ints or strings, so need to consider asExpr and asIndirectExpr
this = [src.asExpr(), src.asIndirectExpr()] and
// This traces to a getter
KnownOpenSslAlgorithmToAlgorithmValueConsumerFlow::flow(src, sink)
)

View File

@@ -12,15 +12,17 @@ class EvpCipherAlgorithmValueConsumer extends CipherAlgorithmValueConsumer {
DataFlow::Node resultNode;
EvpCipherAlgorithmValueConsumer() {
resultNode.asExpr() = this and
resultNode.asIndirectExpr() = this and
(
this.(Call).getTarget().getName() in [
"EVP_get_cipherbyname", "EVP_get_cipherbyobj", "EVP_get_cipherbynid"
] and
this.(Call).getTarget().getName() in ["EVP_get_cipherbyname", "EVP_get_cipherbyobj"] and
valueArgNode.asIndirectExpr() = this.(Call).getArgument(0)
or
this.(Call).getTarget().getName() = "EVP_get_cipherbynid" and
// algorithm is an NID (int), use asExpr()
valueArgNode.asExpr() = this.(Call).getArgument(0)
or
this.(Call).getTarget().getName() in ["EVP_CIPHER_fetch", "EVP_ASYM_CIPHER_fetch"] and
valueArgNode.asExpr() = this.(Call).getArgument(1)
valueArgNode.asIndirectExpr() = this.(Call).getArgument(1)
)
}

View File

@@ -23,7 +23,7 @@ class DirectAlgorithmValueConsumer extends OpenSslAlgorithmValueConsumer instanc
*/
override DataFlow::Node getResultNode() {
this instanceof OpenSslDirectAlgorithmFetchCall and
result.asExpr() = this
result.asIndirectExpr() = this
// NOTE: if instanceof OpenSslDirectAlgorithmOperationCall then there is no algorithm generated
// the algorithm is directly used
}

View File

@@ -12,14 +12,19 @@ class EvpEllipticCurveAlgorithmConsumer extends EllipticCurveValueConsumer {
DataFlow::Node resultNode;
EvpEllipticCurveAlgorithmConsumer() {
resultNode.asExpr() = this.(Call) and // in all cases the result is the return
resultNode.asIndirectExpr() = this.(Call) and // in all cases the result is the return
(
this.(Call).getTarget().getName() in ["EVP_EC_gen", "EC_KEY_new_by_curve_name"] and
this.(Call).getTarget().getName() = "EVP_EC_gen" and
valueArgNode.asIndirectExpr() = this.(Call).getArgument(0)
or
this.(Call).getTarget().getName() = "EC_KEY_new_by_curve_name" and
// algorithm is an NID (int), use asExpr()
valueArgNode.asExpr() = this.(Call).getArgument(0)
or
this.(Call).getTarget().getName() in [
"EC_KEY_new_by_curve_name_ex", "EVP_PKEY_CTX_set_ec_paramgen_curve_nid"
] and
// algorithm is an NID (int), use asExpr
valueArgNode.asExpr() = this.(Call).getArgument(2)
)
}

View File

@@ -9,11 +9,11 @@ abstract class HashAlgorithmValueConsumer extends OpenSslAlgorithmValueConsumer
/**
* An EVP_Q_Digest directly consumes algorithm constant values
*/
class Evp_Q_Digest_Algorithm_Consumer extends HashAlgorithmValueConsumer {
Evp_Q_Digest_Algorithm_Consumer() { this.(Call).getTarget().getName() = "EVP_Q_digest" }
class Evp_Q_Digest_Algorithm_Consumer extends HashAlgorithmValueConsumer instanceof Call {
Evp_Q_Digest_Algorithm_Consumer() { super.getTarget().getName() = "EVP_Q_digest" }
override Crypto::ConsumerInputDataFlowNode getInputNode() {
result.asExpr() = this.(Call).getArgument(1)
result.asIndirectExpr() = super.getArgument(1)
}
override Crypto::AlgorithmInstance getAKnownAlgorithmSource() {
@@ -42,7 +42,7 @@ class EvpPkeySetCtxALgorithmConsumer extends HashAlgorithmValueConsumer {
"EVP_PKEY_CTX_set_rsa_mgf1_md_name", "EVP_PKEY_CTX_set_rsa_oaep_md_name",
"EVP_PKEY_CTX_set_dsa_paramgen_md_props"
] and
valueArgNode.asExpr() = this.(Call).getArgument(1)
valueArgNode.asIndirectExpr() = this.(Call).getArgument(1)
}
override DataFlow::Node getResultNode() { none() }
@@ -64,18 +64,18 @@ class EvpDigestAlgorithmValueConsumer extends HashAlgorithmValueConsumer {
DataFlow::Node resultNode;
EvpDigestAlgorithmValueConsumer() {
resultNode.asExpr() = this and
resultNode.asIndirectExpr() = this and
(
this.(Call).getTarget().getName() in [
"EVP_get_digestbyname", "EVP_get_digestbynid", "EVP_get_digestbyobj"
] and
valueArgNode.asExpr() = this.(Call).getArgument(0)
valueArgNode.asIndirectExpr() = this.(Call).getArgument(0)
or
this.(Call).getTarget().getName() = "EVP_MD_fetch" and
valueArgNode.asExpr() = this.(Call).getArgument(1)
valueArgNode.asIndirectExpr() = this.(Call).getArgument(1)
or
this.(Call).getTarget().getName() = "EVP_DigestSignInit_ex" and
valueArgNode.asExpr() = this.(Call).getArgument(2)
valueArgNode.asIndirectExpr() = this.(Call).getArgument(2)
)
}
@@ -87,3 +87,21 @@ class EvpDigestAlgorithmValueConsumer extends HashAlgorithmValueConsumer {
exists(OpenSslAlgorithmInstance i | i.getAvc() = this and result = i)
}
}
class RsaSignOrVerifyHashAlgorithmValueConsumer extends HashAlgorithmValueConsumer {
DataFlow::Node valueArgNode;
RsaSignOrVerifyHashAlgorithmValueConsumer() {
this.(Call).getTarget().getName() in ["RSA_sign", "RSA_verify"] and
// arg 0 is an int, use asExpr
valueArgNode.asExpr() = this.(Call).getArgument(0)
}
override DataFlow::Node getResultNode() { none() }
override Crypto::ConsumerInputDataFlowNode getInputNode() { result = valueArgNode }
override Crypto::AlgorithmInstance getAKnownAlgorithmSource() {
exists(OpenSslAlgorithmInstance i | i.getAvc() = this and result = i)
}
}

View File

@@ -11,10 +11,10 @@ class EvpKemAlgorithmValueConsumer extends KemAlgorithmValueConsumer {
DataFlow::Node resultNode;
EvpKemAlgorithmValueConsumer() {
resultNode.asExpr() = this and
resultNode.asIndirectExpr() = this and
(
this.(Call).getTarget().getName() = "EVP_KEM_fetch" and
valueArgNode.asExpr() = this.(Call).getArgument(1)
valueArgNode.asIndirectExpr() = this.(Call).getArgument(1)
)
}

View File

@@ -11,10 +11,10 @@ class EvpKeyExchangeAlgorithmValueConsumer extends KeyExchangeAlgorithmValueCons
DataFlow::Node resultNode;
EvpKeyExchangeAlgorithmValueConsumer() {
resultNode.asExpr() = this and
resultNode.asIndirectExpr() = this and
(
this.(Call).getTarget().getName() = "EVP_KEYEXCH_fetch" and
valueArgNode.asExpr() = this.(Call).getArgument(1)
valueArgNode.asIndirectExpr() = this.(Call).getArgument(1)
)
}

View File

@@ -11,7 +11,7 @@ class EvpPKeyAlgorithmConsumer extends PKeyValueConsumer {
DataFlow::Node resultNode;
EvpPKeyAlgorithmConsumer() {
resultNode.asExpr() = this.(Call) and // in all cases the result is the return
resultNode.asIndirectExpr() = this.(Call) and // in all cases the result is the return
(
// NOTE: some of these consumers are themselves key gen operations,
// in these cases, the operation will be created separately for the same function.
@@ -19,6 +19,7 @@ class EvpPKeyAlgorithmConsumer extends PKeyValueConsumer {
"EVP_PKEY_CTX_new_id", "EVP_PKEY_new_raw_private_key", "EVP_PKEY_new_raw_public_key",
"EVP_PKEY_new_mac_key"
] and
// Algorithm is an int, use asExpr
valueArgNode.asExpr() = this.(Call).getArgument(0)
or
this.(Call).getTarget().getName() in [
@@ -26,7 +27,8 @@ class EvpPKeyAlgorithmConsumer extends PKeyValueConsumer {
"EVP_PKEY_new_raw_public_key_ex", "EVP_PKEY_CTX_ctrl", "EVP_PKEY_CTX_ctrl_uint64",
"EVP_PKEY_CTX_ctrl_str", "EVP_PKEY_CTX_set_group_name"
] and
valueArgNode.asExpr() = this.(Call).getArgument(1)
// AAlgorithm is a char*, use asIndirectExpr
valueArgNode.asIndirectExpr() = this.(Call).getArgument(1)
or
// argInd 2 is 'type' which can be RSA, or EC
// if RSA argInd 3 is the key size, else if EC argInd 3 is the curve name
@@ -38,10 +40,10 @@ class EvpPKeyAlgorithmConsumer extends PKeyValueConsumer {
// Elliptic curve case
// If the argInd 3 is a derived type (pointer or array) then assume it is a curve name
if this.(Call).getArgument(3).getType().getUnderlyingType() instanceof DerivedType
then valueArgNode.asExpr() = this.(Call).getArgument(3)
then valueArgNode.asIndirectExpr() = this.(Call).getArgument(3)
else
// All other cases
valueArgNode.asExpr() = this.(Call).getArgument(2)
valueArgNode.asIndirectExpr() = this.(Call).getArgument(2)
)
)
}

View File

@@ -14,8 +14,9 @@ class Evp_PKey_Ctx_set_rsa_padding_AlgorithmValueConsumer extends PaddingAlgorit
DataFlow::Node resultNode;
Evp_PKey_Ctx_set_rsa_padding_AlgorithmValueConsumer() {
resultNode.asExpr() = this and
resultNode.asDefiningArgument() = this.(Call).getArgument(0) and
this.(Call).getTarget().getName() = "EVP_PKEY_CTX_set_rsa_padding" and
// algorithm is an int, use asExpr
valueArgNode.asExpr() = this.(Call).getArgument(1)
}

View File

@@ -12,13 +12,13 @@ class EvpSignatureAlgorithmValueConsumer extends SignatureAlgorithmValueConsumer
DataFlow::Node resultNode;
EvpSignatureAlgorithmValueConsumer() {
resultNode.asExpr() = this and
resultNode.asIndirectExpr() = this and
(
// EVP_SIGNATURE
this.(Call).getTarget().getName() = "EVP_SIGNATURE_fetch" and
valueArgNode.asExpr() = this.(Call).getArgument(1)
valueArgNode.asIndirectExpr() = this.(Call).getArgument(1)
// EVP_PKEY_get1_DSA, EVP_PKEY_get1_RSA
// DSA_SIG_new, DSA_SIG_get0, RSA_sign ?
// DSA_SIG_new, DSA_SIG_get0 ?
)
}

View File

@@ -0,0 +1,107 @@
private import experimental.quantum.Language
/**
* A call to `BN_bn2bin`.
* Commonly used to extract partial bytes from a signature,
* e.g., a signature from DSA_do_sign, passed to DSA_do_verify
* - int BN_bn2bin(const BIGNUM *a, unsigned char *to);
*/
class BnBn2BinCalStep extends AdditionalFlowInputStep {
Call call;
BnBn2BinCalStep() {
call.getTarget().getName() = "BN_bn2bin" and
call.getArgument(0) = this.asIndirectExpr()
}
override DataFlow::Node getOutput() { result.asDefiningArgument() = call.getArgument(1) }
}
/**
* A call to `BN_bin2bn`.
* Commonly used to convert to a signature for DSA_do_verify
* - BIGNUM *BN_bin2bn(const unsigned char *s, int len, BIGNUM *ret);
*/
class BnBin2BnCallStep extends AdditionalFlowInputStep {
Call call;
BnBin2BnCallStep() {
call.getTarget().getName() = "BN_bin2bn" and
call.getArgument(0) = this.asIndirectExpr()
}
override DataFlow::Node getOutput() { result.asDefiningArgument() = call.getArgument(2) }
}
/**
* A call to `RSA_set0_key` or `DSA_SIG_set0`.
* Often used in combination with BN_bin2bn, to construct a signature.
*/
class RsaSet0KeyCallStep extends AdditionalFlowInputStep {
Call call;
RsaSet0KeyCallStep() {
(call.getTarget().getName() = "RSA_set0_key" or call.getTarget().getName() = "DSA_SIG_set0") and
this.asIndirectExpr() in [call.getArgument(1), call.getArgument(2), call.getArgument(3)]
}
override DataFlow::Node getOutput() { result.asDefiningArgument() = call.getArgument(0) }
}
/**
* A call to `d2i_DSA_SIG`. This is a pass through of a signature of one form to another.
* - DSA_SIG *d2i_DSA_SIG(DSA_SIG **sig, const unsigned char **pp, long length);
*/
class D2iDsaSigCallStep extends AdditionalFlowInputStep {
Call call;
D2iDsaSigCallStep() {
call.getTarget().getName() = "d2i_DSA_SIG" and
this.asIndirectExpr() = call.getArgument(1)
}
override DataFlow::Node getOutput() {
// If arg 0 specified, the same pointer is returned, if not specified
// a new allocation is returned.
result.asDefiningArgument() = call.getArgument(0) or
result.asIndirectExpr() = call
}
}
/**
* A call to `DSA_SIG_get0`.
* Converts a DSA_Sig into its components, which are commonly used with BN_bn2Bin to
* construct a char* signature.
* - void DSA_SIG_get0(const DSA_SIG *sig, const BIGNUM **pr, const BIGNUM **ps);
*/
class DsaSigGet0CallStep extends AdditionalFlowInputStep {
Call call;
DsaSigGet0CallStep() {
call.getTarget().getName() = "DSA_SIG_get0" and
this.asIndirectExpr() = call.getArgument(0)
}
override DataFlow::Node getOutput() {
result.asDefiningArgument() = call.getArgument(1)
or
result.asDefiningArgument() = call.getArgument(2)
}
}
/**
* A call to `EVP_PKEY_get1_RSA` or `EVP_PKEY_get1_DSA`
* - RSA *EVP_PKEY_get1_RSA(EVP_PKEY *pkey);
* - DSA *EVP_PKEY_get1_DSA(EVP_PKEY *pkey);
* A key input is converted into a key output, a key is not generated.
*/
class EvpPkeyGet1RsaOrDsa extends AdditionalFlowInputStep {
Call c;
EvpPkeyGet1RsaOrDsa() {
c.getTarget().getName() = ["EVP_PKEY_get1_RSA", "EVP_PKEY_get1_DSA"] and
this.asIndirectExpr() = c.getArgument(0)
}
override DataFlow::Node getOutput() { result.asIndirectExpr() = c }
}

View File

@@ -1,4 +1,4 @@
import semmle.code.cpp.dataflow.new.DataFlow
import semmle.code.cpp.dataflow.new.TaintTracking
private import experimental.quantum.OpenSSL.AlgorithmValueConsumers.OpenSSLAlgorithmValueConsumers
/**
@@ -13,7 +13,9 @@ module AvcToCallArgConfig implements DataFlow::ConfigSig {
* Trace to any call accepting the algorithm.
* NOTE: users must restrict this set to the operations they are interested in.
*/
predicate isSink(DataFlow::Node sink) { exists(Call c | c.getAnArgument() = sink.asExpr()) }
predicate isSink(DataFlow::Node sink) {
exists(Call c | c.getAnArgument() = [sink.asIndirectExpr(), sink.asExpr()])
}
}
module AvcToCallArgFlow = DataFlow::Global<AvcToCallArgConfig>;
module AvcToCallArgFlow = TaintTracking::Global<AvcToCallArgConfig>;

View File

@@ -4,4 +4,5 @@ module OpenSslModel {
import Operations.OpenSSLOperations
import Random
import GenericSourceCandidateLiteral
import ArtifactPassthrough
}

View File

@@ -3,24 +3,48 @@ private import OpenSSLOperationBase
private import experimental.quantum.OpenSSL.AlgorithmValueConsumers.OpenSSLAlgorithmValueConsumers
import EVPPKeyCtxInitializer
/**
* A base class for all final cipher operation steps.
*/
abstract class FinalCipherOperationStep extends OperationStep {
override OperationStepType getStepType() { result = FinalStep() }
}
/**
* A base configuration for all EVP cipher operations.
*/
abstract class EvpCipherOperationFinalStep extends FinalCipherOperationStep {
override DataFlow::Node getInput(IOType type) {
result.asIndirectExpr() = this.getArgument(0) and type = ContextIO()
}
override DataFlow::Node getOutput(IOType type) {
result.asDefiningArgument() = this.getArgument(0) and type = ContextIO()
}
}
/**
* A base class for all EVP cipher operations.
*/
abstract class EvpCipherInitializer extends OperationStep {
override DataFlow::Node getInput(IOType type) {
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asIndirectExpr() = this.getArgument(0) and type = ContextIO()
or
result.asExpr() = this.getArgument(1) and
result.asIndirectExpr() = this.getArgument(1) and
type = PrimaryAlgorithmIO() and
// Constants that are not equal to zero or
// non-constants (e.g., variable accesses, which require data-flow to determine the value)
// A zero (null) value typically indicates use of this operation step to initialize
// other out parameters in a multi-step initialization.
(exists(result.asExpr().getValue()) implies result.asExpr().getValue().toInt() != 0)
(
exists(result.asIndirectExpr().getValue())
implies
result.asIndirectExpr().getValue().toInt() != 0
)
}
override DataFlow::Node getOutput(IOType type) {
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asDefiningArgument() = this.getArgument(0) and type = ContextIO()
}
override OperationStepType getStepType() { result = InitializerStep() }
@@ -38,11 +62,15 @@ abstract class EvpEXInitializer extends EvpCipherInitializer {
// non-constants (e.g., variable accesses, which require data-flow to determine the value)
// A zero (null) value typically indicates use of this operation step to initialize
// other out parameters in a multi-step initialization.
result.asExpr() = this.getArgument(3) and type = KeyIO()
result.asIndirectExpr() = this.getArgument(3) and type = KeyIO()
or
result.asExpr() = this.getArgument(4) and type = IVorNonceIO()
result.asIndirectExpr() = this.getArgument(4) and type = IVorNonceIO()
) and
(exists(result.asExpr().getValue()) implies result.asExpr().getValue().toInt() != 0)
(
exists(result.asIndirectExpr().getValue())
implies
result.asIndirectExpr().getValue().toInt() != 0
)
}
}
@@ -53,9 +81,9 @@ abstract class EvpEX2Initializer extends EvpCipherInitializer {
override DataFlow::Node getInput(IOType type) {
result = super.getInput(type)
or
result.asExpr() = this.getArgument(2) and type = KeyIO()
result.asIndirectExpr() = this.getArgument(2) and type = KeyIO()
or
result.asExpr() = this.getArgument(3) and type = IVorNonceIO()
result.asIndirectExpr() = this.getArgument(3) and type = IVorNonceIO()
}
}
@@ -90,6 +118,7 @@ class Evp_Cipher_EX2_or_Simple_Init_Call extends EvpEX2Initializer {
result = super.getInput(type)
or
this.getTarget().getName().toLowerCase().matches("%cipherinit%") and
// the key op subtype is an int, use asExpr
result.asExpr() = this.getArgument(4) and
type = KeyOperationSubtypeIO()
}
@@ -107,13 +136,13 @@ class EvpPkeyEncryptDecryptInit extends OperationStep {
}
override DataFlow::Node getInput(IOType type) {
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asIndirectExpr() = this.getArgument(0) and type = ContextIO()
or
result.asExpr() = this.getArgument(1) and type = OsslParamIO()
result.asIndirectExpr() = this.getArgument(1) and type = OsslParamIO()
}
override DataFlow::Node getOutput(IOType type) {
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asDefiningArgument() = this.getArgument(0) and type = ContextIO()
}
override OperationStepType getStepType() { result = InitializerStep() }
@@ -125,6 +154,7 @@ class EvpCipherInitSKeyCall extends EvpEX2Initializer {
override DataFlow::Node getInput(IOType type) {
result = super.getInput(type)
or
// the key op subtype is an int, use asExpr
result.asExpr() = this.getArgument(5) and
type = KeyOperationSubtypeIO()
}
@@ -141,35 +171,20 @@ class EvpCipherUpdateCall extends OperationStep {
}
override DataFlow::Node getInput(IOType type) {
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asIndirectExpr() = this.getArgument(0) and type = ContextIO()
or
result.asExpr() = this.getArgument(3) and type = PlaintextIO()
result.asIndirectExpr() = this.getArgument(3) and type = PlaintextIO()
}
override DataFlow::Node getOutput(IOType type) {
result.asExpr() = this.getArgument(1) and type = CiphertextIO()
result.asDefiningArgument() = this.getArgument(1) and type = CiphertextIO()
or
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asDefiningArgument() = this.getArgument(0) and type = ContextIO()
}
override OperationStepType getStepType() { result = UpdateStep() }
}
/**
* A base configuration for all EVP cipher operations.
*/
abstract class EvpCipherOperationFinalStep extends OperationStep {
override DataFlow::Node getInput(IOType type) {
result.asExpr() = this.getArgument(0) and type = ContextIO()
}
override DataFlow::Node getOutput(IOType type) {
result.asExpr() = this.getArgument(0) and type = ContextIO()
}
override OperationStepType getStepType() { result = FinalStep() }
}
/**
* A Call to EVP_Cipher.
*/
@@ -179,13 +194,13 @@ class EvpCipherCall extends EvpCipherOperationFinalStep {
override DataFlow::Node getInput(IOType type) {
super.getInput(type) = result
or
result.asExpr() = this.getArgument(2) and type = PlaintextIO()
result.asIndirectExpr() = this.getArgument(2) and type = PlaintextIO()
}
override DataFlow::Node getOutput(IOType type) {
super.getOutput(type) = result
or
result.asExpr() = this.getArgument(1) and type = CiphertextIO()
result.asDefiningArgument() = this.getArgument(1) and type = CiphertextIO()
}
}
@@ -216,28 +231,50 @@ class EvpCipherFinalCall extends EvpCipherOperationFinalStep {
*/
class EvpPKeyCipherOperation extends EvpCipherOperationFinalStep {
EvpPKeyCipherOperation() {
this.getTarget().getName() in ["EVP_PKEY_encrypt", "EVP_PKEY_decrypt"]
this.getTarget().getName() in ["EVP_PKEY_encrypt", "EVP_PKEY_decrypt"] and
// TODO: for now ignore this operation entirely if it is setting the cipher text to null
// this needs to be re-evalauted if this scenario sets other values worth tracking
(
exists(this.(Call).getArgument(1).getValue())
implies
this.(Call).getArgument(1).getValue().toInt() != 0
)
}
override DataFlow::Node getInput(IOType type) {
super.getInput(type) = result
or
result.asExpr() = this.getArgument(3) and type = PlaintextIO()
result.asIndirectExpr() = this.getArgument(3) and type = PlaintextIO()
}
override DataFlow::Node getOutput(IOType type) {
super.getOutput(type) = result
or
result.asExpr() = this.getArgument(1) and type = CiphertextIO()
result.asDefiningArgument() = this.getArgument(1) and
type = CiphertextIO() and
this.getStepType() = FinalStep()
// TODO: could indicate text lengths here, as well
}
override OperationStepType getStepType() {
// When the output buffer is null, the step is not a final step
// it is used to get the buffer size, if 0 consider it an initialization step
// NOTE/TODO: not tracing 0 to the arg, just looking for 0 directly in param
// the assumption is this is the common case, but we may want to make this more
// robust and support a dataflow.
result = FinalStep() and
(exists(super.getArgument(1).getValue()) implies super.getArgument(1).getValue().toInt() != 0)
or
result = InitializerStep() and
super.getArgument(1).getValue().toInt() = 0
}
}
/**
* An EVP cipher operation instance.
* Any operation step that is a final operation step for EVP cipher operation steps.
*/
class EvpCipherOperationInstance extends Crypto::KeyOperationInstance instanceof EvpCipherOperationFinalStep
class OpenSslCipherOperationInstance extends Crypto::KeyOperationInstance instanceof FinalCipherOperationStep
{
override Crypto::AlgorithmValueConsumer getAnAlgorithmValueConsumer() {
super.getPrimaryAlgorithmValueConsumer() = result

View File

@@ -1,5 +1,10 @@
/**
* Initializers for EVP PKey
* These are used to create a Pkey context or set properties on a Pkey context
* e.g., key size, hash algorithms, curves, padding schemes, etc.
* Meant to capture more general purpose initializers that aren't necessarily
* tied to a specific operation. If tied to an operation (i.e., in the docs)
* we recommend defining defining all together in the same operation definition qll.
* including:
* https://docs.openssl.org/3.0/man3/EVP_PKEY_CTX_ctrl/
* https://docs.openssl.org/3.0/man3/EVP_EncryptInit/#synopsis
@@ -26,14 +31,16 @@ class EvpNewKeyCtx extends OperationStep instanceof Call {
}
override DataFlow::Node getInput(IOType type) {
result.asExpr() = keyArg and type = KeyIO()
result.asIndirectExpr() = keyArg and type = KeyIO()
or
this.getTarget().getName() = "EVP_PKEY_CTX_new_from_pkey" and
result.asExpr() = this.getArgument(0) and
result.asIndirectExpr() = this.getArgument(0) and
type = OsslLibContextIO()
}
override DataFlow::Node getOutput(IOType type) { result.asExpr() = this and type = ContextIO() }
override DataFlow::Node getOutput(IOType type) {
result.asIndirectExpr() = this and type = ContextIO()
}
override OperationStepType getStepType() { result = ContextCreationStep() }
}
@@ -47,13 +54,13 @@ class EvpCtxSetEcParamgenCurveNidInitializer extends OperationStep {
}
override DataFlow::Node getInput(IOType type) {
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asIndirectExpr() = this.getArgument(0) and type = ContextIO()
or
result.asExpr() = this.getArgument(1) and type = PrimaryAlgorithmIO()
result.asIndirectExpr() = this.getArgument(1) and type = PrimaryAlgorithmIO()
}
override DataFlow::Node getOutput(IOType type) {
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asDefiningArgument() = this.getArgument(0) and type = ContextIO()
}
override OperationStepType getStepType() { result = InitializerStep() }
@@ -71,23 +78,46 @@ class EvpCtxSetEcParamgenCurveNidInitializer extends OperationStep {
* - `EVP_PKEY_CTX_set_ecdh_kdf_md`
*/
class EvpCtxSetHashInitializer extends OperationStep {
boolean isOaep;
boolean isMgf1;
EvpCtxSetHashInitializer() {
this.getTarget().getName() in [
"EVP_PKEY_CTX_set_signature_md", "EVP_PKEY_CTX_set_rsa_mgf1_md_name",
"EVP_PKEY_CTX_set_rsa_mgf1_md", "EVP_PKEY_CTX_set_rsa_oaep_md_name",
"EVP_PKEY_CTX_set_rsa_oaep_md", "EVP_PKEY_CTX_set_dsa_paramgen_md",
"EVP_PKEY_CTX_set_signature_md", "EVP_PKEY_CTX_set_dsa_paramgen_md",
"EVP_PKEY_CTX_set_dh_kdf_md", "EVP_PKEY_CTX_set_ecdh_kdf_md"
]
] and
isOaep = false and
isMgf1 = false
or
this.getTarget().getName() in [
"EVP_PKEY_CTX_set_rsa_mgf1_md_name", "EVP_PKEY_CTX_set_rsa_mgf1_md"
] and
isOaep = false and
isMgf1 = true
or
this.getTarget().getName() in [
"EVP_PKEY_CTX_set_rsa_oaep_md_name",
"EVP_PKEY_CTX_set_rsa_oaep_md"
] and
isOaep = true and
isMgf1 = false
}
override DataFlow::Node getInput(IOType type) {
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asIndirectExpr() = this.getArgument(0) and type = ContextIO()
or
result.asExpr() = this.getArgument(1) and type = HashAlgorithmIO()
result.asIndirectExpr() = this.getArgument(1) and
type = HashAlgorithmIO() and
isOaep = false and
isMgf1 = false
or
result.asIndirectExpr() = this.getArgument(1) and type = HashAlgorithmOaepIO() and isOaep = true
or
result.asIndirectExpr() = this.getArgument(1) and type = HashAlgorithmMgf1IO() and isMgf1 = true
}
override DataFlow::Node getOutput(IOType type) {
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asDefiningArgument() = this.getArgument(0) and type = ContextIO()
}
override OperationStepType getStepType() { result = InitializerStep() }
@@ -106,13 +136,13 @@ class EvpCtxSetKeySizeInitializer extends OperationStep {
}
override DataFlow::Node getInput(IOType type) {
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asIndirectExpr() = this.getArgument(0) and type = ContextIO()
or
result.asExpr() = this.getArgument(1) and type = KeySizeIO()
}
override DataFlow::Node getOutput(IOType type) {
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asDefiningArgument() = this.getArgument(0) and type = ContextIO()
}
override OperationStepType getStepType() { result = InitializerStep() }
@@ -122,16 +152,16 @@ class EvpCtxSetMacKeyInitializer extends OperationStep {
EvpCtxSetMacKeyInitializer() { this.getTarget().getName() = "EVP_PKEY_CTX_set_mac_key" }
override DataFlow::Node getInput(IOType type) {
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asIndirectExpr() = this.getArgument(0) and type = ContextIO()
or
result.asExpr() = this.getArgument(2) and type = KeySizeIO()
or
// the raw key that is configured into the output key
result.asExpr() = this.getArgument(1) and type = KeyIO()
result.asIndirectExpr() = this.getArgument(1) and type = KeyIO()
}
override DataFlow::Node getOutput(IOType type) {
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asDefiningArgument() = this.getArgument(0) and type = ContextIO()
}
override OperationStepType getStepType() { result = InitializerStep() }
@@ -143,13 +173,14 @@ class EvpCtxSetPaddingInitializer extends OperationStep {
}
override DataFlow::Node getInput(IOType type) {
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asIndirectExpr() = this.getArgument(0) and type = ContextIO()
or
// The algorithm is an int: use asExpr
result.asExpr() = this.getArgument(1) and type = PaddingAlgorithmIO()
}
override DataFlow::Node getOutput(IOType type) {
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asDefiningArgument() = this.getArgument(0) and type = ContextIO()
}
override OperationStepType getStepType() { result = InitializerStep() }
@@ -161,13 +192,13 @@ class EvpCtxSetSaltLengthInitializer extends OperationStep {
}
override DataFlow::Node getInput(IOType type) {
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asIndirectExpr() = this.getArgument(0) and type = ContextIO()
or
result.asExpr() = this.getArgument(1) and type = SaltLengthIO()
}
override DataFlow::Node getOutput(IOType type) {
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asDefiningArgument() = this.getArgument(0) and type = ContextIO()
}
override OperationStepType getStepType() { result = InitializerStep() }

View File

@@ -6,6 +6,13 @@ private import experimental.quantum.Language
private import OpenSSLOperationBase
private import experimental.quantum.OpenSSL.AlgorithmValueConsumers.OpenSSLAlgorithmValueConsumers
/**
* A base class for final digest operations.
*/
abstract class FinalDigestOperation extends OperationStep {
override OperationStepType getStepType() { result = FinalStep() }
}
/**
* A call to and EVP digest initializer, such as:
* - `EVP_DigestInit`
@@ -18,13 +25,13 @@ class EvpDigestInitVariantCalls extends OperationStep instanceof Call {
}
override DataFlow::Node getInput(IOType type) {
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asIndirectExpr() = this.getArgument(0) and type = ContextIO()
or
result.asExpr() = this.getArgument(1) and type = PrimaryAlgorithmIO()
result.asIndirectExpr() = this.getArgument(1) and type = PrimaryAlgorithmIO()
}
override DataFlow::Node getOutput(IOType type) {
result.asExpr() = this.getArgument(0) and
result.asDefiningArgument() = this.getArgument(0) and
type = ContextIO()
}
@@ -38,56 +45,49 @@ class EvpDigestUpdateCall extends OperationStep instanceof Call {
EvpDigestUpdateCall() { this.getTarget().getName() = "EVP_DigestUpdate" }
override DataFlow::Node getInput(IOType type) {
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asIndirectExpr() = this.getArgument(0) and type = ContextIO()
or
result.asExpr() = this.getArgument(1) and type = PlaintextIO()
result.asIndirectExpr() = this.getArgument(1) and type = PlaintextIO()
}
override DataFlow::Node getOutput(IOType type) {
result.asExpr() = this.getArgument(0) and
result.asDefiningArgument() = this.getArgument(0) and
type = ContextIO()
}
override OperationStepType getStepType() { result = UpdateStep() }
}
/**
* A base class for final digest operations.
*/
abstract class EvpFinalDigestOperationStep extends OperationStep {
override OperationStepType getStepType() { result = FinalStep() }
}
/**
* A call to `EVP_Q_digest`
* https://docs.openssl.org/3.0/man3/EVP_DigestInit/#synopsis
*/
class EvpQDigestOperation extends EvpFinalDigestOperationStep instanceof Call {
class EvpQDigestOperation extends FinalDigestOperation instanceof Call {
EvpQDigestOperation() { this.getTarget().getName() = "EVP_Q_digest" }
override DataFlow::Node getInput(IOType type) {
result.asExpr() = this.getArgument(1) and type = PrimaryAlgorithmIO()
result.asIndirectExpr() = this.getArgument(1) and type = PrimaryAlgorithmIO()
or
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asIndirectExpr() = this.getArgument(0) and type = ContextIO()
or
result.asExpr() = this.getArgument(3) and type = PlaintextIO()
result.asIndirectExpr() = this.getArgument(3) and type = PlaintextIO()
}
override DataFlow::Node getOutput(IOType type) {
result.asExpr() = this.getArgument(0) and
result.asDefiningArgument() = this.getArgument(0) and
type = ContextIO()
or
result.asDefiningArgument() = this.getArgument(5) and type = DigestIO()
}
}
class EvpDigestOperation extends EvpFinalDigestOperationStep instanceof Call {
class EvpDigestOperation extends FinalDigestOperation instanceof Call {
EvpDigestOperation() { this.getTarget().getName() = "EVP_Digest" }
override DataFlow::Node getInput(IOType type) {
result.asExpr() = this.getArgument(4) and type = PrimaryAlgorithmIO()
result.asIndirectExpr() = this.getArgument(4) and type = PrimaryAlgorithmIO()
or
result.asExpr() = this.getArgument(0) and type = PlaintextIO()
result.asIndirectExpr() = this.getArgument(0) and type = PlaintextIO()
}
override DataFlow::Node getOutput(IOType type) {
@@ -98,27 +98,28 @@ class EvpDigestOperation extends EvpFinalDigestOperationStep instanceof Call {
/**
* A call to EVP_DigestFinal variants
*/
class EvpDigestFinalCall extends EvpFinalDigestOperationStep instanceof Call {
class EvpDigestFinalCall extends FinalDigestOperation instanceof Call {
EvpDigestFinalCall() {
this.getTarget().getName() in ["EVP_DigestFinal", "EVP_DigestFinal_ex", "EVP_DigestFinalXOF"]
}
override DataFlow::Node getInput(IOType type) {
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asIndirectExpr() = this.getArgument(0) and type = ContextIO()
}
override DataFlow::Node getOutput(IOType type) {
result.asExpr() = this.getArgument(0) and
result.asDefiningArgument() = this.getArgument(0) and
type = ContextIO()
or
result.asDefiningArgument() = this.getArgument(1) and type = DigestIO()
//result.(DataFlow::PostUpdateNode).getPreUpdateNode().asExpr() = this.getArgument(1)
}
}
/**
* An openssl digest final hash operation instance
*/
class EvpDigestFinalOperationInstance extends Crypto::HashOperationInstance instanceof EvpFinalDigestOperationStep
class OpenSslDigestFinalOperationInstance extends Crypto::HashOperationInstance instanceof FinalDigestOperation
{
override Crypto::AlgorithmValueConsumer getAnAlgorithmValueConsumer() {
super.getPrimaryAlgorithmValueConsumer() = result

View File

@@ -13,10 +13,12 @@ class ECKeyGen extends OperationStep instanceof Call {
ECKeyGen() { this.(Call).getTarget().getName() = "EC_KEY_generate_key" }
override DataFlow::Node getInput(IOType type) {
result.asExpr() = this.(Call).getArgument(0) and type = ContextIO()
result.asIndirectExpr() = this.(Call).getArgument(0) and type = ContextIO()
}
override DataFlow::Node getOutput(IOType type) { result.asExpr() = this and type = KeyIO() }
override DataFlow::Node getOutput(IOType type) {
result.asDefiningArgument() = this and type = KeyIO()
}
override OperationStepType getStepType() { result = ContextCreationStep() }
}
@@ -33,16 +35,19 @@ class EvpKeyGenInitialize extends OperationStep {
}
override DataFlow::Node getInput(IOType type) {
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asIndirectExpr() = this.getArgument(0) and type = ContextIO()
}
override DataFlow::Node getOutput(IOType type) {
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asDefiningArgument() = this.getArgument(0) and type = ContextIO()
}
override OperationStepType getStepType() { result = InitializerStep() }
}
/**
* A base class for final key generation operation steps.
*/
abstract class KeyGenFinalOperationStep extends OperationStep {
override OperationStepType getStepType() { result = FinalStep() }
}
@@ -54,26 +59,26 @@ class EvpPKeyQKeyGen extends KeyGenFinalOperationStep instanceof Call {
EvpPKeyQKeyGen() { this.getTarget().getName() = "EVP_PKEY_Q_keygen" }
override DataFlow::Node getOutput(IOType type) {
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asDefiningArgument() = this.getArgument(0) and type = ContextIO()
or
result.asExpr() = this and type = KeyIO()
result.asDefiningArgument() = this and type = KeyIO()
}
override DataFlow::Node getInput(IOType type) {
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asIndirectExpr() = this.getArgument(0) and type = ContextIO()
or
// When arg 3 is a derived type, it is a curve name, otherwise it is a key size for RSA if provided
// and arg 2 is the algorithm type
this.getArgument(3).getType().getUnderlyingType() instanceof DerivedType and
result.asExpr() = this.getArgument(3) and
result.asIndirectExpr() = this.getArgument(3) and
type = PrimaryAlgorithmIO()
or
not this.getArgument(3).getType().getUnderlyingType() instanceof DerivedType and
result.asExpr() = this.getArgument(2) and
result.asIndirectExpr() = this.getArgument(2) and
type = PrimaryAlgorithmIO()
or
not this.getArgument(3).getType().getUnderlyingType() instanceof DerivedType and
result.asExpr() = this.getArgument(3) and
result.asIndirectExpr() = this.getArgument(3) and
type = KeySizeIO()
}
}
@@ -84,7 +89,9 @@ class EvpPKeyQKeyGen extends KeyGenFinalOperationStep instanceof Call {
class EvpRsaGen extends KeyGenFinalOperationStep instanceof Call {
EvpRsaGen() { this.getTarget().getName() = "EVP_RSA_gen" }
override DataFlow::Node getOutput(IOType type) { result.asExpr() = this and type = KeyIO() }
override DataFlow::Node getOutput(IOType type) {
result.asDefiningArgument() = this and type = KeyIO()
}
override DataFlow::Node getInput(IOType type) {
result.asExpr() = this.getArgument(0) and type = KeySizeIO()
@@ -97,7 +104,9 @@ class EvpRsaGen extends KeyGenFinalOperationStep instanceof Call {
class RsaGenerateKey extends KeyGenFinalOperationStep instanceof Call {
RsaGenerateKey() { this.getTarget().getName() = "RSA_generate_key" }
override DataFlow::Node getOutput(IOType type) { result.asExpr() = this and type = KeyIO() }
override DataFlow::Node getOutput(IOType type) {
result.asDefiningArgument() = this and type = KeyIO()
}
override DataFlow::Node getInput(IOType type) {
result.asExpr() = this.getArgument(0) and type = KeySizeIO()
@@ -117,7 +126,7 @@ class RsaGenerateKeyEx extends KeyGenFinalOperationStep instanceof Call {
override DataFlow::Node getInput(IOType type) {
// arg 0 comes in as a blank RSA key, which we consider a context,
// on output it is considered a key
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asIndirectExpr() = this.getArgument(0) and type = ContextIO()
}
}
@@ -128,13 +137,13 @@ class EvpPkeyGen extends KeyGenFinalOperationStep instanceof Call {
EvpPkeyGen() { this.getTarget().getName() in ["EVP_PKEY_generate", "EVP_PKEY_keygen"] }
override DataFlow::Node getInput(IOType type) {
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asIndirectExpr() = this.getArgument(0) and type = ContextIO()
}
override DataFlow::Node getOutput(IOType type) {
result.asDefiningArgument() = this.getArgument(1) and type = KeyIO()
or
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asDefiningArgument() = this.getArgument(0) and type = ContextIO()
}
}
@@ -146,18 +155,14 @@ class EvpNewMacKey extends KeyGenFinalOperationStep {
EvpNewMacKey() { this.getTarget().getName() = "EVP_PKEY_new_mac_key" }
override DataFlow::Node getInput(IOType type) {
result.asExpr() = this.getArgument(0) and type = ContextIO()
or
// the raw key that is configured into the output key
result.asExpr() = this.getArgument(2) and type = KeyIO()
result.asIndirectExpr() = this.getArgument(2) and type = KeyIO()
or
result.asExpr() = this.getArgument(3) and type = KeySizeIO()
}
override DataFlow::Node getOutput(IOType type) {
result.asExpr() = this and type = KeyIO()
or
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asIndirectExpr() = this and type = KeyIO()
}
}
@@ -165,7 +170,7 @@ class EvpNewMacKey extends KeyGenFinalOperationStep {
/**
* An `KeyGenerationOperationInstance` for the for all key gen final operation steps.
*/
class KeyGenOperationInstance extends Crypto::KeyGenerationOperationInstance instanceof KeyGenFinalOperationStep
class OpenSslKeyGenOperationInstance extends Crypto::KeyGenerationOperationInstance instanceof KeyGenFinalOperationStep
{
override Crypto::AlgorithmValueConsumer getAnAlgorithmValueConsumer() {
super.getPrimaryAlgorithmValueConsumer() = result

View File

@@ -1,6 +1,6 @@
private import experimental.quantum.Language
private import experimental.quantum.OpenSSL.AlgorithmValueConsumers.OpenSSLAlgorithmValueConsumers
import semmle.code.cpp.dataflow.new.DataFlow
import semmle.code.cpp.dataflow.new.TaintTracking
// Importing these intializers here to ensure the are part of any model that is
// using OpenSslOperationBase. This further ensures that initializers are tied to opeartions
// even if only importing the operation by itself.
@@ -58,7 +58,11 @@ newtype TIOType =
// For OSSL_PARAM and OSSL_LIB_CTX use of OsslParamIO and OsslLibContextIO
ContextIO() or
DigestIO() or
// For OAEP and MGF1 hashes, there is a special IO type for these hashes
// it is recommended to set the most explicit type known, not both
HashAlgorithmIO() or
HashAlgorithmOaepIO() or
HashAlgorithmMgf1IO() or
IVorNonceIO() or
KeyIO() or
KeyOperationSubtypeIO() or
@@ -71,11 +75,13 @@ newtype TIOType =
PaddingAlgorithmIO() or
// Plaintext also includes a message for digest, signature, verification, and mac generation
PlaintextIO() or
PlaintextSizeIO() or
PrimaryAlgorithmIO() or
RandomSourceIO() or
SaltLengthIO() or
SeedIO() or
SignatureIO()
SignatureIO() or
SignatureSizeIO()
private string ioTypeToString(TIOType t) {
t = CiphertextIO() and result = "CiphertextIO"
@@ -104,6 +110,8 @@ private string ioTypeToString(TIOType t) {
or
t = PlaintextIO() and result = "PlaintextIO"
or
t = PlaintextSizeIO() and result = "PlaintextSizeIO"
or
t = PrimaryAlgorithmIO() and result = "PrimaryAlgorithmIO"
or
t = RandomSourceIO() and result = "RandomSourceIO"
@@ -113,6 +121,8 @@ private string ioTypeToString(TIOType t) {
t = SeedIO() and result = "SeedIO"
or
t = SignatureIO() and result = "SignatureIO"
or
t = SignatureSizeIO() and result = "SignatureSizeIO"
}
class IOType extends TIOType {
@@ -123,13 +133,13 @@ class IOType extends TIOType {
}
}
//TODO: add more initializers as needed
/**
* The type of step in an `OperationStep`.
* - `ContextCreationStep`: the creation of a context from an algorithm or key.
* for example `EVP_MD_CTX_create(EVP_sha256())` or `EVP_PKEY_CTX_new(pkey, NULL)`
* - `InitializerStep`: the initialization of an operation through some sort of shared/accumulated context
* for example `EVP_DigestInit_ex(ctx, EVP_sha256(), NULL)`
* - `InitializerStep`: the initialization of an operation or state through some sort of shared/accumulated context
* for example `EVP_DigestInit_ex(ctx, EVP_sha256(), NULL)`, may also be used for pass through
* configuration, for example `EVP_PKEY_get1_RSA(key)` where a pkey is input into an RSA key return.
* - `UpdateStep`: any operation that has and update/final paradigm, the update represents an intermediate step in an operation,
* such as `EVP_DigestUpdate(ctx, data, len)`
* - `FinalStep`: an ultimate operation step. This may be an explicit 'final' in an update/final paradigm, but not necessarily.
@@ -189,7 +199,7 @@ abstract class OperationStep extends Call {
*/
predicate flowsToOperationStep(OperationStep sink) {
sink = this or
OperationStepFlow::flow(this.getAnOutput(), sink.getAnInput())
OperationStepCtxFlow::flow(this.getAnOutput(), [sink.getAnInput(), sink.getAnOutput()])
}
/**
@@ -198,7 +208,7 @@ abstract class OperationStep extends Call {
*/
predicate flowsFromOperationStep(OperationStep source) {
source = this or
OperationStepFlow::flow(source.getAnOutput(), this.getAnInput())
OperationStepCtxFlow::flow(source.getAnOutput(), [this.getAnInput(), this.getAnOutput()])
}
/**
@@ -220,10 +230,13 @@ abstract class OperationStep extends Call {
result.setsValue(type) and
(
// Do not consider a 'reset' to occur on updates
// but only for resets that are part of the same update/finalize
// progression (e.g., an update for an unrelated finalize is ignored)
result.getStepType() = UpdateStep()
or
not exists(OperationStep reset |
result != reset and
result != this and
reset.setsValue(type) and
reset.flowsToOperationStep(this) and
result.flowsToOperationStep(reset)
@@ -245,8 +258,11 @@ abstract class OperationStep extends Call {
/**
* Gets an AVC for the primary algorithm for this operation.
* A primary algorithm is an AVC that flows to a ctx input directly or
* an AVC that flows to a primary algorithm input directly.
* A primary algorithm is an AVC that either:
* 0) `this` is an AVC (consider direct algorithm consumers like RSA_sign (algorithm is implicit) or EVP_PKEY_new_mac_key (NID is first arg) )
* 1) flows to a ctx input directly or
* 2) flows to a primary algorithm input directly or
* 3) flows to a key input directly (algorithm held in a key will be considered primary)
* See `AvcContextCreationStep` for details about resetting scenarios.
* Gets the first OperationStep an AVC flows to. If a context input,
* the AVC is considered primary.
@@ -254,19 +270,24 @@ abstract class OperationStep extends Call {
* operation step (dominating operation step, see `getDominatingInitializersToStep`).
*/
Crypto::AlgorithmValueConsumer getPrimaryAlgorithmValueConsumer() {
exists(DataFlow::Node src, DataFlow::Node sink, IOType t, OperationStep avcSucc |
(t = PrimaryAlgorithmIO() or t = ContextIO()) and
avcSucc.flowsToOperationStep(this) and
src.asExpr() = result and
sink = avcSucc.getInput(t) and
this instanceof Crypto::AlgorithmValueConsumer and result = this
or
exists(
DataFlow::Node src, DataFlow::Node sink, IOType srcIntype, OperationStep avcConsumingPred
|
(srcIntype = ContextIO() or srcIntype = PrimaryAlgorithmIO() or srcIntype = KeyIO()) and
avcConsumingPred.flowsToOperationStep(this) and
src.asIndirectExpr() = result and
sink = avcConsumingPred.getInput(srcIntype) and
AvcToOperationStepFlow::flow(src, sink) and
(
// Case 1: the avcSucc step is a dominating initialization step
t = PrimaryAlgorithmIO() and
avcSucc = this.getDominatingInitializersToStep(PrimaryAlgorithmIO())
// Case 1: the avcConsumingPred step is a dominating primary algorithm initialization step
// or dominating key initialization step
(srcIntype = PrimaryAlgorithmIO() or srcIntype = KeyIO()) and
avcConsumingPred = this.getDominatingInitializersToStep(srcIntype)
or
// Case 2: the succ is a context input (any avcSucc is valid)
t = ContextIO()
// Case 2: the pred is a context input
srcIntype = ContextIO()
)
)
}
@@ -277,9 +298,11 @@ abstract class OperationStep extends Call {
* TODO: generalize to use this for `getPrimaryAlgorithmValueConsumer`
*/
Crypto::AlgorithmValueConsumer getAlgorithmValueConsumerForInput(IOType type) {
result = this and this.setsValue(type)
or
exists(DataFlow::Node src, DataFlow::Node sink |
AvcToOperationStepFlow::flow(src, sink) and
src.asExpr() = result and
src.asIndirectExpr() = result and
sink = this.getInput(type)
)
}
@@ -357,7 +380,7 @@ private class CtxCopyOutArgCall extends CtxPassThroughCall {
CtxCopyOutArgCall() {
this.getTarget().getName().toLowerCase().matches("%copy%") and
n1.asExpr() = this.getAnArgument() and
n1.asIndirectExpr() = this.getAnArgument() and
n1.getType() instanceof CtxType and
n2.asDefiningArgument() = this.getAnArgument() and
n2.getType() instanceof CtxType and
@@ -378,16 +401,18 @@ private class CtxCopyReturnCall extends CtxPassThroughCall, CtxPointerExpr {
CtxCopyReturnCall() {
this.getTarget().getName().toLowerCase().matches("%dup%") and
n1.asExpr() = this.getAnArgument() and
n1.asIndirectExpr() = this.getAnArgument() and
n1.getType() instanceof CtxType
}
override DataFlow::Node getNode1() { result = n1 }
override DataFlow::Node getNode2() { result.asExpr() = this }
override DataFlow::Node getNode2() { result.asIndirectExpr() = this }
}
// TODO: is this still needed?
// TODO: is this still needed? It appears to be (tests fail without it) but
// I don't know why as EVP_PKEY_paramgen is an operation step and we pass through
// operation steps already.
/**
* A call to `EVP_PKEY_paramgen` acts as a kind of pass through.
* It's output pkey is eventually used in a new operation generating
@@ -401,34 +426,10 @@ private class CtxParamGenCall extends CtxPassThroughCall {
CtxParamGenCall() {
this.getTarget().getName() = "EVP_PKEY_paramgen" and
n1.asExpr() = this.getArgument(0) and
(
n2.asExpr() = this.getArgument(1)
or
n2.asDefiningArgument() = this.getArgument(1)
)
}
override DataFlow::Node getNode1() { result = n1 }
override DataFlow::Node getNode2() { result = n2 }
}
//TODO: I am not sure CallArgToCtxRet is needed anymore
/**
* If the current node is an argument to a function
* that returns a pointer type, immediately flow through.
* NOTE: this passthrough is required if we allow
* intermediate steps to go into variables that are not a CTX type.
* See for example `CtxParamGenCall`.
*/
private class CallArgToCtxRet extends CtxPassThroughCall, CtxPointerExpr {
DataFlow::Node n1;
DataFlow::Node n2;
CallArgToCtxRet() {
this.getAnArgument() = n1.asExpr() and
n2.asExpr() = this
//Arg 0 is *ctx
n1.asIndirectExpr() = this.getArgument(0) and
//Arg 1 is **pkey
n2.asDefiningArgument() = this.getArgument(1)
}
override DataFlow::Node getNode1() { result = n1 }
@@ -439,7 +440,7 @@ private class CallArgToCtxRet extends CtxPassThroughCall, CtxPointerExpr {
/**
* A flow configuration from any non-final `OperationStep` to any other `OperationStep`.
*/
module OperationStepFlowConfig implements DataFlow::ConfigSig {
module OperationStepCtxFlowConfig implements DataFlow::ConfigSig {
predicate isSource(DataFlow::Node source) {
exists(OperationStep s |
s.getAnOutput() = source or
@@ -455,22 +456,39 @@ module OperationStepFlowConfig implements DataFlow::ConfigSig {
}
predicate isBarrier(DataFlow::Node node) {
exists(CtxClearCall c | c.getAnArgument() = node.asExpr())
exists(CtxClearCall c | c.getAnArgument() = [node.asExpr(), node.asIndirectExpr()])
}
predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) {
node1.(AdditionalFlowInputStep).getOutput() = node2
or
exists(CtxPassThroughCall c | c.getNode1() = node1 and c.getNode2() = node2)
or
// Flow out through all outputs from an operation step if more than one output
// is defined.
exists(OperationStep s | s.getAnInput() = node1 and s.getAnOutput() = node2)
// Flow only through context and key inputs and outputs
// keys and context generally hold unifying context that link multiple steps
// Flow only out of finalize operations through key outputs, otherwise stop at final operations
exists(OperationStep s, IOType inType, IOType outType |
(s.getStepType() = FinalStep() implies outType = KeyIO()) and
(
inType = ContextIO()
or
inType = KeyIO()
) and
(
outType = ContextIO()
or
outType = KeyIO()
) and
s.getInput(inType) = node1 and
s.getOutput(outType) = node2
)
// TODO: consideration for additional alises defined as follows:
// if an output from an operation step itself flows from the output of another operation step
// then the source of that flow's outputs (all of them) are potential aliases
}
}
module OperationStepFlow = DataFlow::Global<OperationStepFlowConfig>;
module OperationStepCtxFlow = TaintTracking::Global<OperationStepCtxFlowConfig>;
/**
* A flow from AVC to the first `OperationStep` the AVC reaches as an input.
@@ -483,7 +501,7 @@ module AvcToOperationStepFlowConfig implements DataFlow::ConfigSig {
predicate isSink(DataFlow::Node sink) { exists(OperationStep s | s.getAnInput() = sink) }
predicate isBarrier(DataFlow::Node node) {
exists(CtxClearCall c | c.getAnArgument() = node.asExpr())
exists(CtxClearCall c | c.getAnArgument() = [node.asExpr(), node.asIndirectExpr()])
}
/**
@@ -496,7 +514,7 @@ module AvcToOperationStepFlowConfig implements DataFlow::ConfigSig {
}
}
module AvcToOperationStepFlow = DataFlow::Global<AvcToOperationStepFlowConfig>;
module AvcToOperationStepFlow = TaintTracking::Global<AvcToOperationStepFlowConfig>;
module EncValToInitEncArgConfig implements DataFlow::ConfigSig {
predicate isSource(DataFlow::Node source) { source.asExpr().getValue().toInt() in [0, 1] }
@@ -506,7 +524,7 @@ module EncValToInitEncArgConfig implements DataFlow::ConfigSig {
}
}
module EncValToInitEncArgFlow = DataFlow::Global<EncValToInitEncArgConfig>;
module EncValToInitEncArgFlow = TaintTracking::Global<EncValToInitEncArgConfig>;
private Crypto::KeyOperationSubtype intToCipherOperationSubtype(int i) {
i = 0 and

View File

@@ -6,12 +6,25 @@ private import experimental.quantum.Language
private import experimental.quantum.OpenSSL.AvcFlow
private import experimental.quantum.OpenSSL.AlgorithmValueConsumers.OpenSSLAlgorithmValueConsumers
private import experimental.quantum.OpenSSL.Operations.OpenSSLOperations
private import experimental.quantum.OpenSSL.AlgorithmInstances.OpenSSLAlgorithmInstances
// TODO: verification functions
/**
* A base class for final signature operations.
* The operation must be known to always be a signature operation,
* and not a MAC operation. Used for both verification and signing.
* NOTE: even an operation that may be a mac or signature but is known to take in
* only signature configurations should extend `SignatureOrMacFinalOperation`.
*/
abstract class EvpSignatureFinalOperation extends OperationStep {
abstract class SignatureFinalOperation extends OperationStep {
override OperationStepType getStepType() { result = FinalStep() }
}
/**
* A base class for final signature or MAC operations.
* The operation must be known to always be a signature or MAC operation.
* Used for both verification or signing.
*/
abstract class SignatureOrMacFinalOperation extends OperationStep {
override OperationStepType getStepType() { result = FinalStep() }
}
@@ -24,36 +37,32 @@ class EvpSignatureDigestInitializer extends OperationStep {
}
override DataFlow::Node getInput(IOType type) {
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asIndirectExpr() = this.getArgument(0) and type = ContextIO()
or
this.getTarget().getName() = "EVP_DigestSignInit_ex" and
result.asExpr() = this.getArgument(3) and
result.asIndirectExpr() = this.getArgument(3) and
type = OsslLibContextIO()
or
result.asExpr() = this.getArgument(2) and type = HashAlgorithmIO()
result.asIndirectExpr() = this.getArgument(2) and type = HashAlgorithmIO()
or
this.getTarget().getName() = "EVP_DigestSignInit" and
result.asExpr() = this.getArgument(4) and
result.asIndirectExpr() = this.getArgument(4) and
type = KeyIO()
or
this.getTarget().getName() = "EVP_DigestSignInit_ex" and
result.asExpr() = this.getArgument(5) and
result.asIndirectExpr() = this.getArgument(5) and
type = KeyIO()
or
this.getTarget().getName() = "EVP_DigestSignInit_ex" and
result.asExpr() = this.getArgument(6) and
result.asIndirectExpr() = this.getArgument(6) and
type = OsslParamIO()
}
override DataFlow::Node getOutput(IOType type) {
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asDefiningArgument() = this.getArgument(0) and type = ContextIO()
or
// EVP_PKEY_CTX
result.asExpr() = this.getArgument(1) and type = ContextIO()
or
this.getTarget().getName() = "EVP_DigestSignInit_ex" and
result.asExpr() = this.getArgument(6) and
type = ContextIO()
result.asDefiningArgument() = this.getArgument(1) and type = ContextIO()
}
override OperationStepType getStepType() { result = InitializerStep() }
@@ -66,13 +75,13 @@ class EvpSignInit extends OperationStep {
EvpSignInit() { this.getTarget().getName() in ["EVP_SignInit", "EVP_SignInit_ex"] }
override DataFlow::Node getInput(IOType type) {
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asIndirectExpr() = this.getArgument(0) and type = ContextIO()
or
result.asExpr() = this.getArgument(1) and type = HashAlgorithmIO()
result.asIndirectExpr() = this.getArgument(1) and type = HashAlgorithmIO()
}
override DataFlow::Node getOutput(IOType type) {
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asDefiningArgument() = this.getArgument(0) and type = ContextIO()
}
override OperationStepType getStepType() { result = InitializerStep() }
@@ -94,22 +103,22 @@ class EvpPkeySignInit extends OperationStep {
}
override DataFlow::Node getInput(IOType type) {
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asIndirectExpr() = this.getArgument(0) and type = ContextIO()
or
this.getTarget().getName() in ["EVP_PKEY_sign_init_ex2", "EVP_PKEY_sign_message_init"] and
result.asExpr() = this.getArgument(1) and
result.asIndirectExpr() = this.getArgument(1) and
type = PrimaryAlgorithmIO()
or
this.getTarget().getName() = "EVP_PKEY_sign_init_ex" and
result.asExpr() = this.getArgument(1) and
result.asIndirectExpr() = this.getArgument(1) and
type = OsslParamIO()
or
// Argument 2 (0 based) only exists for EVP_PKEY_sign_init_ex2 and EVP_PKEY_sign_message_init
result.asExpr() = this.getArgument(2) and type = OsslParamIO()
result.asIndirectExpr() = this.getArgument(2) and type = OsslParamIO()
}
override DataFlow::Node getOutput(IOType type) {
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asDefiningArgument() = this.getArgument(0) and type = ContextIO()
}
override OperationStepType getStepType() { result = InitializerStep() }
@@ -126,13 +135,13 @@ class EvpSignatureUpdateCall extends OperationStep {
}
override DataFlow::Node getInput(IOType type) {
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asIndirectExpr() = this.getArgument(0) and type = ContextIO()
or
result.asExpr() = this.getArgument(1) and type = PlaintextIO()
result.asIndirectExpr() = this.getArgument(1) and type = PlaintextIO()
}
override DataFlow::Node getOutput(IOType type) {
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asDefiningArgument() = this.getArgument(0) and type = ContextIO()
}
override OperationStepType getStepType() { result = UpdateStep() }
@@ -141,73 +150,496 @@ class EvpSignatureUpdateCall extends OperationStep {
/**
* A call to EVP_SignFinal or EVP_SignFinal_ex.
*/
class EvpSignFinal extends EvpSignatureFinalOperation {
class EvpSignFinal extends SignatureFinalOperation {
EvpSignFinal() { this.getTarget().getName() in ["EVP_SignFinal_ex", "EVP_SignFinal"] }
override DataFlow::Node getInput(IOType type) {
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asIndirectExpr() = this.getArgument(0) and type = ContextIO()
or
result.asExpr() = this.getArgument(3) and type = KeyIO()
result.asIndirectExpr() = this.getArgument(3) and type = KeyIO()
or
// params above 3 (0-based) only exist for EVP_SignFinal_ex
result.asExpr() = this.getArgument(4) and
result.asIndirectExpr() = this.getArgument(4) and
type = OsslLibContextIO()
}
override DataFlow::Node getOutput(IOType type) {
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asDefiningArgument() = this.getArgument(0) and type = ContextIO()
or
result.asExpr() = this.getArgument(1) and type = SignatureIO()
result.asDefiningArgument() = this.getArgument(1) and type = SignatureIO()
or
result.asDefiningArgument() = this.getArgument(2) and type = SignatureSizeIO()
}
}
/**
* A call to EVP_DigestSign or EVP_PKEY_sign.
* A call to EVP_PKEY_sign.
*/
class EvpDigestSign extends EvpSignatureFinalOperation {
EvpDigestSign() { this.getTarget().getName() in ["EVP_DigestSign", "EVP_PKEY_sign"] }
class EvpPkeySign extends SignatureFinalOperation {
EvpPkeySign() {
this.getTarget().getName() = "EVP_PKEY_sign" and
// Setting signature to NULL is not a final sign step but an
// intermediary step used to get the required buffer size.
// not tracking these calls.
(
exists(this.(Call).getArgument(1).getValue())
implies
this.(Call).getArgument(1).getValue().toInt() != 0
)
}
override DataFlow::Node getInput(IOType type) {
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asIndirectExpr() = this.getArgument(0) and type = ContextIO()
or
result.asExpr() = this.getArgument(3) and type = PlaintextIO()
result.asIndirectExpr() = this.getArgument(3) and type = PlaintextIO()
}
override DataFlow::Node getOutput(IOType type) {
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asDefiningArgument() = this.getArgument(0) and type = ContextIO()
or
result.asExpr() = this.getArgument(1) and type = SignatureIO()
result.asDefiningArgument() = this.getArgument(1) and type = SignatureIO()
}
}
/**
* A call to EVP_DigestSignFinal or EVP_PKEY_sign_message_final.
* A call to EVP_DigestSign.
* This is a mac or sign operation.
*/
class EvpDigestAndPkeySignFinal extends EvpSignatureFinalOperation {
EvpDigestAndPkeySignFinal() {
this.getTarget().getName() in [
"EVP_DigestSignFinal",
"EVP_PKEY_sign_message_final"
]
}
class EvpDigestSign extends SignatureOrMacFinalOperation {
EvpDigestSign() { this.getTarget().getName() = "EVP_DigestSign" }
override DataFlow::Node getInput(IOType type) {
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asIndirectExpr() = this.getArgument(0) and type = ContextIO()
or
result.asIndirectExpr() = this.getArgument(3) and type = PlaintextIO()
}
override DataFlow::Node getOutput(IOType type) {
result.asExpr() = this.getArgument(0) and type = ContextIO()
result.asDefiningArgument() = this.getArgument(0) and type = ContextIO()
or
result.asExpr() = this.getArgument(1) and type = SignatureIO()
result.asDefiningArgument() = this.getArgument(1) and type = SignatureIO()
}
}
/**
* A call to EVP_PKEY_sign_message_final.
*/
class EvpPkeySignFinal extends SignatureFinalOperation {
EvpPkeySignFinal() {
this.getTarget().getName() = "EVP_PKEY_sign_message_final" and
// Setting signature to NULL is not a final sign step but an
// intermediary step used to get the required buffer size.
// not tracking these calls.
(
exists(this.(Call).getArgument(1).getValue())
implies
this.(Call).getArgument(1).getValue().toInt() != 0
)
}
override DataFlow::Node getInput(IOType type) {
result.asIndirectExpr() = this.getArgument(0) and type = ContextIO()
}
override DataFlow::Node getOutput(IOType type) {
result.asDefiningArgument() = this.getArgument(0) and type = ContextIO()
or
result.asDefiningArgument() = this.getArgument(1) and type = SignatureIO()
or
result.asExpr() = this.getArgument(2) and type = SignatureSizeIO()
}
}
/**
* A call to EVP_DigestSignFinal.
* This is a mac or sign operation.
*/
class EvpDigestSignFinal extends SignatureOrMacFinalOperation {
EvpDigestSignFinal() {
this.getTarget().getName() = "EVP_DigestSignFinal" and
// Setting signature to NULL is not a final sign step but an
// intermediary step used to get the required buffer size.
// not tracking these calls.
(
exists(this.(Call).getArgument(1).getValue())
implies
this.(Call).getArgument(1).getValue().toInt() != 0
)
}
override DataFlow::Node getInput(IOType type) {
result.asIndirectExpr() = this.getArgument(0) and type = ContextIO()
}
override DataFlow::Node getOutput(IOType type) {
result.asDefiningArgument() = this.getArgument(0) and type = ContextIO()
or
result.asDefiningArgument() = this.getArgument(1) and type = SignatureIO()
}
override OperationStepType getStepType() { result = FinalStep() }
}
/**
* An EVP signature operation instance.
* A call to EVP_DigestVerifyInit or EVP_DigestVerifyInit_ex.
*/
class EvpSignatureOperationInstance extends Crypto::SignatureOperationInstance instanceof EvpSignatureFinalOperation
class EvpDigestVerifyInit extends OperationStep {
EvpDigestVerifyInit() {
this.getTarget().getName() in ["EVP_DigestVerifyInit", "EVP_DigestVerifyInit_ex"]
}
override DataFlow::Node getInput(IOType type) {
result.asIndirectExpr() = this.getArgument(0) and type = ContextIO()
or
result.asIndirectExpr() = this.getArgument(2) and type = HashAlgorithmIO()
or
this.getTarget().getName() = "EVP_DigestVerifyInit_ex" and
result.asIndirectExpr() = this.getArgument(3) and
type = OsslLibContextIO()
or
this.getTarget().getName() = "EVP_DigestVerifyInit_ex" and
result.asIndirectExpr() = this.getArgument(5) and
type = KeyIO()
or
this.getTarget().getName() = "EVP_DigestVerifyInit" and
result.asIndirectExpr() = this.getArgument(4) and
type = KeyIO()
or
this.getTarget().getName() = "EVP_DigestVerifyInit_ex" and
result.asIndirectExpr() = this.getArgument(6) and
type = OsslParamIO()
}
override DataFlow::Node getOutput(IOType type) {
result.asDefiningArgument() = this.getArgument(0) and type = ContextIO()
or
result.asDefiningArgument() = this.getArgument(1) and type = ContextIO()
}
override OperationStepType getStepType() { result = InitializerStep() }
}
/**
* A call to EVP_DigestVerifyUpdate.
*/
class EvpDigestVerifyUpdate extends OperationStep {
EvpDigestVerifyUpdate() { this.getTarget().getName() = "EVP_DigestVerifyUpdate" }
override DataFlow::Node getInput(IOType type) {
result.asIndirectExpr() = this.getArgument(0) and type = ContextIO()
or
result.asIndirectExpr() = this.getArgument(1) and type = PlaintextIO()
}
override DataFlow::Node getOutput(IOType type) {
result.asDefiningArgument() = this.getArgument(0) and type = ContextIO()
}
override OperationStepType getStepType() { result = UpdateStep() }
}
/**
* A call to EVP_DigestVerifyFinal
*/
class EvpDigestVerifyFinal extends SignatureFinalOperation {
EvpDigestVerifyFinal() { this.getTarget().getName() = "EVP_DigestVerifyFinal" }
override DataFlow::Node getInput(IOType type) {
result.asIndirectExpr() = this.getArgument(0) and type = ContextIO()
or
result.asIndirectExpr() = this.getArgument(1) and type = SignatureIO()
}
override DataFlow::Node getOutput(IOType type) {
result.asDefiningArgument() = this.getArgument(0) and type = ContextIO()
}
}
/**
* A call to EVP_DigestVerify
*/
class EvpDigestVerify extends SignatureFinalOperation {
EvpDigestVerify() { this.getTarget().getName() = "EVP_DigestVerify" }
override DataFlow::Node getInput(IOType type) {
result.asIndirectExpr() = this.getArgument(0) and type = ContextIO()
or
result.asIndirectExpr() = this.getArgument(1) and type = SignatureIO()
or
result.asIndirectExpr() = this.getArgument(3) and type = PlaintextIO()
}
override DataFlow::Node getOutput(IOType type) {
result.asDefiningArgument() = this.getArgument(0) and type = ContextIO()
}
}
/**
* A call to `EVP_PKEY_verify_init`, `EVP_PKEY_verify_init_ex`,
* `EVP_PKEY_verify_init_ex2`, or `EVP_PKEY_verify_message_init`
* https://docs.openssl.org/master/man3/EVP_PKEY_verify/#synopsis
*/
class EvpVerifyInit extends OperationStep {
EvpVerifyInit() {
this.getTarget().getName() in [
"EVP_PKEY_verify_init", "EVP_PKEY_verify_init_ex", "EVP_PKEY_verify_init_ex2",
"EVP_PKEY_verify_message_init"
]
}
override DataFlow::Node getInput(IOType type) {
result.asIndirectExpr() = this.getArgument(0) and type = ContextIO()
or
this.getTarget().getName() = "EVP_PKEY_verify_init_ex" and
result.asIndirectExpr() = this.getArgument(1) and
type = OsslParamIO()
or
this.getTarget().getName() in ["EVP_PKEY_verify_init_ex2", "EVP_PKEY_verify_message_init"] and
result.asIndirectExpr() = this.getArgument(1) and
type = PrimaryAlgorithmIO()
or
this.getTarget().getName() in ["EVP_PKEY_verify_init_ex2", "EVP_PKEY_verify_message_init"] and
result.asIndirectExpr() = this.getArgument(2) and
type = OsslParamIO()
}
override DataFlow::Node getOutput(IOType type) {
result.asDefiningArgument() = this.getArgument(0) and type = ContextIO()
}
override OperationStepType getStepType() { result = InitializerStep() }
}
/**
* A call to `EVP_PKEY_CTX_set_signature`
* https://docs.openssl.org/master/man3/EVP_PKEY_verify/
*/
class EvpCtxSetSignatureInitializer extends OperationStep {
EvpCtxSetSignatureInitializer() { this.getTarget().getName() = "EVP_PKEY_CTX_set_signature" }
override DataFlow::Node getInput(IOType type) {
result.asIndirectExpr() = this.getArgument(0) and type = ContextIO()
or
result.asIndirectExpr() = this.getArgument(1) and type = SignatureIO()
or
result.asExpr() = this.getArgument(2) and type = SignatureSizeIO()
}
override DataFlow::Node getOutput(IOType type) {
result.asDefiningArgument() = this.getArgument(0) and type = ContextIO()
}
override OperationStepType getStepType() { result = InitializerStep() }
}
/**
* A call to `EVP_PKEY_verify_message_update`.
*/
class EvpVerifyMessageUpdate extends OperationStep {
EvpVerifyMessageUpdate() { this.getTarget().getName() = "EVP_PKEY_verify_message_update" }
override DataFlow::Node getInput(IOType type) {
result.asIndirectExpr() = this.getArgument(0) and type = ContextIO()
or
result.asIndirectExpr() = this.getArgument(1) and type = PlaintextIO()
or
result.asExpr() = this.getArgument(2) and type = PlaintextSizeIO()
}
override DataFlow::Node getOutput(IOType type) {
result.asDefiningArgument() = this.getArgument(0) and type = ContextIO()
}
override OperationStepType getStepType() { result = UpdateStep() }
}
/**
* A call to `EVP_PKEY_verify_message_final`.
*/
class EvpVerifyMessageFinal extends SignatureFinalOperation {
EvpVerifyMessageFinal() { this.getTarget().getName() = "EVP_PKEY_verify_message_final" }
override DataFlow::Node getInput(IOType type) {
result.asIndirectExpr() = this.getArgument(0) and type = ContextIO()
}
override DataFlow::Node getOutput(IOType type) {
result.asDefiningArgument() = this.getArgument(0) and type = ContextIO()
}
}
/**
* A call to `EVP_PKEY_verify`
*/
class EvpVerify extends SignatureFinalOperation {
EvpVerify() { this.getTarget().getName() = "EVP_PKEY_verify" }
override DataFlow::Node getInput(IOType type) {
result.asIndirectExpr() = this.getArgument(0) and type = ContextIO()
or
result.asIndirectExpr() = this.getArgument(1) and type = SignatureIO()
or
result.asExpr() = this.getArgument(2) and type = SignatureSizeIO()
or
result.asIndirectExpr() = this.getArgument(3) and type = PlaintextIO()
or
result.asExpr() = this.getArgument(4) and type = PlaintextSizeIO()
}
override DataFlow::Node getOutput(IOType type) {
result.asDefiningArgument() = this.getArgument(0) and type = ContextIO()
}
}
/**
* A call to `RSA_sign` or `RSA_verify`.
* https://docs.openssl.org/3.0/man3/RSA_sign/
*/
class RsaSignorVerify extends SignatureFinalOperation {
RsaSignorVerify() { this.getTarget().getName() in ["RSA_sign", "RSA_verify"] }
override DataFlow::Node getInput(IOType type) {
// Arg 0 is an NID (so asExpr not asIndirectExpr)
result.asExpr() = this.getArgument(0) and type = HashAlgorithmIO()
or
result.asIndirectExpr() = this.getArgument(1) and type = PlaintextIO()
or
result.asExpr() = this.getArgument(2) and type = PlaintextSizeIO()
or
this.getTarget().getName() = "RSA_verify" and
result.asIndirectExpr() = this.getArgument(3) and
type = SignatureIO()
or
this.getTarget().getName() = "RSA_verify" and
result.asIndirectExpr() = this.getArgument(4) and
type = SignatureSizeIO()
or
result.asIndirectExpr() = this.getArgument(5) and type = KeyIO()
}
override DataFlow::Node getOutput(IOType type) {
result.asDefiningArgument() = this.getArgument(0) and type = ContextIO()
or
this.getTarget().getName() = "RSA_sign" and
result.asDefiningArgument() = this.getArgument(3) and
type = SignatureIO()
or
this.getTarget().getName() = "RSA_sign" and
type = SignatureSizeIO() and
result.asDefiningArgument() = this.getArgument(4)
}
}
/**
* A call to `DSA_do_sign` or `DSA_do_verify`
*/
class DsaDoSignOrVerify extends SignatureFinalOperation {
DsaDoSignOrVerify() { this.getTarget().getName() in ["DSA_do_sign", "DSA_do_verify"] }
override DataFlow::Node getInput(IOType type) {
result.asIndirectExpr() = this.getArgument(0) and type = PlaintextIO()
or
result.asExpr() = this.getArgument(1) and type = PlaintextSizeIO()
or
this.getTarget().getName() = "DSA_do_sign" and
result.asIndirectExpr() = this.getArgument(2) and
type = KeyIO()
or
this.getTarget().getName() = "DSA_do_verify" and
result.asIndirectExpr() = this.getArgument(2) and
type = SignatureIO()
or
this.getTarget().getName() = "DSA_do_verify" and
result.asIndirectExpr() = this.getArgument(3) and
type = KeyIO()
}
override DataFlow::Node getOutput(IOType type) {
this.getTarget().getName() = "DSA_do_sign" and
result.asIndirectExpr() = this and
type = SignatureIO()
}
}
/**
* A Call to `EVP_VerifyInit` or `EVP_VerifyInit_ex`
* - int EVP_VerifyInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl);
* - int EVP_VerifyInit(EVP_MD_CTX *ctx, const EVP_MD *type);
*/
class EVP_VerifyInitCall extends OperationStep {
EVP_VerifyInitCall() { this.getTarget().getName() in ["EVP_VerifyInit", "EVP_VerifyInit_ex"] }
override DataFlow::Node getInput(IOType type) {
result.asIndirectExpr() = this.getArgument(0) and type = ContextIO()
or
result.asIndirectExpr() = this.getArgument(1) and type = HashAlgorithmIO()
}
override DataFlow::Node getOutput(IOType type) {
result.asDefiningArgument() = this.getArgument(0) and type = ContextIO()
}
override OperationStepType getStepType() { result = InitializerStep() }
}
/**
* A call to `EVP_VerifyUpdate`
* - int EVP_VerifyUpdate(EVP_MD_CTX *ctx, const void *d, unsigned int cnt);
*/
class EVP_VerifyUpdateCall extends OperationStep {
EVP_VerifyUpdateCall() { this.getTarget().getName() = "EVP_VerifyUpdate" }
override DataFlow::Node getInput(IOType type) {
result.asIndirectExpr() = this.getArgument(0) and type = ContextIO()
or
result.asIndirectExpr() = this.getArgument(1) and type = PlaintextIO()
or
result.asIndirectExpr() = this.getArgument(2) and type = PlaintextSizeIO()
}
override DataFlow::Node getOutput(IOType type) {
result.asDefiningArgument() = this.getArgument(0) and type = ContextIO()
}
override OperationStepType getStepType() { result = UpdateStep() }
}
/**
* A call to `EVP_VerifyFinal` or `EVP_VerifyFinal_ex`
* - int EVP_VerifyFinal_ex(EVP_MD_CTX *ctx, const unsigned char *sigbuf,
* unsigned int siglen, EVP_PKEY *pkey,
* OSSL_LIB_CTX *libctx, const char *propq);
*- int EVP_VerifyFinal(EVP_MD_CTX *ctx, unsigned char *sigbuf, unsigned int siglen,
* EVP_PKEY *pkey); *
*/
class EVP_VerifyFinalCall extends SignatureFinalOperation {
EVP_VerifyFinalCall() { this.getTarget().getName() in ["EVP_VerifyFinal", "EVP_VerifyFinal_ex"] }
override DataFlow::Node getInput(IOType type) {
result.asIndirectExpr() = this.getArgument(0) and type = ContextIO()
or
result.asIndirectExpr() = this.getArgument(1) and type = SignatureIO()
or
result.asExpr() = this.getArgument(2) and type = SignatureSizeIO()
or
result.asIndirectExpr() = this.getArgument(3) and type = KeyIO()
or
result.asIndirectExpr() = this.getArgument(4) and type = OsslLibContextIO()
// TODO: arg 5 propq?
}
override DataFlow::Node getOutput(IOType type) {
result.asDefiningArgument() = this.getArgument(0) and type = ContextIO()
}
override OperationStepType getStepType() { result = FinalStep() }
}
/**
* An instance of a signature operation.
* This is an OpenSSL specific class that extends the base SignatureOperationInstance.
*/
class OpenSslSignatureOperationInstance extends Crypto::SignatureOperationInstance instanceof SignatureFinalOperation
{
override Crypto::AlgorithmValueConsumer getAnAlgorithmValueConsumer() {
super.getPrimaryAlgorithmValueConsumer() = result
@@ -217,7 +649,7 @@ class EvpSignatureOperationInstance extends Crypto::SignatureOperationInstance i
* Signing, verification or unknown.
*/
override Crypto::KeyOperationSubtype getKeyOperationSubtype() {
// TODO: if this KeyOperationSubtype does not match initialization call's KeyOperationSubtype then we found a bug
// NOTE: if this KeyOperationSubtype does not match initialization call's KeyOperationSubtype then we found a bug
if super.getTarget().getName().toLowerCase().matches("%sign%")
then result instanceof Crypto::TSignMode
else
@@ -227,14 +659,70 @@ class EvpSignatureOperationInstance extends Crypto::SignatureOperationInstance i
}
override Crypto::ConsumerInputDataFlowNode getNonceConsumer() {
// TODO: some signing operations may have explicit nonce generators
none()
// some signing operations may have explicit nonce generators
super.getDominatingInitializersToStep(IVorNonceIO()).getInput(IVorNonceIO()) = result
}
override Crypto::ConsumerInputDataFlowNode getKeyConsumer() {
super.getDominatingInitializersToStep(KeyIO()).getInput(KeyIO()) = result
}
override Crypto::ConsumerInputDataFlowNode getSignatureConsumer() {
super.getDominatingInitializersToStep(SignatureIO()).getInput(SignatureIO()) = result
}
override Crypto::ArtifactOutputDataFlowNode getOutputArtifact() {
super.getOutputStepFlowingToStep(SignatureIO()).getOutput(SignatureIO()) = result
}
override Crypto::ConsumerInputDataFlowNode getInputConsumer() {
super.getDominatingInitializersToStep(PlaintextIO()).getInput(PlaintextIO()) = result
}
override Crypto::AlgorithmValueConsumer getHashAlgorithmValueConsumer() {
super
.getDominatingInitializersToStep(HashAlgorithmIO())
.getAlgorithmValueConsumerForInput(HashAlgorithmIO()) = result
or
// Handle cases where the hash is set through the primary algorithm
// RSA-SHA256 for example
// NOTE: assuming the hash would not be overridden, or if it is it is undefined
// i.e., if the above dominating initializer exists and the primary algorithm
// specifies a hash, consider both valid hash AVCs.
// TODO: can this behavior be build into the get dominating initializers?
super.getPrimaryAlgorithmValueConsumer() = result and
exists(OpenSslAlgorithmInstance i |
i.getAvc() = result and i instanceof Crypto::HashAlgorithmInstance
)
}
override predicate hasHashAlgorithmConsumer() {
exists(super.getDominatingInitializersToStep(HashAlgorithmIO()))
}
}
/**
* A class for signature or MAC operation instances.
* This is an OpenSSL specific class that extends the base SignatureOrMacOperationInstance.
*/
class OpenSslSignatureOrMacOperationInstance extends Crypto::SignatureOrMacOperationInstance instanceof SignatureOrMacFinalOperation
{
override Crypto::AlgorithmValueConsumer getAnAlgorithmValueConsumer() {
super.getPrimaryAlgorithmValueConsumer() = result
}
/**
* Keys provided in the initialization call or in a context are found by this method.
* Keys in explicit arguments are found by overridden methods in extending classes.
* Signing, verification or unknown.
*/
override Crypto::KeyOperationSubtype getKeyOperationSubtype() {
result instanceof Crypto::TSignMode or result instanceof Crypto::TMacMode
}
override Crypto::ConsumerInputDataFlowNode getNonceConsumer() {
// some signing operations may have explicit nonce generators
super.getDominatingInitializersToStep(IVorNonceIO()).getInput(IVorNonceIO()) = result
}
override Crypto::ConsumerInputDataFlowNode getKeyConsumer() {
super.getDominatingInitializersToStep(KeyIO()).getInput(KeyIO()) = result
}
@@ -247,14 +735,24 @@ class EvpSignatureOperationInstance extends Crypto::SignatureOperationInstance i
super.getDominatingInitializersToStep(PlaintextIO()).getInput(PlaintextIO()) = result
}
/**
* TODO: only signing operations for now, change when verificaiton is added
*/
override Crypto::ConsumerInputDataFlowNode getSignatureConsumer() { none() }
override Crypto::AlgorithmValueConsumer getHashAlgorithmValueConsumer() {
super
.getDominatingInitializersToStep(HashAlgorithmIO())
.getAlgorithmValueConsumerForInput(HashAlgorithmIO()) = result
or
// Handle cases where the hash is set through the primary algorithm
// RSA-SHA256 for example
// NOTE: assuming the hash would not be overridden, or if it is it is undefined
// i.e., if the above dominating initializer exists and the primary algorithm
// specifies a hash, consider both valid hash AVCs.
// TODO: can this behavior be build into the get dominating initializers?
super.getPrimaryAlgorithmValueConsumer() = result and
exists(OpenSslAlgorithmInstance i |
i.getAvc() = result and i instanceof Crypto::HashAlgorithmInstance
)
}
override predicate hasHashAlgorithmConsumer() {
exists(super.getDominatingInitializersToStep(HashAlgorithmIO()))
}
}

View File

@@ -412,7 +412,7 @@ private predicate boundFlowStepPhi(
or
exists(IRGuardCondition guard, boolean testIsTrue |
guard = boundFlowCond(valueNumberOfOperand(op2), op1, delta, upper, testIsTrue) and
guard.controlsEdge(op2.getPredecessorBlock(), op2.getUse().getBlock(), testIsTrue) and
guard.controlsBranchEdge(op2.getPredecessorBlock(), op2.getUse().getBlock(), testIsTrue) and
reason = TCondReason(guard)
)
}

View File

@@ -1,5 +1,5 @@
name: codeql/cpp-all
version: 5.5.1-dev
version: 6.0.1-dev
groups: cpp
dbscheme: semmlecode.cpp.dbscheme
extractor: cpp

View File

@@ -87,6 +87,7 @@ class ElementBase extends @element {
*/
class Element extends ElementBase {
/** Gets the primary file where this element occurs. */
pragma[nomagic]
File getFile() { result = this.getLocation().getFile() }
/**

File diff suppressed because it is too large Load Diff

View File

@@ -104,7 +104,9 @@ private module StepsInput implements Impl::Private::StepsInputSig {
result.getStaticCallTarget().getUnderlyingCallable() = sc
}
Node getSourceNode(Input::SourceBase source, Impl::Private::SummaryComponent sc) { none() }
DataFlowCallable getSourceNodeEnclosingCallable(Input::SourceBase source) { none() }
Node getSourceNode(Input::SourceBase source, Impl::Private::SummaryComponentStack s) { none() }
Node getSinkNode(Input::SinkBase sink, Impl::Private::SummaryComponent sc) { none() }
}

View File

@@ -498,7 +498,9 @@ class FinalParameterUse extends UseImpl, TFinalParameterUse {
int getArgumentIndex() { result = p.getIndex() }
override Node getNode() { finalParameterNodeHasParameterAndIndex(result, p, indirectionIndex) }
override FinalParameterNode getNode() {
finalParameterNodeHasParameterAndIndex(result, p, indirectionIndex)
}
override int getIndirection() { result = indirectionIndex + 1 }
@@ -1000,7 +1002,7 @@ private module DataFlowIntegrationInput implements SsaImpl::DataFlowIntegrationI
result instanceof FalseEdge
}
class GuardValue = Boolean;
class GuardValue = IRGuards::GuardValue;
class Guard instanceof IRGuards::IRGuardCondition {
string toString() { result = super.toString() }
@@ -1008,7 +1010,7 @@ private module DataFlowIntegrationInput implements SsaImpl::DataFlowIntegrationI
predicate hasValueBranchEdge(IRCfg::BasicBlock bb1, IRCfg::BasicBlock bb2, GuardValue branch) {
exists(EdgeKind kind |
super.getBlock() = bb1 and
kind = getConditionalEdge(branch) and
kind = getConditionalEdge(branch.asBooleanValue()) and
bb1.getSuccessor(kind) = bb2
)
}
@@ -1021,7 +1023,7 @@ private module DataFlowIntegrationInput implements SsaImpl::DataFlowIntegrationI
}
predicate guardDirectlyControlsBlock(Guard guard, IRCfg::BasicBlock bb, GuardValue branch) {
guard.(IRGuards::IRGuardCondition).controls(bb, branch)
guard.(IRGuards::IRGuardCondition).valueControls(bb, branch)
}
predicate keepAllPhiInputBackEdges() { any() }
@@ -1048,25 +1050,35 @@ module BarrierGuardWithIntParam<guardChecksNodeSig/4 guardChecksNode> {
)
}
private predicate guardChecks(
DataFlowIntegrationInput::Guard g, SsaImpl::Definition def,
DataFlowIntegrationInput::GuardValue branch, int indirectionIndex
private predicate guardChecksInstr(
IRGuards::Guards_v1::Guard g, IRGuards::GuardsInput::Expr instr, boolean branch,
int indirectionIndex
) {
exists(UseImpl use |
guardChecksNode(g, use.getNode(), branch, indirectionIndex) and
ssaDefReachesCertainUse(def, use)
exists(Node node |
nodeHasInstruction(node, instr, indirectionIndex) and
guardChecksNode(g, node, branch, indirectionIndex)
)
}
private predicate guardChecksWithWrappers(
DataFlowIntegrationInput::Guard g, SsaImpl::Definition def, IRGuards::GuardValue val,
int indirectionIndex
) {
IRGuards::Guards_v1::ValidationWrapperWithState<int, guardChecksInstr/4>::guardChecksDef(g, def,
val, indirectionIndex)
}
Node getABarrierNode(int indirectionIndex) {
// Only get the SynthNodes from the shared implementation, as the ExprNodes cannot
// be matched on SourceVariable.
result.(SsaSynthNode).getSynthNode() =
DataFlowIntegrationImpl::BarrierGuardDefWithState<int, guardChecks/4>::getABarrierNode(indirectionIndex)
DataFlowIntegrationImpl::BarrierGuardDefWithState<int, guardChecksWithWrappers/4>::getABarrierNode(indirectionIndex)
or
// Calculate the guarded UseImpls corresponding to ExprNodes directly.
exists(DataFlowIntegrationInput::Guard g, boolean branch, Definition def, IRBlock bb |
guardChecks(g, def, branch, indirectionIndex) and
exists(
DataFlowIntegrationInput::Guard g, IRGuards::GuardValue branch, Definition def, IRBlock bb
|
guardChecksWithWrappers(g, def, branch, indirectionIndex) and
exists(UseImpl use |
ssaDefReachesCertainUse(def, use) and
use.getBlock() = bb and
@@ -1124,7 +1136,15 @@ predicate ssaFlow(Node nodeFrom, Node nodeTo) {
*/
class PhiNode extends Definition instanceof SsaImpl::PhiNode {
/** Gets a definition that is an input to this phi node. */
final Definition getAnInput() { phiHasInputFromBlock(this, result, _) }
final Definition getAnInput() { this.hasInputFromBlock(result, _) }
/**
* Holds if `input` is an input to this phi node along the edge originating
* in `bb`.
*/
final predicate hasInputFromBlock(Definition input, IRBlock bb) {
phiHasInputFromBlock(this, input, bb)
}
}
/** An static single assignment (SSA) definition. */
@@ -1149,10 +1169,53 @@ class Definition extends SsaImpl::Definition {
exists(SourceVariable sv, IRBlock bb, int i, UseImpl use |
ssaDefReachesRead(sv, this, bb, i) and
use.hasIndexInBlock(bb, i, sv) and
result = use.getNode().asOperand()
use = TDirectUseImpl(result, 0)
)
}
/**
* Holds if this definition defines the parameter `p` upon entry into the
* enclosing function.
*/
pragma[nomagic]
predicate isParameterDefinition(Parameter p) {
this.getIndirectionIndex() = 0 and
getDefImpl(this).getValue().asInstruction().(InitializeParameterInstruction).getParameter() = p
}
/**
* Holds if this definition defines the `indirectionIndex`'th indirection of
* parameter `p` upon entry into the enclosing function.
*/
pragma[nomagic]
predicate isIndirectParameterDefinition(Parameter p, int indirectionIndex) {
this.getIndirectionIndex() = indirectionIndex and
indirectionIndex > 0 and
getDefImpl(this).getValue().asInstruction().(InitializeParameterInstruction).getParameter() = p
}
/**
* Holds if this definition defines the implicit `this` parameter upon entry into
* the enclosing member function.
*/
pragma[nomagic]
predicate isThisDefinition() {
this.getIndirectionIndex() = 0 and
getDefImpl(this).getValue().asInstruction().(InitializeParameterInstruction).hasIndex(-1)
}
/**
* Holds if this definition defines the implicit `*this` parameter (i.e., the
* indirection of the `this` parameter) upon entry into the enclosing member
* function.
*/
pragma[nomagic]
predicate isIndirectThisDefinition(int indirectionIndex) {
this.getIndirectionIndex() = indirectionIndex and
indirectionIndex > 0 and
getDefImpl(this).getValue().asInstruction().(InitializeParameterInstruction).hasIndex(-1)
}
/**
* Gets an `Operand` that represents an indirect use of this definition.
*
@@ -1167,10 +1230,11 @@ class Definition extends SsaImpl::Definition {
* value that was defined by the definition.
*/
Operand getAnIndirectUse(int indirectionIndex) {
indirectionIndex > 0 and
exists(SourceVariable sv, IRBlock bb, int i, UseImpl use |
ssaDefReachesRead(sv, this, bb, i) and
use.hasIndexInBlock(bb, i, sv) and
result = use.getNode().asIndirectOperand(indirectionIndex)
use = TDirectUseImpl(result, indirectionIndex)
)
}

View File

@@ -52,11 +52,18 @@ class GotoEdge extends EdgeKindImpl, TGotoEdge {
final override string toString() { result = "Goto" }
}
/**
* A "true" or "false" edge representing a successor of a conditional branch.
*/
abstract private class BooleanEdgeKindImpl extends EdgeKindImpl { }
final class BooleanEdge = BooleanEdgeKindImpl;
/**
* A "true" edge, representing the successor of a conditional branch when the
* condition is non-zero.
*/
class TrueEdge extends EdgeKindImpl, TTrueEdge {
class TrueEdge extends BooleanEdgeKindImpl, TTrueEdge {
final override string toString() { result = "True" }
}
@@ -64,7 +71,7 @@ class TrueEdge extends EdgeKindImpl, TTrueEdge {
* A "false" edge, representing the successor of a conditional branch when the
* condition is zero.
*/
class FalseEdge extends EdgeKindImpl, TFalseEdge {
class FalseEdge extends BooleanEdgeKindImpl, TFalseEdge {
final override string toString() { result = "False" }
}
@@ -95,19 +102,48 @@ class SehExceptionEdge extends ExceptionEdgeImpl, TSehExceptionEdge {
final override string toString() { result = "SEH Exception" }
}
/**
* An edge from a `Switch` instruction to one of the cases, or to the default
* branch.
*/
abstract private class SwitchEdgeKindImpl extends EdgeKindImpl {
/**
* Gets the smallest value of the switch expression for which control will flow along this edge.
*/
string getMinValue() { none() }
/**
* Gets the largest value of the switch expression for which control will flow along this edge.
*/
string getMaxValue() { none() }
/**
* Gets the unique value of the switch expression for which control will
* flow along this edge, if any.
*/
final string getValue() { result = unique( | | [this.getMinValue(), this.getMaxValue()]) }
/** Holds if this edge is the default edge. */
predicate isDefault() { none() }
}
final class SwitchEdge = SwitchEdgeKindImpl;
/**
* A "default" edge, representing the successor of a `Switch` instruction when
* none of the case values matches the condition value.
*/
class DefaultEdge extends EdgeKindImpl, TDefaultEdge {
class DefaultEdge extends SwitchEdgeKindImpl, TDefaultEdge {
final override string toString() { result = "Default" }
final override predicate isDefault() { any() }
}
/**
* A "case" edge, representing the successor of a `Switch` instruction when the
* the condition value matches a corresponding `case` label.
*/
class CaseEdge extends EdgeKindImpl, TCaseEdge {
class CaseEdge extends SwitchEdgeKindImpl, TCaseEdge {
string minValue;
string maxValue;
@@ -119,24 +155,9 @@ class CaseEdge extends EdgeKindImpl, TCaseEdge {
else result = "Case[" + minValue + ".." + maxValue + "]"
}
/**
* Gets the smallest value of the switch expression for which control will flow along this edge.
*/
final string getMinValue() { result = minValue }
final override string getMinValue() { result = minValue }
/**
* Gets the largest value of the switch expression for which control will flow along this edge.
*/
final string getMaxValue() { result = maxValue }
/**
* Gets the unique value of the switch expression for which control will
* flow along this edge, if any.
*/
final string getValue() {
minValue = maxValue and
result = minValue
}
final override string getMaxValue() { result = maxValue }
}
/**

View File

@@ -1084,6 +1084,12 @@ class BinaryInstruction extends Instruction {
or
op1 = this.getRightOperand() and op2 = this.getLeftOperand()
}
/**
* Gets the instruction whose result provides the value of the left or right
* operand of this binary instruction.
*/
Instruction getAnInput() { result = this.getLeft() or result = this.getRight() }
}
/**

View File

@@ -1084,6 +1084,12 @@ class BinaryInstruction extends Instruction {
or
op1 = this.getRightOperand() and op2 = this.getLeftOperand()
}
/**
* Gets the instruction whose result provides the value of the left or right
* operand of this binary instruction.
*/
Instruction getAnInput() { result = this.getLeft() or result = this.getRight() }
}
/**

View File

@@ -1084,6 +1084,12 @@ class BinaryInstruction extends Instruction {
or
op1 = this.getRightOperand() and op2 = this.getLeftOperand()
}
/**
* Gets the instruction whose result provides the value of the left or right
* operand of this binary instruction.
*/
Instruction getAnInput() { result = this.getLeft() or result = this.getRight() }
}
/**

View File

@@ -1,10 +1,10 @@
import cpp
/**
* Describes whether a relation is 'strict' (that is, a `<` or `>`
* The strictness of a relation. Either 'strict' (that is, a `<` or `>`
* relation) or 'non-strict' (a `<=` or `>=` relation).
*/
newtype RelationStrictness =
newtype TRelationStrictness =
/**
* Represents that a relation is 'strict' (that is, a `<` or `>` relation).
*/
@@ -14,6 +14,19 @@ newtype RelationStrictness =
*/
Nonstrict()
/**
* The strictness of a relation. Either 'strict' (that is, a `<` or `>`
* relation) or 'non-strict' (a `<=` or `>=` relation).
*/
class RelationStrictness extends TRelationStrictness {
/** Gets the string representation of this relation strictness. */
string toString() {
this = Strict() and result = "strict"
or
this = Nonstrict() and result = "non-strict"
}
}
/**
* Describes whether a relation is 'greater' (that is, a `>` or `>=`
* relation) or 'lesser' (a `<` or `<=` relation).
@@ -105,10 +118,10 @@ predicate relOpWithSwap(
*
* This allows for the relation to be either as written, or with its
* arguments reversed; for example, if `rel` is `x < 5` then
* `relOpWithSwapAndNegate(rel, x, 5, Lesser(), Strict(), true)`,
* `relOpWithSwapAndNegate(rel, 5, x, Greater(), Strict(), true)`,
* `relOpWithSwapAndNegate(rel, x, 5, Greater(), Nonstrict(), false)` and
* `relOpWithSwapAndNegate(rel, 5, x, Lesser(), Nonstrict(), false)` hold.
* - `relOpWithSwapAndNegate(rel, x, 5, Lesser(), Strict(), true)`,
* - `relOpWithSwapAndNegate(rel, 5, x, Greater(), Strict(), true)`,
* - `relOpWithSwapAndNegate(rel, x, 5, Greater(), Nonstrict(), false)` and
* - `relOpWithSwapAndNegate(rel, 5, x, Lesser(), Nonstrict(), false)` hold.
*/
predicate relOpWithSwapAndNegate(
RelationalOperation rel, Expr a, Expr b, RelationDirection dir, RelationStrictness strict,

View File

@@ -93,31 +93,42 @@ private float wideningUpperBounds(ArithmeticType t) {
result = 1.0 / 0.0 // +Inf
}
/** Gets the widened lower bound for a given type and lower bound. */
bindingset[type, lb]
float widenLowerBound(Type type, float lb) {
result = max(float widenLB | widenLB = wideningLowerBounds(type) and widenLB <= lb | widenLB)
}
/** Gets the widened upper bound for a given type and upper bound. */
bindingset[type, ub]
float widenUpperBound(Type type, float ub) {
result = min(float widenUB | widenUB = wideningUpperBounds(type) and widenUB >= ub | widenUB)
}
/**
* Gets the value of the expression `e`, if it is a constant.
* This predicate also handles the case of constant variables initialized in different
* compilation units, which doesn't necessarily have a getValue() result from the extractor.
*/
private string getValue(Expr e) {
if exists(e.getValue())
then result = e.getValue()
else
/*
* It should be safe to propagate the initialization value to a variable if:
* The type of v is const, and
* The type of v is not volatile, and
* Either:
* v is a local/global variable, or
* v is a static member variable
*/
result = e.getValue()
or
not exists(e.getValue()) and
/*
* It should be safe to propagate the initialization value to a variable if:
* The type of v is const, and
* The type of v is not volatile, and
* Either:
* v is a local/global variable, or
* v is a static member variable
*/
exists(VariableAccess access, StaticStorageDurationVariable v |
not v.getUnderlyingType().isVolatile() and
v.getUnderlyingType().isConst() and
e = access and
v = access.getTarget() and
result = getValue(v.getAnAssignedValue())
)
exists(StaticStorageDurationVariable v |
not v.getUnderlyingType().isVolatile() and
v.getUnderlyingType().isConst() and
v = e.(VariableAccess).getTarget() and
result = getValue(v.getAnAssignedValue())
)
}
/**
@@ -505,6 +516,328 @@ private predicate isRecursiveExpr(Expr e) {
)
}
/**
* Provides predicates that estimate the number of bounds that the range
* analysis might produce.
*/
private module BoundsEstimate {
/**
* Gets the limit beyond which we enable widening. That is, if the estimated
* number of bounds exceeds this limit, we enable widening such that the limit
* will not be reached.
*/
float getBoundsLimit() {
// This limit is arbitrary, but low enough that it prevents timeouts on
// specific observed customer databases (and the in the tests).
result = 2.0.pow(40)
}
/** Gets the maximum number of bounds possible for `t` when widening is used. */
private int getNrOfWideningBounds(ArithmeticType t) {
result = strictcount(wideningLowerBounds(t)).maximum(strictcount(wideningUpperBounds(t)))
}
/**
* Holds if `boundFromGuard(guard, v, _, branch)` holds, but without
* relying on range analysis (which would cause non-monotonic recursion
* elsewhere).
*/
private predicate hasBoundFromGuard(Expr guard, VariableAccess v, boolean branch) {
exists(Expr lhs | linearAccess(lhs, v, _, _) |
relOpWithSwapAndNegate(guard, lhs, _, _, _, branch)
or
eqOpWithSwapAndNegate(guard, lhs, _, true, branch)
or
eqZeroWithNegate(guard, lhs, true, branch)
)
}
/** Holds if `def` is a guard phi node for `v` with a bound from a guard. */
predicate isGuardPhiWithBound(RangeSsaDefinition def, StackVariable v, VariableAccess access) {
exists(Expr guard, boolean branch |
def.isGuardPhi(v, access, guard, branch) and
hasBoundFromGuard(guard, access, branch)
)
}
/**
* Gets the number of bounds for `def` when `def` is a guard phi node for the
* variable `v`.
*/
language[monotonicAggregates]
private float nrOfBoundsPhiGuard(RangeSsaDefinition def, StackVariable v) {
// If we have
//
// if (x < c) { e1 }
// e2
//
// then `e2` is both a guard phi node (guarded by `x < c`) and a normal
// phi node (control is merged after the `if` statement).
//
// Assume `x` has `n` bounds. Then `n` bounds are propagated to the guard
// phi node `{ e1 }` and, since `{ e1 }` is input to `e2` as a normal phi
// node, `n` bounds are propagated to `e2`. If we also propagate the `n`
// bounds to `e2` as a guard phi node, then we square the number of
// bounds.
//
// However in practice `x < c` is going to cut down the number of bounds:
// The tracked bounds can't flow to both branches as that would require
// them to simultaneously be greater and smaller than `c`. To approximate
// this better, the contribution from a guard phi node that is also a
// normal phi node is 1.
exists(def.getAPhiInput(v)) and
isGuardPhiWithBound(def, v, _) and
result = 1
or
not exists(def.getAPhiInput(v)) and
// If there's different `access`es, then they refer to the same variable
// with the same lower bounds. Hence adding these guards make no sense (the
// implementation will take the union but they'll be removed by
// deduplication). Hence we use `max` as an approximation.
result =
max(VariableAccess access | isGuardPhiWithBound(def, v, access) | nrOfBoundsExpr(access))
or
def.isPhiNode(v) and
not isGuardPhiWithBound(def, v, _) and
result = 0
}
/**
* Gets the number of bounds for `def` when `def` is a normal phi node for the
* variable `v`.
*/
language[monotonicAggregates]
private float nrOfBoundsPhiNormal(RangeSsaDefinition def, StackVariable v) {
result =
strictsum(RangeSsaDefinition inputDef |
inputDef = def.getAPhiInput(v)
|
nrOfBoundsDef(inputDef, v)
)
or
def.isPhiNode(v) and
not exists(def.getAPhiInput(v)) and
result = 0
}
/**
* Gets the number of bounds for `def` when `def` is an NE phi node for the
* variable `v`.
*/
private float nrOfBoundsNEPhi(RangeSsaDefinition def, StackVariable v) {
exists(VariableAccess access | isNEPhi(v, def, access, _) and result = nrOfBoundsExpr(access))
or
def.isPhiNode(v) and
not isNEPhi(v, def, _, _) and
result = 0
}
/**
* Gets the number of bounds for `def` when `def` is an unsupported guard phi
* node for the variable `v`.
*/
private float nrOfBoundsUnsupportedGuardPhi(RangeSsaDefinition def, StackVariable v) {
exists(VariableAccess access |
isUnsupportedGuardPhi(v, def, access) and
result = nrOfBoundsExpr(access)
)
or
def.isPhiNode(v) and
not isUnsupportedGuardPhi(v, def, _) and
result = 0
}
private float nrOfBoundsPhi(RangeSsaDefinition def, StackVariable v) {
// The cases for phi nodes are not mutually exclusive. For instance a phi
// node can be both a guard phi node and a normal phi node. To handle this
// we sum the contributions from the different cases.
result =
nrOfBoundsPhiGuard(def, v) + nrOfBoundsPhiNormal(def, v) + nrOfBoundsNEPhi(def, v) +
nrOfBoundsUnsupportedGuardPhi(def, v)
}
/** Gets the estimated number of bounds for `def` and `v`. */
float nrOfBoundsDef(RangeSsaDefinition def, StackVariable v) {
// Recursive definitions are already widened, so we simply estimate them as
// having the number of widening bounds available. This is crucial as it
// ensures that we don't follow recursive cycles when calculating the
// estimate. Had that not been the case the estimate itself would be at risk
// of causing performance issues and being non-functional.
if isRecursiveDef(def, v)
then result = getNrOfWideningBounds(getVariableRangeType(v))
else (
// Definitions with a defining value
exists(Expr defExpr | assignmentDef(def, v, defExpr) and result = nrOfBoundsExpr(defExpr))
or
// Assignment operations with a defining value
exists(AssignOperation assignOp |
def = assignOp and
assignOp.getLValue() = v.getAnAccess() and
result = nrOfBoundsExpr(assignOp)
)
or
// Phi nodes
result = nrOfBoundsPhi(def, v)
or
unanalyzableDefBounds(def, v, _, _) and result = 1
)
}
/**
* Gets a naive estimate of the number of bounds for `e`.
*
* The estimate is like an abstract interpretation of the range analysis,
* where the abstract value is the number of bounds. For instance,
* `nrOfBoundsExpr(12) = 1` and `nrOfBoundsExpr(x + y) = nrOfBoundsExpr(x) *
* nrOfBoundsExpr(y)`.
*
* The estimated number of bounds will usually be greater than the actual
* number of bounds, as the estimate can not detect cases where bounds are cut
* down when tracked precisely. For instance, in
* ```c
* int x = 1;
* if (cond) { x = 1; }
* int y = x + x;
* ```
* the actual number of bounds for `y` is 1. However, the estimate will be 4
* as the conditional assignment to `x` gives two bounds for `x` on the last
* line and the addition gives 2 * 2 bounds. There are two sources of anncuracies:
*
* 1. Without tracking the lower bounds we can't see that `x` is assigned a
* value that is equal to its lower bound.
* 2. Had the conditional assignment been `x = 2` then the estimate of two
* bounds for `x` would have been correct. However, the estimate of 4 for `y`
* would still be incorrect. Summing the actual bounds `{1,2}` with itself
* gives `{2,3,4}` which is only three bounds. Again, we can't realise this
* without tracking the bounds.
*
* Since these inaccuracies compound the estimated number of bounds can often
* be _much_ greater than the actual number of bounds. Do note though that the
* estimate is not _guaranteed_ to be an upper bound. In some cases the
* approximations might underestimate the number of bounds.
*
* This predicate is functional. This is crucial as:
*
* - It ensures that the computing the estimate itself is fast.
* - Our use of monotonic aggregates assumes functionality.
*
* Any non-functional case should be considered a bug.
*/
float nrOfBoundsExpr(Expr e) {
// Similarly to what we do for definitions, we do not attempt to measure the
// number of bounds for recursive expressions.
if isRecursiveExpr(e)
then result = getNrOfWideningBounds(e.getUnspecifiedType())
else
if analyzableExpr(e)
then
// The cases here are an abstraction of and mirrors the cases inside
// `getLowerBoundsImpl`/`getUpperBoundsImpl`.
result = 1 and exists(getValue(e).toFloat())
or
exists(Expr operand | result = nrOfBoundsExpr(operand) |
effectivelyMultipliesByPositive(e, operand, _)
or
effectivelyMultipliesByNegative(e, operand, _)
)
or
exists(ConditionalExpr condExpr |
e = condExpr and
result = nrOfBoundsExpr(condExpr.getThen()) * nrOfBoundsExpr(condExpr.getElse())
)
or
exists(BinaryOperation binop |
e = binop and
result = nrOfBoundsExpr(binop.getLeftOperand()) * nrOfBoundsExpr(binop.getRightOperand())
|
e instanceof MaxExpr or
e instanceof MinExpr or
e instanceof AddExpr or
e instanceof SubExpr or
e instanceof UnsignedMulExpr or
e instanceof UnsignedBitwiseAndExpr
)
or
exists(AssignExpr assign | e = assign and result = nrOfBoundsExpr(assign.getRValue()))
or
exists(AssignArithmeticOperation assignOp |
e = assignOp and
result = nrOfBoundsExpr(assignOp.getLValue()) * nrOfBoundsExpr(assignOp.getRValue())
|
e instanceof AssignAddExpr or
e instanceof AssignSubExpr or
e instanceof UnsignedAssignMulExpr
)
or
// Handles `AssignMulByPositiveConstantExpr` and `AssignMulByNegativeConstantExpr`
exists(AssignMulByConstantExpr mulExpr |
e = mulExpr and
result = nrOfBoundsExpr(mulExpr.getLValue())
)
or
// Handles the prefix and postfix increment and decrement operators.
exists(CrementOperation crementOp |
e = crementOp and result = nrOfBoundsExpr(crementOp.getOperand())
)
or
exists(RemExpr remExpr | e = remExpr | result = nrOfBoundsExpr(remExpr.getRightOperand()))
or
exists(Conversion convExpr |
e = convExpr and
if convExpr.getUnspecifiedType() instanceof BoolType
then result = 1
else result = nrOfBoundsExpr(convExpr.getExpr())
)
or
exists(RangeSsaDefinition def, StackVariable v |
e = def.getAUse(v) and
result = nrOfBoundsDef(def, v) and
// Avoid returning two numbers when `e` is a use with a constant value.
not exists(getValue(e).toFloat())
)
or
exists(RShiftExpr rsExpr |
e = rsExpr and
exists(getValue(rsExpr.getRightOperand().getFullyConverted()).toInt()) and
result = nrOfBoundsExpr(rsExpr.getLeftOperand())
)
else (
exists(exprMinVal(e)) and result = 1
)
}
}
/**
* Holds if `v` is a variable for which widening should be used, as otherwise a
* very large number of bounds might be generated during the range analysis for
* `v`.
*/
private predicate varHasTooManyBounds(StackVariable v) {
exists(RangeSsaDefinition def |
def.getAVariable() = v and
BoundsEstimate::nrOfBoundsDef(def, v) > BoundsEstimate::getBoundsLimit()
)
}
/**
* Holds if `e` is an expression for which widening should be used, as otherwise
* a very large number of bounds might be generated during the range analysis
* for `e`.
*/
private predicate exprHasTooManyBounds(Expr e) {
BoundsEstimate::nrOfBoundsExpr(e) > BoundsEstimate::getBoundsLimit()
or
// A subexpressions of an expression with too many bounds may itself not have
// to many bounds. For instance, `x + y` can have too many bounds without `x`
// having as well. But in these cases, still want to consider `e` as having
// too many bounds since:
// - The overall result is widened anyway, so widening `e` as well is unlikely
// to cause further precision loss.
// - The number of bounds could be very large but still below the arbitrary
// limit. Hence widening `e` can improve performance.
exists(Expr pe | exprHasTooManyBounds(pe) and e.getParent() = pe)
}
/**
* Holds if `binop` is a binary operation that's likely to be assigned a
* quadratic (or more) number of candidate bounds during the analysis. This can
@@ -655,13 +988,8 @@ private float getTruncatedLowerBounds(Expr expr) {
if exprMinVal(expr) <= newLB and newLB <= exprMaxVal(expr)
then
// Apply widening where we might get a combinatorial explosion.
if isRecursiveBinary(expr)
then
result =
max(float widenLB |
widenLB = wideningLowerBounds(expr.getUnspecifiedType()) and
not widenLB > newLB
)
if isRecursiveBinary(expr) or exprHasTooManyBounds(expr)
then result = widenLowerBound(expr.getUnspecifiedType(), newLB)
else result = newLB
else result = exprMinVal(expr)
) and
@@ -714,13 +1042,8 @@ private float getTruncatedUpperBounds(Expr expr) {
if exprMinVal(expr) <= newUB and newUB <= exprMaxVal(expr)
then
// Apply widening where we might get a combinatorial explosion.
if isRecursiveBinary(expr)
then
result =
min(float widenUB |
widenUB = wideningUpperBounds(expr.getUnspecifiedType()) and
not widenUB < newUB
)
if isRecursiveBinary(expr) or exprHasTooManyBounds(expr)
then result = widenUpperBound(expr.getUnspecifiedType(), newUB)
else result = newUB
else result = exprMaxVal(expr)
)
@@ -890,7 +1213,7 @@ private float getLowerBoundsImpl(Expr expr) {
// equal to `min(-y + 1,y - 1)`.
exists(float childLB |
childLB = getFullyConvertedLowerBounds(remExpr.getAnOperand()) and
not childLB >= 0
childLB < 0
|
result = getFullyConvertedLowerBounds(remExpr.getRightOperand()) - 1
or
@@ -1102,8 +1425,7 @@ private float getUpperBoundsImpl(Expr expr) {
// adding `-rhsLB` to the set of upper bounds.
exists(float rhsLB |
rhsLB = getFullyConvertedLowerBounds(remExpr.getRightOperand()) and
not rhsLB >= 0
|
rhsLB < 0 and
result = -rhsLB + 1
)
)
@@ -1248,8 +1570,7 @@ private float getPhiLowerBounds(StackVariable v, RangeSsaDefinition phi) {
exists(VariableAccess access, Expr guard, boolean branch, float defLB, float guardLB |
phi.isGuardPhi(v, access, guard, branch) and
lowerBoundFromGuard(guard, access, guardLB, branch) and
defLB = getFullyConvertedLowerBounds(access)
|
defLB = getFullyConvertedLowerBounds(access) and
// Compute the maximum of `guardLB` and `defLB`.
if guardLB > defLB then result = guardLB else result = defLB
)
@@ -1273,8 +1594,7 @@ private float getPhiUpperBounds(StackVariable v, RangeSsaDefinition phi) {
exists(VariableAccess access, Expr guard, boolean branch, float defUB, float guardUB |
phi.isGuardPhi(v, access, guard, branch) and
upperBoundFromGuard(guard, access, guardUB, branch) and
defUB = getFullyConvertedUpperBounds(access)
|
defUB = getFullyConvertedUpperBounds(access) and
// Compute the minimum of `guardUB` and `defUB`.
if guardUB < defUB then result = guardUB else result = defUB
)
@@ -1438,8 +1758,7 @@ private predicate upperBoundFromGuard(Expr guard, VariableAccess v, float ub, bo
}
/**
* This predicate simplifies the results returned by
* `linearBoundFromGuard`.
* This predicate simplifies the results returned by `linearBoundFromGuard`.
*/
private predicate boundFromGuard(
Expr guard, VariableAccess v, float boundValue, boolean isLowerBound,
@@ -1447,22 +1766,10 @@ private predicate boundFromGuard(
) {
exists(float p, float q, float r, boolean isLB |
linearBoundFromGuard(guard, v, p, q, r, isLB, strictness, branch) and
boundValue = (r - q) / p
|
boundValue = (r - q) / p and
// If the multiplier is negative then the direction of the comparison
// needs to be flipped.
p > 0 and isLowerBound = isLB
or
p < 0 and isLowerBound = isLB.booleanNot()
)
or
// When `!e` is true, we know that `0 <= e <= 0`
exists(float p, float q, Expr e |
linearAccess(e, v, p, q) and
eqZeroWithNegate(guard, e, true, branch) and
boundValue = (0.0 - q) / p and
isLowerBound = [false, true] and
strictness = Nonstrict()
if p < 0 then isLowerBound = isLB.booleanNot() else isLowerBound = isLB
)
}
@@ -1472,54 +1779,57 @@ private predicate boundFromGuard(
* lower or upper bound for `v`.
*/
private predicate linearBoundFromGuard(
ComparisonOperation guard, VariableAccess v, float p, float q, float boundValue,
Expr guard, VariableAccess v, float p, float q, float r,
boolean isLowerBound, // Is this a lower or an upper bound?
RelationStrictness strictness, boolean branch // Which control-flow branch is this bound valid on?
) {
// For the comparison x < RHS, we create two bounds:
//
// 1. x < upperbound(RHS)
// 2. x >= typeLowerBound(RHS.getUnspecifiedType())
//
exists(Expr lhs, Expr rhs, RelationDirection dir, RelationStrictness st |
linearAccess(lhs, v, p, q) and
relOpWithSwapAndNegate(guard, lhs, rhs, dir, st, branch)
|
isLowerBound = directionIsGreater(dir) and
strictness = st and
getBounds(rhs, boundValue, isLowerBound)
exists(Expr lhs | linearAccess(lhs, v, p, q) |
// For the comparison x < RHS, we create the following bounds:
// 1. x < upperbound(RHS)
// 2. x >= typeLowerBound(RHS.getUnspecifiedType())
exists(Expr rhs, RelationDirection dir, RelationStrictness st |
relOpWithSwapAndNegate(guard, lhs, rhs, dir, st, branch)
|
isLowerBound = directionIsGreater(dir) and
strictness = st and
r = getBounds(rhs, isLowerBound)
or
isLowerBound = directionIsLesser(dir) and
strictness = Nonstrict() and
r = getExprTypeBounds(rhs, isLowerBound)
)
or
isLowerBound = directionIsLesser(dir) and
strictness = Nonstrict() and
exprTypeBounds(rhs, boundValue, isLowerBound)
)
or
// For x == RHS, we create the following bounds:
//
// 1. x <= upperbound(RHS)
// 2. x >= lowerbound(RHS)
//
exists(Expr lhs, Expr rhs |
linearAccess(lhs, v, p, q) and
eqOpWithSwapAndNegate(guard, lhs, rhs, true, branch) and
getBounds(rhs, boundValue, isLowerBound) and
// For x == RHS, we create the following bounds:
// 1. x <= upperbound(RHS)
// 2. x >= lowerbound(RHS)
exists(Expr rhs |
eqOpWithSwapAndNegate(guard, lhs, rhs, true, branch) and
r = getBounds(rhs, isLowerBound) and
strictness = Nonstrict()
)
or
// When `x` is equal to 0 we create the following bounds:
// 1. x <= 0
// 2. x >= 0
eqZeroWithNegate(guard, lhs, true, branch) and
r = 0.0 and
isLowerBound = [false, true] and
strictness = Nonstrict()
)
// x != RHS and !x are handled elsewhere
}
/** Get the fully converted lower or upper bounds of `expr` based on `isLowerBound`. */
private float getBounds(Expr expr, boolean isLowerBound) {
isLowerBound = true and result = getFullyConvertedLowerBounds(expr)
or
isLowerBound = false and result = getFullyConvertedUpperBounds(expr)
}
/** Utility for `linearBoundFromGuard`. */
private predicate getBounds(Expr expr, float boundValue, boolean isLowerBound) {
isLowerBound = true and boundValue = getFullyConvertedLowerBounds(expr)
private float getExprTypeBounds(Expr expr, boolean isLowerBound) {
isLowerBound = true and result = exprMinVal(expr.getFullyConverted())
or
isLowerBound = false and boundValue = getFullyConvertedUpperBounds(expr)
}
/** Utility for `linearBoundFromGuard`. */
private predicate exprTypeBounds(Expr expr, float boundValue, boolean isLowerBound) {
isLowerBound = true and boundValue = exprMinVal(expr.getFullyConverted())
or
isLowerBound = false and boundValue = exprMaxVal(expr.getFullyConverted())
isLowerBound = false and result = exprMaxVal(expr.getFullyConverted())
}
/**
@@ -1810,18 +2120,12 @@ module SimpleRangeAnalysisInternal {
|
// Widening: check whether the new lower bound is from a source which
// depends recursively on the current definition.
if isRecursiveDef(def, v)
if isRecursiveDef(def, v) or varHasTooManyBounds(v)
then
// The new lower bound is from a recursive source, so we round
// down to one of a limited set of values to prevent the
// recursion from exploding.
result =
max(float widenLB |
widenLB = wideningLowerBounds(getVariableRangeType(v)) and
not widenLB > truncatedLB
|
widenLB
)
result = widenLowerBound(getVariableRangeType(v), truncatedLB)
else result = truncatedLB
)
or
@@ -1840,18 +2144,12 @@ module SimpleRangeAnalysisInternal {
|
// Widening: check whether the new upper bound is from a source which
// depends recursively on the current definition.
if isRecursiveDef(def, v)
if isRecursiveDef(def, v) or varHasTooManyBounds(v)
then
// The new upper bound is from a recursive source, so we round
// up to one of a fixed set of values to prevent the recursion
// from exploding.
result =
min(float widenUB |
widenUB = wideningUpperBounds(getVariableRangeType(v)) and
not widenUB < truncatedUB
|
widenUB
)
result = widenUpperBound(getVariableRangeType(v), truncatedUB)
else result = truncatedUB
)
or
@@ -1859,4 +2157,60 @@ module SimpleRangeAnalysisInternal {
// bound is `typeUpperBound`.
defMightOverflowNegatively(def, v) and result = varMaxVal(v)
}
/** Gets the estimate of the number of bounds for `e`. */
float estimateNrOfBounds(Expr e) { result = BoundsEstimate::nrOfBoundsExpr(e) }
}
/** Provides predicates for debugging the simple range analysis library. */
private module Debug {
Locatable getRelevantLocatable() {
exists(string filepath, int startline |
result.getLocation().hasLocationInfo(filepath, startline, _, _, _) and
filepath.matches("%/test.c") and
startline = [621 .. 639]
)
}
float debugGetLowerBoundsImpl(Expr e) {
e = getRelevantLocatable() and
result = getLowerBoundsImpl(e)
}
float debugGetUpperBoundsImpl(Expr e) {
e = getRelevantLocatable() and
result = getUpperBoundsImpl(e)
}
/**
* Counts the number of lower bounds for a given expression. This predicate is
* useful for identifying performance issues in the range analysis.
*/
predicate countGetLowerBoundsImpl(Expr e, int n) {
e = getRelevantLocatable() and
n = strictcount(float lb | lb = getLowerBoundsImpl(e) | lb)
}
float debugNrOfBounds(Expr e) {
e = getRelevantLocatable() and
result = BoundsEstimate::nrOfBoundsExpr(e)
}
/**
* Finds any expressions for which `nrOfBounds` is not functional. The result
* should be empty, so this predicate is useful to debug non-functional cases.
*/
int nonFunctionalNrOfBounds(Expr e) {
strictcount(BoundsEstimate::nrOfBoundsExpr(e)) > 1 and
result = BoundsEstimate::nrOfBoundsExpr(e)
}
/**
* Holds if `e` is an expression that has a lower bound, but where
* `nrOfBounds` does not compute an estimate.
*/
predicate missingNrOfBounds(Expr e, float n) {
n = lowerBound(e) and
not exists(BoundsEstimate::nrOfBoundsExpr(e))
}
}

View File

@@ -259,7 +259,7 @@ module SemanticExprConfig {
}
predicate guardHasBranchEdge(Guard guard, BasicBlock bb1, BasicBlock bb2, boolean branch) {
guard.controlsEdge(bb1, bb2, branch)
guard.controlsBranchEdge(bb1, bb2, branch)
}
Guard comparisonGuard(Expr e) { getSemanticExpr(result) = e }

View File

@@ -1,3 +1,23 @@
## 1.5.2
No user-facing changes.
## 1.5.1
No user-facing changes.
## 1.5.0
### Major Analysis Improvements
* The queries `cpp/wrong-type-format-argument`, `cpp/comparison-with-wider-type`, `cpp/integer-multiplication-cast-to-long`, `cpp/implicit-function-declaration` and `cpp/suspicious-add-sizeof` have had their precisions reduced from `high` to `medium`. They will also now give alerts for projects built with `build-mode: none`.
* The queries `cpp/wrong-type-format-argument`, `cpp/comparison-with-wider-type`, `cpp/integer-multiplication-cast-to-long` and `cpp/suspicious-add-sizeof` are no longer included in the `code-scanning` suite.
### Bug Fixes
* The predicate `occurenceCount` in the file module `MagicConstants` has been deprecated. Use `occurrenceCount` instead.
* The predicate `additionalAdditionOrSubstractionCheckForLeapYear` in the file module `LeapYear` has been deprecated. Use `additionalAdditionOrSubtractionCheckForLeapYear` instead.
## 1.4.7
### Bug Fixes

View File

@@ -85,10 +85,8 @@ module OverflowDestinationConfig implements DataFlow::ConfigSig {
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSourceLocation(DataFlow::Node source) { none() }
Location getASelectedSinkLocation(DataFlow::Node sink) {
exists(FunctionCall fc | result = fc.getLocation() |
exists(FunctionCall fc | result = [fc.getLocation(), sink.getLocation()] |
sourceSized(fc, sink.asIndirectConvertedExpr())
)
}

View File

@@ -4,13 +4,9 @@ private import semmle.code.cpp.controlflow.IRGuards
private import semmle.code.cpp.ir.ValueNumbering
private predicate exprInBooleanContext(Expr e) {
exists(IRGuardCondition gc |
exists(Instruction i |
i.getUnconvertedResultExpression() = e and
gc.comparesEq(valueNumber(i).getAUse(), 0, _, _)
)
or
gc.getUnconvertedResultExpression() = e
exists(IRGuardCondition gc, Instruction i |
i.getUnconvertedResultExpression() = e and
gc.comparesEq(valueNumber(i).getAUse(), 0, _, _)
)
}
@@ -36,20 +32,18 @@ private string getEofValue() {
* Holds if the value of `call` has been checked to not equal `EOF`.
*/
private predicate checkedForEof(ScanfFunctionCall call) {
exists(IRGuardCondition gc |
exists(CallInstruction i | i.getUnconvertedResultExpression() = call |
exists(int val | gc.comparesEq(valueNumber(i).getAUse(), val, _, _) |
// call == EOF
val = getEofValue().toInt()
or
// call == [any positive number]
val > 0
)
exists(IRGuardCondition gc, CallInstruction i | i.getUnconvertedResultExpression() = call |
exists(int val | gc.comparesEq(valueNumber(i).getAUse(), val, _, _) |
// call == EOF
val = getEofValue().toInt()
or
exists(int val | gc.comparesLt(valueNumber(i).getAUse(), val, true, _) |
// call < [any non-negative number] (EOF is guaranteed to be negative)
val >= 0
)
// call == [any positive number]
val > 0
)
or
exists(int val | gc.comparesLt(valueNumber(i).getAUse(), val, true, _) |
// call < [any non-negative number] (EOF is guaranteed to be negative)
val >= 0
)
)
}

View File

@@ -5,7 +5,7 @@
* @kind problem
* @problem.severity warning
* @security-severity 8.1
* @precision high
* @precision medium
* @id cpp/integer-multiplication-cast-to-long
* @tags reliability
* security
@@ -179,7 +179,6 @@ predicate overflows(MulExpr me, Type t) {
from MulExpr me, Type t1, Type t2
where
not any(Compilation c).buildModeNone() and
t1 = me.getType().getUnderlyingType() and
t2 = me.getConversion().getType().getUnderlyingType() and
t1.getSize() < t2.getSize() and

View File

@@ -171,12 +171,10 @@ module NonConstFlowConfig implements DataFlow::ConfigSig {
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSourceLocation(DataFlow::Node source) { none() }
Location getASelectedSinkLocation(DataFlow::Node sink) {
result = sink.getLocation()
or
exists(FormattingFunctionCall call, Expr formatString | result = call.getLocation() |
exists(FormattingFunctionCall call, Expr formatString |
result = [call.getLocation(), sink.getLocation()]
|
isSinkImpl(sink, formatString) and
call.getArgument(call.getFormatParameterIndex()) = formatString
)

View File

@@ -5,7 +5,7 @@
* @kind problem
* @problem.severity error
* @security-severity 7.5
* @precision high
* @precision medium
* @id cpp/wrong-type-format-argument
* @tags reliability
* correctness
@@ -154,7 +154,6 @@ int sizeof_IntType() { exists(IntType it | result = it.getSize()) }
from FormattingFunctionCall ffc, int n, Expr arg, Type expected, Type actual
where
not any(Compilation c).buildModeNone() and
(
formattingFunctionCallExpectedType(ffc, n, expected) and
formattingFunctionCallActualType(ffc, n, arg, actual) and

View File

@@ -136,7 +136,7 @@ private module NetworkToBufferSizeConfig implements DataFlow::ConfigSig {
predicate isBarrier(DataFlow::Node node) {
exists(GuardCondition gc, GVN gvn |
gc.getAChild*() = gvn.getAnExpr() and
gc.(Expr).getAChild*() = gvn.getAnExpr() and
globalValueNumber(node.asExpr()) = gvn and
gc.controls(node.asExpr().getBasicBlock(), _)
)

View File

@@ -5,7 +5,7 @@
* may lead to unpredictable behavior.
* @kind problem
* @problem.severity warning
* @precision high
* @precision medium
* @id cpp/implicit-function-declaration
* @tags correctness
* maintainability
@@ -38,7 +38,6 @@ predicate isCompiledAsC(File f) {
from FunctionDeclarationEntry fdeIm, FunctionCall fc
where
not any(Compilation c).buildModeNone() and
isCompiledAsC(fdeIm.getFile()) and
not isFromMacroDefinition(fc) and
fdeIm.isImplicit() and

View File

@@ -155,7 +155,7 @@ module ExecTaintConfig implements DataFlow::StateConfigSig {
Location getASelectedSinkLocation(DataFlow::Node sink) {
exists(DataFlow::Node concatResult, Expr command, ExecState state |
result = [concatResult.getLocation(), command.getLocation()] and
result = [concatResult.getLocation(), command.getLocation(), sink.getLocation()] and
isSink(sink, state) and
isSinkImpl(sink, command, _) and
concatResult = state.getOutgoingNode()

Some files were not shown because too many files have changed in this diff Show More