1
1
import swift
2
+ private import codeql.swift.dataflow.DataFlow
2
3
private import codeql.swift.dataflow.ExternalFlow
4
+ private import codeql.swift.dataflow.FlowSteps
5
+
6
+ /** The struct `URL`. */
7
+ class UrlDecl extends StructDecl {
8
+ UrlDecl ( ) { this .getFullName ( ) = "URL" }
9
+ }
10
+
11
+ /**
12
+ * A content implying that, if a `URL` is tainted, then all its fields are tainted.
13
+ */
14
+ private class UriFieldsInheritTaint extends TaintInheritingContent , DataFlow:: Content:: FieldContent {
15
+ UriFieldsInheritTaint ( ) { this .getField ( ) .getEnclosingDecl ( ) instanceof UrlDecl }
16
+ }
3
17
4
18
/**
5
19
* A model for `URL` members that are sources of remote flow.
@@ -22,53 +36,7 @@ private class UrlSummaries extends SummaryModelCsv {
22
36
row =
23
37
[
24
38
";URL;true;init(string:);(String);;Argument[0];ReturnValue;taint" ,
25
- ";URL;true;init(string:relativeTo:);(String,URL?);;Argument[0,1];ReturnValue;taint" ,
26
- // The base string taints all the URL fields (except baseURL)
27
- ";URL;true;init(string:);(String);;Argument[0];ReturnValue.Field[absoluteURL];taint" ,
28
- ";URL;true;init(string:);(String);;Argument[0];ReturnValue.Field[fragment];taint" ,
29
- ";URL;true;init(string:);(String);;Argument[0];ReturnValue.Field[host];taint" ,
30
- ";URL;true;init(string:);(String);;Argument[0];ReturnValue.Field[lastPathComponent];taint" ,
31
- ";URL;true;init(string:);(String);;Argument[0];ReturnValue.Field[path];taint" ,
32
- ";URL;true;init(string:);(String);;Argument[0];ReturnValue.Field[pathComponents];taint" ,
33
- ";URL;true;init(string:);(String);;Argument[0];ReturnValue.Field[pathExtension];taint" ,
34
- ";URL;true;init(string:);(String);;Argument[0];ReturnValue.Field[port];taint" ,
35
- ";URL;true;init(string:);(String);;Argument[0];ReturnValue.Field[query];taint" ,
36
- ";URL;true;init(string:);(String);;Argument[0];ReturnValue.Field[relativePath];taint" ,
37
- ";URL;true;init(string:);(String);;Argument[0];ReturnValue.Field[relativeString];taint" ,
38
- ";URL;true;init(string:);(String);;Argument[0];ReturnValue.Field[scheme];taint" ,
39
- ";URL;true;init(string:);(String);;Argument[0];ReturnValue.Field[standardized];taint" ,
40
- ";URL;true;init(string:);(String);;Argument[0];ReturnValue.Field[standardizedFileURL];taint" ,
41
- ";URL;true;init(string:);(String);;Argument[0];ReturnValue.Field[user];taint" ,
42
- ";URL;true;init(string:);(String);;Argument[0];ReturnValue.Field[password];taint" ,
43
- // The base string taints all the URL fields (except baseURL) if it's an absolute URL when relativeTo is used
44
- ";URL;true;init(string:relativeTo:);(String,URL?);;Argument[0];ReturnValue.Field[absoluteURL];taint" ,
45
- ";URL;true;init(string:relativeTo:);(String,URL?);;Argument[0];ReturnValue.Field[fragment];taint" ,
46
- ";URL;true;init(string:relativeTo:);(String,URL?);;Argument[0];ReturnValue.Field[host];taint" ,
47
- ";URL;true;init(string:relativeTo:);(String,URL?);;Argument[0];ReturnValue.Field[lastPathComponent];taint" ,
48
- ";URL;true;init(string:relativeTo:);(String,URL?);;Argument[0];ReturnValue.Field[path];taint" ,
49
- ";URL;true;init(string:relativeTo:);(String,URL?);;Argument[0];ReturnValue.Field[pathComponents];taint" ,
50
- ";URL;true;init(string:relativeTo:);(String,URL?);;Argument[0];ReturnValue.Field[pathExtension];taint" ,
51
- ";URL;true;init(string:relativeTo:);(String,URL?);;Argument[0];ReturnValue.Field[port];taint" ,
52
- ";URL;true;init(string:relativeTo:);(String,URL?);;Argument[0];ReturnValue.Field[query];taint" ,
53
- ";URL;true;init(string:relativeTo:);(String,URL?);;Argument[0];ReturnValue.Field[relativePath];taint" ,
54
- ";URL;true;init(string:relativeTo:);(String,URL?);;Argument[0];ReturnValue.Field[relativeString];taint" ,
55
- ";URL;true;init(string:relativeTo:);(String,URL?);;Argument[0];ReturnValue.Field[scheme];taint" ,
56
- // Not mapping precise field taint to standardized/standardizedFileURL even if the return values are URLs too
57
- ";URL;true;init(string:relativeTo:);(String,URL?);;Argument[0];ReturnValue.Field[standardized];taint" ,
58
- ";URL;true;init(string:relativeTo:);(String,URL?);;Argument[0];ReturnValue.Field[standardizedFileURL];taint" ,
59
- ";URL;true;init(string:relativeTo:);(String,URL?);;Argument[0];ReturnValue.Field[user];taint" ,
60
- ";URL;true;init(string:relativeTo:);(String,URL?);;Argument[0];ReturnValue.Field[password];taint" ,
61
- // The relativeTo URL taints fields not related to the path, query or fragment if the base string is a relative path
62
- ";URL;true;init(string:relativeTo:);(String,URL?);;Argument[1];ReturnValue.Field[absoluteURL];taint" ,
63
- ";URL;true;init(string:relativeTo:);(String,URL?);;Argument[1];ReturnValue.Field[baseURL];taint" ,
64
- ";URL;true;init(string:relativeTo:);(String,URL?);;Argument[1];ReturnValue.Field[host];taint" ,
65
- ";URL;true;init(string:relativeTo:);(String,URL?);;Argument[1];ReturnValue.Field[port];taint" ,
66
- ";URL;true;init(string:relativeTo:);(String,URL?);;Argument[1];ReturnValue.Field[scheme];taint" ,
67
- // Not mapping precise field taint to standardized/standardizedFileURL even if the return values are URLs too
68
- ";URL;true;init(string:relativeTo:);(String,URL?);;Argument[1];ReturnValue.Field[standardized];taint" ,
69
- ";URL;true;init(string:relativeTo:);(String,URL?);;Argument[1];ReturnValue.Field[standardizedFileURL];taint" ,
70
- ";URL;true;init(string:relativeTo:);(String,URL?);;Argument[1];ReturnValue.Field[user];taint" ,
71
- ";URL;true;init(string:relativeTo:);(String,URL?);;Argument[1];ReturnValue.Field[password];taint" ,
39
+ ";URL;true;init(string:relativeTo:);(String,URL?);;Argument[0,1];ReturnValue;taint"
72
40
]
73
41
}
74
42
}
0 commit comments