Skip to content

Commit c6911c2

Browse files
committed
Python: Move experimental UnicodeBypassValidation to new dataflow API
1 parent 2c06394 commit c6911c2

File tree

2 files changed

+14
-10
lines changed

2 files changed

+14
-10
lines changed

python/ql/src/experimental/Security/CWE-176/UnicodeBypassValidation.ql

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@
1414

1515
import python
1616
import UnicodeBypassValidationQuery
17-
import DataFlow::PathGraph
17+
import UnicodeBypassValidationFlow::PathGraph
1818

19-
from Configuration config, DataFlow::PathNode source, DataFlow::PathNode sink
20-
where config.hasFlowPath(source, sink)
19+
from UnicodeBypassValidationFlow::PathNode source, UnicodeBypassValidationFlow::PathNode sink
20+
where UnicodeBypassValidationFlow::flowPath(source, sink)
2121
select sink.getNode(), source, sink,
2222
"This $@ processes unsafely $@ and any logical validation in-between could be bypassed using special Unicode characters.",
2323
sink.getNode(), "Unicode transformation (Unicode normalization)", source.getNode(),

python/ql/src/experimental/Security/CWE-176/UnicodeBypassValidationQuery.qll

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
*/
44

55
private import python
6+
import semmle.python.dataflow.new.DataFlow
67
import semmle.python.ApiGraphs
78
import semmle.python.Concepts
89
import semmle.python.dataflow.new.internal.DataFlowPublic
@@ -27,16 +28,16 @@ class PostValidation extends DataFlow::FlowState {
2728
* This configuration uses two flow states, `PreValidation` and `PostValidation`,
2829
* to track the requirement that a logical validation has been performed before the Unicode Transformation.
2930
*/
30-
class Configuration extends TaintTracking::Configuration {
31-
Configuration() { this = "UnicodeBypassValidation" }
31+
private module UnicodeBypassValidationConfig implements DataFlow::StateConfigSig {
32+
class FlowState = DataFlow::FlowState;
3233

33-
override predicate isSource(DataFlow::Node source, DataFlow::FlowState state) {
34+
predicate isSource(DataFlow::Node source, FlowState state) {
3435
source instanceof RemoteFlowSource and state instanceof PreValidation
3536
}
3637

37-
override predicate isAdditionalTaintStep(
38-
DataFlow::Node nodeFrom, DataFlow::FlowState stateFrom, DataFlow::Node nodeTo,
39-
DataFlow::FlowState stateTo
38+
predicate isAdditionalFlowStep(
39+
DataFlow::Node nodeFrom, FlowState stateFrom, DataFlow::Node nodeTo,
40+
FlowState stateTo
4041
) {
4142
(
4243
exists(Escaping escaping | nodeFrom = escaping.getAnInput() and nodeTo = escaping.getOutput())
@@ -51,7 +52,7 @@ class Configuration extends TaintTracking::Configuration {
5152
}
5253

5354
/* A Unicode Tranformation (Unicode tranformation) is considered a sink when the algorithm used is either NFC or NFKC. */
54-
override predicate isSink(DataFlow::Node sink, DataFlow::FlowState state) {
55+
predicate isSink(DataFlow::Node sink, FlowState state) {
5556
exists(API::CallNode cn |
5657
cn = API::moduleImport("unicodedata").getMember("normalize").getACall() and
5758
sink = cn.getArg(1)
@@ -71,3 +72,6 @@ class Configuration extends TaintTracking::Configuration {
7172
state instanceof PostValidation
7273
}
7374
}
75+
76+
/** Global taint-tracking for detecting "Unicode transformation mishandling" vulnerabilities. */
77+
module UnicodeBypassValidationFlow = TaintTracking::GlobalWithState<UnicodeBypassValidationConfig>;

0 commit comments

Comments
 (0)