|
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 | | -class DjangoModel extends ClassObject { |
10 | | - |
11 | | - DjangoModel() { |
12 | | - ModuleObject::named("django.db.models").attr("Model") = this.getAnImproperSuperType() |
13 | | - } |
14 | | - |
| 8 | +class DjangoModel extends ClassValue { |
| 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,105 +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 | | - this.(AttrNode).isLoad() and this.(AttrNode).getObject("objects").refersTo(any(DjangoModel m)) |
| 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 | | - this = attr and attr.isStore() and attr.getObject(_).refersTo(model) |
| 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 | | -/** A direct reference to a django model object, which is a vulnerable to external data. */ |
| 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 | | - |
115 | 88 | class DjangoModelRawCall extends SqlInjectionSink { |
116 | | - |
117 | 89 | DjangoModelRawCall() { |
118 | | - exists(CallNode raw_call, ControlFlowNode queryset | |
119 | | - this = raw_call.getArg(0) | |
| 90 | + exists(CallNode raw_call, ControlFlowNode queryset | this = raw_call.getArg(0) | |
120 | 91 | raw_call.getFunction().(AttrNode).getObject("raw") = queryset and |
121 | 92 | any(DjangoDbTableObjects objs).taints(queryset) |
122 | 93 | ) |
123 | 94 | } |
124 | 95 |
|
125 | | - override predicate sinks(TaintKind kind) { |
126 | | - kind instanceof ExternalStringKind |
127 | | - } |
| 96 | + override predicate sinks(TaintKind kind) { kind instanceof ExternalStringKind } |
128 | 97 |
|
129 | | - override string toString() { |
130 | | - result = "django.models.QuerySet.raw(sink,...)" |
131 | | - } |
| 98 | + override string toString() { result = "django.models.QuerySet.raw(sink,...)" } |
132 | 99 | } |
133 | 100 |
|
134 | 101 | /** |
135 | | - * 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 |
136 | 103 | * to be sent to the database, which is a security risk. |
137 | 104 | */ |
138 | | - |
139 | | - |
140 | 105 | class DjangoModelExtraCall extends SqlInjectionSink { |
141 | | - |
142 | 106 | DjangoModelExtraCall() { |
143 | | - exists(CallNode extra_call, ControlFlowNode queryset | |
144 | | - this = extra_call.getArg(0) | |
| 107 | + exists(CallNode extra_call, ControlFlowNode queryset | this = extra_call.getArg(0) | |
145 | 108 | extra_call.getFunction().(AttrNode).getObject("extra") = queryset and |
146 | 109 | any(DjangoDbTableObjects objs).taints(queryset) |
147 | 110 | ) |
148 | 111 | } |
149 | 112 |
|
150 | | - override predicate sinks(TaintKind kind) { |
151 | | - kind instanceof ExternalStringKind |
152 | | - } |
| 113 | + override predicate sinks(TaintKind kind) { kind instanceof ExternalStringKind } |
153 | 114 |
|
154 | | - override string toString() { |
155 | | - result = "django.models.QuerySet.extra(sink,...)" |
156 | | - } |
| 115 | + override string toString() { result = "django.models.QuerySet.extra(sink,...)" } |
157 | 116 | } |
0 commit comments