|
1 | 1 | import python
|
2 |
| - |
3 | 2 | import semmle.python.security.TaintTracking
|
4 | 3 | import semmle.python.security.strings.Basic
|
5 | 4 | import semmle.python.web.Http
|
6 | 5 | import semmle.python.security.injection.Sql
|
7 | 6 |
|
8 | 7 | /** A django model class */
|
9 | 8 | class DjangoModel extends ClassValue {
|
10 |
| - |
11 |
| - DjangoModel() { |
12 |
| - Value::named("django.db.models.Model") = this.getASuperType() |
13 |
| - } |
14 |
| - |
| 9 | + DjangoModel() { Value::named("django.db.models.Model") = this.getASuperType() } |
15 | 10 | }
|
16 | 11 |
|
17 | 12 | /** A "taint" for django database tables */
|
18 | 13 | class DjangoDbTableObjects extends TaintKind {
|
19 |
| - |
20 |
| - DjangoDbTableObjects() { |
21 |
| - this = "django.db.models.Model.objects" |
22 |
| - } |
| 14 | + DjangoDbTableObjects() { this = "django.db.models.Model.objects" } |
23 | 15 |
|
24 | 16 | override TaintKind getTaintOfMethodResult(string name) {
|
25 | 17 | result = this and
|
@@ -53,102 +45,72 @@ class DjangoDbTableObjects extends TaintKind {
|
53 | 45 |
|
54 | 46 | /** Django model objects, which are sources of django database table "taint" */
|
55 | 47 | class DjangoModelObjects extends TaintSource {
|
56 |
| - |
57 | 48 | DjangoModelObjects() {
|
58 | 49 | this.(AttrNode).isLoad() and this.(AttrNode).getObject("objects").pointsTo(any(DjangoModel m))
|
59 | 50 | }
|
60 | 51 |
|
61 |
| - override predicate isSourceOf(TaintKind kind) { |
62 |
| - kind instanceof DjangoDbTableObjects |
63 |
| - } |
64 |
| - |
65 |
| - override string toString() { |
66 |
| - result = "django.db.models.Model.objects" |
67 |
| - } |
| 52 | + override predicate isSourceOf(TaintKind kind) { kind instanceof DjangoDbTableObjects } |
68 | 53 |
|
| 54 | + override string toString() { result = "django.db.models.Model.objects" } |
69 | 55 | }
|
70 | 56 |
|
71 | 57 | /** A write to a field of a django model, which is a vulnerable to external data. */
|
72 | 58 | class DjangoModelFieldWrite extends SqlInjectionSink {
|
73 |
| - |
74 | 59 | DjangoModelFieldWrite() {
|
75 | 60 | exists(AttrNode attr, DjangoModel model |
|
76 | 61 | this = attr and attr.isStore() and attr.getObject(_).pointsTo(model)
|
77 | 62 | )
|
78 | 63 | }
|
79 | 64 |
|
80 |
| - override predicate sinks(TaintKind kind) { |
81 |
| - kind instanceof ExternalStringKind |
82 |
| - } |
83 |
| - |
84 |
| - override string toString() { |
85 |
| - result = "django model field write" |
86 |
| - } |
| 65 | + override predicate sinks(TaintKind kind) { kind instanceof ExternalStringKind } |
87 | 66 |
|
| 67 | + override string toString() { result = "django model field write" } |
88 | 68 | }
|
89 | 69 |
|
90 | 70 | /** A direct reference to a django model object, which is vulnerable to external data. */
|
91 | 71 | class DjangoModelDirectObjectReference extends TaintSink {
|
92 |
| - |
93 | 72 | DjangoModelDirectObjectReference() {
|
94 |
| - exists(CallNode objects_get_call, ControlFlowNode objects | |
95 |
| - this = objects_get_call.getAnArg() | |
| 73 | + exists(CallNode objects_get_call, ControlFlowNode objects | this = objects_get_call.getAnArg() | |
96 | 74 | objects_get_call.getFunction().(AttrNode).getObject("get") = objects and
|
97 | 75 | any(DjangoDbTableObjects objs).taints(objects)
|
98 | 76 | )
|
99 | 77 | }
|
100 | 78 |
|
101 |
| - override predicate sinks(TaintKind kind) { |
102 |
| - kind instanceof ExternalStringKind |
103 |
| - } |
| 79 | + override predicate sinks(TaintKind kind) { kind instanceof ExternalStringKind } |
104 | 80 |
|
105 |
| - override string toString() { |
106 |
| - result = "django model object reference" |
107 |
| - } |
| 81 | + override string toString() { result = "django model object reference" } |
108 | 82 | }
|
109 | 83 |
|
110 | 84 | /**
|
111 |
| - * A call to the `raw` method on a django model. This allows a raw SQL query |
| 85 | + * A call to the `raw` method on a django model. This allows a raw SQL query |
112 | 86 | * to be sent to the database, which is a security risk.
|
113 | 87 | */
|
114 | 88 | class DjangoModelRawCall extends SqlInjectionSink {
|
115 |
| - |
116 | 89 | DjangoModelRawCall() {
|
117 |
| - exists(CallNode raw_call, ControlFlowNode queryset | |
118 |
| - this = raw_call.getArg(0) | |
| 90 | + exists(CallNode raw_call, ControlFlowNode queryset | this = raw_call.getArg(0) | |
119 | 91 | raw_call.getFunction().(AttrNode).getObject("raw") = queryset and
|
120 | 92 | any(DjangoDbTableObjects objs).taints(queryset)
|
121 | 93 | )
|
122 | 94 | }
|
123 | 95 |
|
124 |
| - override predicate sinks(TaintKind kind) { |
125 |
| - kind instanceof ExternalStringKind |
126 |
| - } |
| 96 | + override predicate sinks(TaintKind kind) { kind instanceof ExternalStringKind } |
127 | 97 |
|
128 |
| - override string toString() { |
129 |
| - result = "django.models.QuerySet.raw(sink,...)" |
130 |
| - } |
| 98 | + override string toString() { result = "django.models.QuerySet.raw(sink,...)" } |
131 | 99 | }
|
132 | 100 |
|
133 | 101 | /**
|
134 |
| - * A call to the `extra` method on a django model. This allows a raw SQL query |
| 102 | + * A call to the `extra` method on a django model. This allows a raw SQL query |
135 | 103 | * to be sent to the database, which is a security risk.
|
136 | 104 | */
|
137 | 105 | class DjangoModelExtraCall extends SqlInjectionSink {
|
138 |
| - |
139 | 106 | DjangoModelExtraCall() {
|
140 |
| - exists(CallNode extra_call, ControlFlowNode queryset | |
141 |
| - this = extra_call.getArg(0) | |
| 107 | + exists(CallNode extra_call, ControlFlowNode queryset | this = extra_call.getArg(0) | |
142 | 108 | extra_call.getFunction().(AttrNode).getObject("extra") = queryset and
|
143 | 109 | any(DjangoDbTableObjects objs).taints(queryset)
|
144 | 110 | )
|
145 | 111 | }
|
146 | 112 |
|
147 |
| - override predicate sinks(TaintKind kind) { |
148 |
| - kind instanceof ExternalStringKind |
149 |
| - } |
| 113 | + override predicate sinks(TaintKind kind) { kind instanceof ExternalStringKind } |
150 | 114 |
|
151 |
| - override string toString() { |
152 |
| - result = "django.models.QuerySet.extra(sink,...)" |
153 |
| - } |
| 115 | + override string toString() { result = "django.models.QuerySet.extra(sink,...)" } |
154 | 116 | }
|
0 commit comments