Skip to content

Commit d7e2fbc

Browse files
committed
Finish
1 parent 9958ad9 commit d7e2fbc

File tree

7 files changed

+222
-151
lines changed

7 files changed

+222
-151
lines changed

go/ql/lib/semmle/go/frameworks/GinCors.qll

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ module GinCors {
2121
/**
2222
* A write to the value of Access-Control-Allow-Credentials header
2323
*/
24-
class AllowCredentialsWrite extends DataFlow::ExprNode {
24+
class AllowCredentialsWrite extends UniversalAllowCredentialsWrite {
2525
DataFlow::Node base;
2626

2727
AllowCredentialsWrite() {
@@ -35,12 +35,12 @@ module GinCors {
3535
/**
3636
* Get config struct holding header values
3737
*/
38-
DataFlow::Node getBase() { result = base }
38+
override DataFlow::Node getBase() { result = base }
3939

4040
/**
4141
* Get config variable holding header values
4242
*/
43-
GinConfig getConfig() {
43+
override GinConfig getConfig() {
4444
exists(GinConfig gc |
4545
(
4646
gc.getV().getBaseVariable().getDefinition().(SsaExplicitDefinition).getRhs() =
@@ -55,7 +55,7 @@ module GinCors {
5555
/**
5656
* A write to the value of Access-Control-Allow-Origins header
5757
*/
58-
class AllowOriginsWrite extends DataFlow::ExprNode {
58+
class AllowOriginsWrite extends UniversalOriginWrite {
5959
DataFlow::Node base;
6060

6161
AllowOriginsWrite() {
@@ -69,12 +69,12 @@ module GinCors {
6969
/**
7070
* Get config struct holding header values
7171
*/
72-
DataFlow::Node getBase() { result = base }
72+
override DataFlow::Node getBase() { result = base }
7373

7474
/**
7575
* Get config variable holding header values
7676
*/
77-
GinConfig getConfig() {
77+
override GinConfig getConfig() {
7878
exists(GinConfig gc |
7979
(
8080
gc.getV().getBaseVariable().getDefinition().(SsaExplicitDefinition).getRhs() =
@@ -89,7 +89,7 @@ module GinCors {
8989
/**
9090
* A write to the value of Access-Control-Allow-Origins of value "*", overriding AllowOrigins
9191
*/
92-
class AllowAllOriginsWrite extends DataFlow::ExprNode {
92+
class AllowAllOriginsWrite extends UniversalAllowAllOriginsWrite {
9393
DataFlow::Node base;
9494

9595
AllowAllOriginsWrite() {
@@ -103,12 +103,12 @@ module GinCors {
103103
/**
104104
* Get config struct holding header values
105105
*/
106-
DataFlow::Node getBase() { result = base }
106+
override DataFlow::Node getBase() { result = base }
107107

108108
/**
109109
* Get config variable holding header values
110110
*/
111-
GinConfig getConfig() {
111+
override GinConfig getConfig() {
112112
exists(GinConfig gc |
113113
(
114114
gc.getV().getBaseVariable().getDefinition().(SsaExplicitDefinition).getRhs() =

go/ql/lib/semmle/go/frameworks/RsCors.qll

Lines changed: 162 additions & 135 deletions
Original file line numberDiff line numberDiff line change
@@ -2,138 +2,165 @@
22
* Provides classes for modeling the `github.com/rs/cors` package.
33
*/
44

5-
import go
6-
7-
/**
8-
* Provides classes for modeling the `github.com/rs/cors` package.
9-
*/
10-
module RsCors {
11-
/** Gets the package name `github.com/gin-gonic/gin`. */
12-
string packagePath() { result = package("github.com/rs/cors", "") }
13-
14-
/**
15-
* A new function create a new gin Handler that passed to gin as middleware
16-
*/
17-
class New extends Function {
18-
New() { exists(Function f | f.hasQualifiedName(packagePath(), "New") | this = f) }
19-
}
20-
21-
/**
22-
* A write to the value of Access-Control-Allow-Credentials header
23-
*/
24-
class AllowCredentialsWrite extends DataFlow::ExprNode {
25-
DataFlow::Node base;
26-
27-
AllowCredentialsWrite() {
28-
exists(Field f, Write w |
29-
f.hasQualifiedName(packagePath(), "Options", "AllowCredentials") and
30-
w.writesField(base, f, this) and
31-
this.getType() instanceof BoolType
32-
)
33-
}
34-
35-
/**
36-
* Get config struct holding header values
37-
*/
38-
DataFlow::Node getBase() { result = base }
39-
40-
/**
41-
* Get config variable holding header values
42-
*/
43-
RsOptions getConfig() {
44-
exists(RsOptions gc |
45-
(
46-
gc.getV().getBaseVariable().getDefinition().(SsaExplicitDefinition).getRhs() =
47-
base.asInstruction() or
48-
gc.getV().getAUse() = base
49-
) and
50-
result = gc
51-
)
52-
}
53-
}
54-
55-
/**
56-
* A write to the value of Access-Control-Allow-Origins header
57-
*/
58-
class AllowOriginsWrite extends DataFlow::ExprNode {
59-
DataFlow::Node base;
60-
61-
AllowOriginsWrite() {
62-
exists(Field f, Write w |
63-
f.hasQualifiedName(packagePath(), "Options", "AllowedOrigins") and
64-
w.writesField(base, f, this) and
65-
this.asExpr() instanceof SliceLit
66-
)
67-
}
68-
69-
/**
70-
* Get config struct holding header values
71-
*/
72-
DataFlow::Node getBase() { result = base }
73-
74-
/**
75-
* Get config variable holding header values
76-
*/
77-
RsOptions getConfig() {
78-
exists(RsOptions gc |
79-
(
80-
gc.getV().getBaseVariable().getDefinition().(SsaExplicitDefinition).getRhs() =
81-
base.asInstruction() or
82-
gc.getV().getAUse() = base
83-
) and
84-
result = gc
85-
)
86-
}
87-
}
88-
89-
/**
90-
* A write to the value of Access-Control-Allow-Origins of value "*", overriding AllowOrigins
91-
*/
92-
class AllowAllOriginsWrite extends DataFlow::ExprNode {
93-
DataFlow::Node base;
94-
95-
AllowAllOriginsWrite() {
96-
exists(Field f, Write w |
97-
f.hasQualifiedName(packagePath(), "Options", "AllowAllOrigins") and
98-
w.writesField(base, f, this) and
99-
this.getType() instanceof BoolType
100-
)
101-
}
102-
103-
/**
104-
* Get config struct holding header values
105-
*/
106-
DataFlow::Node getBase() { result = base }
107-
108-
/**
109-
* Get config variable holding header values
110-
*/
111-
RsOptions getConfig() {
112-
exists(RsOptions gc |
113-
(
114-
gc.getV().getBaseVariable().getDefinition().(SsaExplicitDefinition).getRhs() =
115-
base.asInstruction() or
116-
gc.getV().getAUse() = base
117-
) and
118-
result = gc
119-
)
120-
}
121-
}
122-
123-
/**
124-
* A variable of type Config that holds the headers to be set.
125-
*/
126-
class RsOptions extends Variable {
127-
SsaWithFields v;
128-
129-
RsOptions() {
130-
this = v.getBaseVariable().getSourceVariable() and
131-
exists(Type t | t.hasQualifiedName(packagePath(), "Options") | v.getType() = t)
132-
}
133-
134-
/**
135-
* Get variable declaration of GinConfig
136-
*/
137-
SsaWithFields getV() { result = v }
138-
}
139-
}
5+
import go
6+
7+
/**
8+
* Provides abstract class for modeling the Go CORS handler model origin write.
9+
*/
10+
abstract class UniversalOriginWrite extends DataFlow::ExprNode {
11+
abstract DataFlow::Node getBase();
12+
13+
abstract Variable getConfig();
14+
}
15+
16+
/**
17+
* Provides abstract class for modeling the Go CORS handler model allow all origins write.
18+
*/
19+
abstract class UniversalAllowAllOriginsWrite extends DataFlow::ExprNode {
20+
abstract DataFlow::Node getBase();
21+
22+
abstract Variable getConfig();
23+
}
24+
25+
/**
26+
* Provides abstract class for modeling the Go CORS handler model allow credentials write.
27+
*/
28+
abstract class UniversalAllowCredentialsWrite extends DataFlow::ExprNode {
29+
abstract DataFlow::Node getBase();
30+
31+
abstract Variable getConfig();
32+
}
33+
34+
/**
35+
* Provides classes for modeling the `github.com/rs/cors` package.
36+
*/
37+
module RsCors {
38+
/** Gets the package name `github.com/gin-gonic/gin`. */
39+
string packagePath() { result = package("github.com/rs/cors", "") }
40+
41+
/**
42+
* A new function create a new rs Handler
43+
*/
44+
class New extends Function {
45+
New() { exists(Function f | f.hasQualifiedName(packagePath(), "New") | this = f) }
46+
}
47+
48+
/**
49+
* A write to the value of Access-Control-Allow-Credentials header
50+
*/
51+
class AllowCredentialsWrite extends UniversalAllowCredentialsWrite {
52+
DataFlow::Node base;
53+
54+
AllowCredentialsWrite() {
55+
exists(Field f, Write w |
56+
f.hasQualifiedName(packagePath(), "Options", "AllowCredentials") and
57+
w.writesField(base, f, this) and
58+
this.getType() instanceof BoolType
59+
)
60+
}
61+
62+
/**
63+
* Get options struct holding header values
64+
*/
65+
override DataFlow::Node getBase() { result = base }
66+
67+
/**
68+
* Get options variable holding header values
69+
*/
70+
override RsOptions getConfig() {
71+
exists(RsOptions gc |
72+
(
73+
gc.getV().getBaseVariable().getDefinition().(SsaExplicitDefinition).getRhs() =
74+
base.asInstruction() or
75+
gc.getV().getAUse() = base
76+
) and
77+
result = gc
78+
)
79+
}
80+
}
81+
82+
/**
83+
* A write to the value of Access-Control-Allow-Origins header
84+
*/
85+
class AllowOriginsWrite extends UniversalOriginWrite {
86+
DataFlow::Node base;
87+
88+
AllowOriginsWrite() {
89+
exists(Field f, Write w |
90+
f.hasQualifiedName(packagePath(), "Options", "AllowedOrigins") and
91+
w.writesField(base, f, this) and
92+
this.asExpr() instanceof SliceLit
93+
)
94+
}
95+
96+
/**
97+
* Get options struct holding header values
98+
*/
99+
override DataFlow::Node getBase() { result = base }
100+
101+
/**
102+
* Get options variable holding header values
103+
*/
104+
override RsOptions getConfig() {
105+
exists(RsOptions gc |
106+
(
107+
gc.getV().getBaseVariable().getDefinition().(SsaExplicitDefinition).getRhs() =
108+
base.asInstruction() or
109+
gc.getV().getAUse() = base
110+
) and
111+
result = gc
112+
)
113+
}
114+
}
115+
116+
/**
117+
* A write to the value of Access-Control-Allow-Origins of value "*", overriding AllowOrigins
118+
*/
119+
class AllowAllOriginsWrite extends UniversalAllowAllOriginsWrite {
120+
DataFlow::Node base;
121+
122+
AllowAllOriginsWrite() {
123+
exists(Field f, Write w |
124+
f.hasQualifiedName(packagePath(), "Options", "AllowAllOrigins") and
125+
w.writesField(base, f, this) and
126+
this.getType() instanceof BoolType
127+
)
128+
}
129+
130+
/**
131+
* Get options struct holding header values
132+
*/
133+
override DataFlow::Node getBase() { result = base }
134+
135+
/**
136+
* Get options variable holding header values
137+
*/
138+
override RsOptions getConfig() {
139+
exists(RsOptions gc |
140+
(
141+
gc.getV().getBaseVariable().getDefinition().(SsaExplicitDefinition).getRhs() =
142+
base.asInstruction() or
143+
gc.getV().getAUse() = base
144+
) and
145+
result = gc
146+
)
147+
}
148+
}
149+
150+
/**
151+
* A variable of type Options that holds the headers to be set.
152+
*/
153+
class RsOptions extends Variable {
154+
SsaWithFields v;
155+
156+
RsOptions() {
157+
this = v.getBaseVariable().getSourceVariable() and
158+
exists(Type t | t.hasQualifiedName(packagePath(), "Options") | v.getType() = t)
159+
}
160+
161+
/**
162+
* Get variable declaration of Options
163+
*/
164+
SsaWithFields getV() { result = v }
165+
}
166+
}

0 commit comments

Comments
 (0)