|
3 | 3 | */
|
4 | 4 |
|
5 | 5 | import java
|
| 6 | +private import semmle.code.java.dataflow.DataFlow |
| 7 | +private import semmle.code.java.dataflow.TaintTracking |
6 | 8 | private import semmle.code.java.dataflow.ExternalFlow
|
7 | 9 |
|
8 | 10 | /** The class `org.apache.ibatis.jdbc.SqlRunner`. */
|
@@ -102,3 +104,116 @@ class MyBatisSqlOperationAnnotationMethod extends Method {
|
102 | 104 | class TypeParam extends Interface {
|
103 | 105 | TypeParam() { this.hasQualifiedName("org.apache.ibatis.annotations", "Param") }
|
104 | 106 | }
|
| 107 | + |
| 108 | +private class MyBatisProvider extends RefType { |
| 109 | + MyBatisProvider() { |
| 110 | + this.hasQualifiedName("org.apache.ibatis.annotations", |
| 111 | + ["Select", "Delete", "Insert", "Update"] + "Provider") |
| 112 | + } |
| 113 | +} |
| 114 | + |
| 115 | +/** |
| 116 | + * A return statement of a method used in a MyBatis Provider. |
| 117 | + * |
| 118 | + * See |
| 119 | + * - `MyBatisProvider` |
| 120 | + * - https://mybatis.org/mybatis-3/apidocs/org/apache/ibatis/annotations/package-summary.html |
| 121 | + */ |
| 122 | +class MyBatisInjectionSink extends DataFlow::Node { |
| 123 | + MyBatisInjectionSink() { |
| 124 | + exists(Annotation a, Method m | |
| 125 | + a.getType() instanceof MyBatisProvider and |
| 126 | + m.getDeclaringType() = a.getValue(["type", "value"]).(TypeLiteral).getTypeName().getType() and |
| 127 | + m.hasName(a.getValue("method").(StringLiteral).getValue()) and |
| 128 | + exists(ReturnStmt ret | this.asExpr() = ret.getResult() and ret.getEnclosingCallable() = m) |
| 129 | + ) |
| 130 | + } |
| 131 | +} |
| 132 | + |
| 133 | +private class MyBatisProviderStep extends TaintTracking::AdditionalValueStep { |
| 134 | + override predicate step(DataFlow::Node n1, DataFlow::Node n2) { |
| 135 | + exists(MethodAccess ma, Annotation a, Method providerMethod | |
| 136 | + exists(int i | |
| 137 | + ma.getArgument(pragma[only_bind_into](i)) = n1.asExpr() and |
| 138 | + providerMethod.getParameter(pragma[only_bind_into](i)) = n2.asParameter() |
| 139 | + ) |
| 140 | + | |
| 141 | + a.getType() instanceof MyBatisProvider and |
| 142 | + ma.getMethod().getAnAnnotation() = a and |
| 143 | + providerMethod.getDeclaringType() = |
| 144 | + a.getValue(["type", "value"]).(TypeLiteral).getTypeName().getType() and |
| 145 | + providerMethod.hasName(a.getValue("method").(StringLiteral).getValue()) |
| 146 | + ) |
| 147 | + } |
| 148 | +} |
| 149 | + |
| 150 | +private class MyBatisAbstractSqlToStringStep extends SummaryModelCsv { |
| 151 | + override predicate row(string row) { |
| 152 | + row = "org.apache.ibatis.jdbc;AbstractSQL;true;toString;;;Argument[-1];ReturnValue;taint" |
| 153 | + } |
| 154 | +} |
| 155 | + |
| 156 | +private class MyBatisAbstractSqlMethodsStep extends SummaryModelCsv { |
| 157 | + override predicate row(string row) { |
| 158 | + row = |
| 159 | + [ |
| 160 | + "org.apache.ibatis.jdbc;AbstractSQL;true;toString;;;Argument[-1];ReturnValue;taint", |
| 161 | + "org.apache.ibatis.jdbc;AbstractSQL;true;WHERE;(String[]);;Argument[0];Argument[-1];taint", |
| 162 | + "org.apache.ibatis.jdbc;AbstractSQL;true;WHERE;(String[]);;Argument[0].ArrayElement;Argument[-1];taint", |
| 163 | + "org.apache.ibatis.jdbc;AbstractSQL;true;WHERE;(String);;Argument[0];Argument[-1];taint", |
| 164 | + "org.apache.ibatis.jdbc;AbstractSQL;true;WHERE;(String);;Argument[0].ArrayElement;Argument[-1];taint", |
| 165 | + "org.apache.ibatis.jdbc;AbstractSQL;true;VALUES;(String,String);;Argument[0..1];Argument[-1];taint", |
| 166 | + "org.apache.ibatis.jdbc;AbstractSQL;true;UPDATE;(String);;Argument[0];Argument[-1];taint", |
| 167 | + "org.apache.ibatis.jdbc;AbstractSQL;true;SET;(String[]);;Argument[0];Argument[-1];taint", |
| 168 | + "org.apache.ibatis.jdbc;AbstractSQL;true;SET;(String[]);;Argument[0].ArrayElement;Argument[-1];taint", |
| 169 | + "org.apache.ibatis.jdbc;AbstractSQL;true;SET;(String);;Argument[0];Argument[-1];taint", |
| 170 | + "org.apache.ibatis.jdbc;AbstractSQL;true;SET;(String);;Argument[0].ArrayElement;Argument[-1];taint", |
| 171 | + "org.apache.ibatis.jdbc;AbstractSQL;true;SELECT_DISTINCT;(String[]);;Argument[0];Argument[-1];taint", |
| 172 | + "org.apache.ibatis.jdbc;AbstractSQL;true;SELECT_DISTINCT;(String[]);;Argument[0].ArrayElement;Argument[-1];taint", |
| 173 | + "org.apache.ibatis.jdbc;AbstractSQL;true;SELECT_DISTINCT;(String);;Argument[0];Argument[-1];taint", |
| 174 | + "org.apache.ibatis.jdbc;AbstractSQL;true;SELECT_DISTINCT;(String);;Argument[0].ArrayElement;Argument[-1];taint", |
| 175 | + "org.apache.ibatis.jdbc;AbstractSQL;true;SELECT;(String);;Argument[0];Argument[-1];taint", |
| 176 | + "org.apache.ibatis.jdbc;AbstractSQL;true;RIGHT_OUTER_JOIN;(String[]);;Argument[0];Argument[-1];taint", |
| 177 | + "org.apache.ibatis.jdbc;AbstractSQL;true;RIGHT_OUTER_JOIN;(String[]);;Argument[0].ArrayElement;Argument[-1];taint", |
| 178 | + "org.apache.ibatis.jdbc;AbstractSQL;true;RIGHT_OUTER_JOIN;(String);;Argument[0];Argument[-1];taint", |
| 179 | + "org.apache.ibatis.jdbc;AbstractSQL;true;RIGHT_OUTER_JOIN;(String);;Argument[0].ArrayElement;Argument[-1];taint", |
| 180 | + "org.apache.ibatis.jdbc;AbstractSQL;true;OUTER_JOIN;(String[]);;Argument[0];Argument[-1];taint", |
| 181 | + "org.apache.ibatis.jdbc;AbstractSQL;true;OUTER_JOIN;(String[]);;Argument[0].ArrayElement;Argument[-1];taint", |
| 182 | + "org.apache.ibatis.jdbc;AbstractSQL;true;OUTER_JOIN;(String);;Argument[0];Argument[-1];taint", |
| 183 | + "org.apache.ibatis.jdbc;AbstractSQL;true;OUTER_JOIN;(String);;Argument[0].ArrayElement;Argument[-1];taint", |
| 184 | + "org.apache.ibatis.jdbc;AbstractSQL;true;ORDER_BY;(String[]);;Argument[0];Argument[-1];taint", |
| 185 | + "org.apache.ibatis.jdbc;AbstractSQL;true;ORDER_BY;(String[]);;Argument[0].ArrayElement;Argument[-1];taint", |
| 186 | + "org.apache.ibatis.jdbc;AbstractSQL;true;ORDER_BY;(String);;Argument[0];Argument[-1];taint", |
| 187 | + "org.apache.ibatis.jdbc;AbstractSQL;true;ORDER_BY;(String);;Argument[0].ArrayElement;Argument[-1];taint", |
| 188 | + "org.apache.ibatis.jdbc;AbstractSQL;true;OFFSET_ROWS;(String);;Argument[0];Argument[-1];taint", |
| 189 | + "org.apache.ibatis.jdbc;AbstractSQL;true;OFFSET;(String);;Argument[0];Argument[-1];taint", |
| 190 | + "org.apache.ibatis.jdbc;AbstractSQL;true;LIMIT;(String);;Argument[0];Argument[-1];taint", |
| 191 | + "org.apache.ibatis.jdbc;AbstractSQL;true;LEFT_OUTER_JOIN;(String[]);;Argument[0];Argument[-1];taint", |
| 192 | + "org.apache.ibatis.jdbc;AbstractSQL;true;LEFT_OUTER_JOIN;(String[]);;Argument[0].ArrayElement;Argument[-1];taint", |
| 193 | + "org.apache.ibatis.jdbc;AbstractSQL;true;LEFT_OUTER_JOIN;(String);;Argument[0];Argument[-1];taint", |
| 194 | + "org.apache.ibatis.jdbc;AbstractSQL;true;LEFT_OUTER_JOIN;(String);;Argument[0].ArrayElement;Argument[-1];taint", |
| 195 | + "org.apache.ibatis.jdbc;AbstractSQL;true;JOIN;(String[]);;Argument[0].ArrayElement;Argument[-1];taint", |
| 196 | + "org.apache.ibatis.jdbc;AbstractSQL;true;INTO_VALUES;(String[]);;Argument[0].ArrayElement;Argument[-1];taint", |
| 197 | + "org.apache.ibatis.jdbc;AbstractSQL;true;INTO_COLUMNS;(String[]);;Argument[0].ArrayElement;Argument[-1];taint", |
| 198 | + "org.apache.ibatis.jdbc;AbstractSQL;true;INSERT_INTO;(String);;Argument[0];Argument[-1];taint", |
| 199 | + "org.apache.ibatis.jdbc;AbstractSQL;true;INNER_JOIN;(String[]);;Argument[0];Argument[-1];taint", |
| 200 | + "org.apache.ibatis.jdbc;AbstractSQL;true;INNER_JOIN;(String[]);;Argument[0].ArrayElement;Argument[-1];taint", |
| 201 | + "org.apache.ibatis.jdbc;AbstractSQL;true;INNER_JOIN;(String);;Argument[0];Argument[-1];taint", |
| 202 | + "org.apache.ibatis.jdbc;AbstractSQL;true;INNER_JOIN;(String);;Argument[0].ArrayElement;Argument[-1];taint", |
| 203 | + "org.apache.ibatis.jdbc;AbstractSQL;true;HAVING;(String[]);;Argument[0];Argument[-1];taint", |
| 204 | + "org.apache.ibatis.jdbc;AbstractSQL;true;HAVING;(String[]);;Argument[0].ArrayElement;Argument[-1];taint", |
| 205 | + "org.apache.ibatis.jdbc;AbstractSQL;true;HAVING;(String);;Argument[0];Argument[-1];taint", |
| 206 | + "org.apache.ibatis.jdbc;AbstractSQL;true;HAVING;(String);;Argument[0].ArrayElement;Argument[-1];taint", |
| 207 | + "org.apache.ibatis.jdbc;AbstractSQL;true;GROUP_BY;(String[]);;Argument[0];Argument[-1];taint", |
| 208 | + "org.apache.ibatis.jdbc;AbstractSQL;true;GROUP_BY;(String[]);;Argument[0].ArrayElement;Argument[-1];taint", |
| 209 | + "org.apache.ibatis.jdbc;AbstractSQL;true;GROUP_BY;(String);;Argument[0];Argument[-1];taint", |
| 210 | + "org.apache.ibatis.jdbc;AbstractSQL;true;GROUP_BY;(String);;Argument[0].ArrayElement;Argument[-1];taint", |
| 211 | + "org.apache.ibatis.jdbc;AbstractSQL;true;FROM;(String[]);;Argument[0];Argument[-1];taint", |
| 212 | + "org.apache.ibatis.jdbc;AbstractSQL;true;FROM;(String[]);;Argument[0].ArrayElement;Argument[-1];taint", |
| 213 | + "org.apache.ibatis.jdbc;AbstractSQL;true;FROM;(String);;Argument[0];Argument[-1];taint", |
| 214 | + "org.apache.ibatis.jdbc;AbstractSQL;true;FROM;(String);;Argument[0].ArrayElement;Argument[-1];taint", |
| 215 | + "org.apache.ibatis.jdbc;AbstractSQL;true;FETCH_FIRST_ROWS_ONLY;(String);;Argument[0];Argument[-1];taint", |
| 216 | + "org.apache.ibatis.jdbc;AbstractSQL;true;DELETE_FROM;(String);;Argument[0];Argument[-1];taint" |
| 217 | + ] |
| 218 | + } |
| 219 | +} |
0 commit comments