Skip to content

Commit dc0be20

Browse files
authored
Merge pull request #22257 from MathiasVP/add-more-com-api-models
C++: Add more registry flow sources and `COM`-related flow summaries
2 parents ddb7e3f + a7c1978 commit dc0be20

6 files changed

Lines changed: 418 additions & 156 deletions

File tree

cpp/ql/lib/ext/Windows.model.yml

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,16 +35,18 @@ extensions:
3535
- ["", "", False, "HttpReceiveRequestEntityBody", "", "", "Argument[*3]", "remote", "manual"]
3636
- ["", "", False, "HttpReceiveClientCertificate", "", "", "Argument[*3]", "remote", "manual"]
3737
# winreg.h
38-
- ["", "", False, "RegQueryValueA", "", "", "Argument[*2]", "local", "manual"]
39-
- ["", "", False, "RegQueryValueExA", "", "", "Argument[*4]", "local", "manual"]
40-
- ["", "", False, "RegQueryValueW", "", "", "Argument[*2]", "local", "manual"]
41-
- ["", "", False, "RegQueryValueExW", "", "", "Argument[*4]", "local", "manual"]
42-
- ["", "", False, "RegGetValueA", "", "", "Argument[*5]", "local", "manual"]
43-
- ["", "", False, "RegGetValueW", "", "", "Argument[*5]", "local", "manual"]
38+
- ["", "", False, "RegQueryValueA", "", "", "Argument[*2]", "windows-registry", "manual"]
39+
- ["", "", False, "RegQueryValueExA", "", "", "Argument[*4]", "windows-registry", "manual"]
40+
- ["", "", False, "RegQueryValueW", "", "", "Argument[*2]", "windows-registry", "manual"]
41+
- ["", "", False, "RegQueryValueExW", "", "", "Argument[*4]", "windows-registry", "manual"]
42+
- ["", "", False, "RegGetValueA", "", "", "Argument[*5]", "windows-registry", "manual"]
43+
- ["", "", False, "RegGetValueW", "", "", "Argument[*5]", "windows-registry", "manual"]
4444
# TODO: Once we support access paths at sources we should also mark Argument[*1].Field[*ve_valueptr]
45-
- ["", "", False, "RegQueryMultipleValuesA", "", "", "Argument[*3]", "local", "manual"]
45+
- ["", "", False, "RegQueryMultipleValuesA", "", "", "Argument[*3]", "windows-registry", "manual"]
4646
# TODO: Once we support access paths at sources we should also mark Argument[*1].Field[*ve_valueptr]
47-
- ["", "", False, "RegQueryMultipleValuesW", "", "", "Argument[*3]", "local", "manual"]
47+
- ["", "", False, "RegQueryMultipleValuesW", "", "", "Argument[*3]", "windows-registry", "manual"]
48+
- ["", "", False, "RegEnumValueA", "", "", "Argument[*2,*6]", "windows-registry", "manual"]
49+
- ["", "", False, "RegEnumValueW", "", "", "Argument[*2,*6]", "windows-registry", "manual"]
4850
- addsTo:
4951
pack: codeql/cpp-all
5052
extensible: summaryModel
@@ -69,4 +71,13 @@ extensions:
6971
# winternl.h
7072
- ["", "", False, "RtlInitUnicodeString", "", "", "Argument[*1]", "Argument[*0].Field[*Buffer]", "value", "manual"]
7173
# winhttp.h
72-
- ["", "", False, "WinHttpCrackUrl", "", "", "Argument[*0]", "Argument[*3]", "taint", "manual"]
74+
- ["", "", False, "WinHttpCrackUrl", "", "", "Argument[*0]", "Argument[*3]", "taint", "manual"]
75+
# combaseapi.h
76+
- ["", "", False, "IIDFromString", "", "", "Argument[*0]", "Argument[*1]", "taint", "manual"]
77+
- ["", "", False, "StringFromIID", "", "", "Argument[*0]", "Argument[**1]", "taint", "manual"]
78+
- ["", "", False, "ProgIDFromCLSID", "", "", "Argument[*0]", "Argument[**1]", "taint", "manual"]
79+
- ["", "", False, "CLSIDFromProgID", "", "", "Argument[*0]", "Argument[*1]", "taint", "manual"]
80+
- ["", "", False, "CLSIDFromString", "", "", "Argument[*0]", "Argument[*1]", "taint", "manual"]
81+
- ["", "", False, "StringFromCLSID", "", "", "Argument[*0]", "Argument[**1]", "taint", "manual"]
82+
- ["", "", False, "GUIDFromString", "", "", "Argument[*0]", "Argument[*1]", "taint", "manual"]
83+
- ["", "", False, "StringFromGUID2", "", "", "Argument[*0]", "Argument[*1]", "taint", "manual"]

cpp/ql/lib/semmle/code/cpp/security/FlowSources.qll

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ abstract class RemoteFlowSource extends FlowSource { }
2020
/** A data flow source of local user input. */
2121
abstract class LocalFlowSource extends FlowSource { }
2222

23+
/** A data flow source that represents the access of a value from the Windows registry. */
24+
abstract class WindowsRegistrySource extends LocalFlowSource { }
25+
2326
/**
2427
* A remote data flow source that is defined through a `RemoteFlowSourceFunction` model.
2528
*/
@@ -101,6 +104,12 @@ private class ExternalLocalFlowSource extends LocalFlowSource {
101104
override string getSourceType() { result = "external" }
102105
}
103106

107+
private class ExternalWindowsRegistrySource extends WindowsRegistrySource {
108+
ExternalWindowsRegistrySource() { sourceNode(this, "windows-registry") }
109+
110+
override string getSourceType() { result = "a value from the Windows registry" }
111+
}
112+
104113
/** A remote data flow sink. */
105114
abstract class RemoteFlowSink extends DataFlow::Node {
106115
/** Gets a string that describes the type of this flow sink. */

0 commit comments

Comments
 (0)