Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 7122f29

Browse files
committed
Finish Partial Path Traversal Query
1 parent 4c7d476 commit 7122f29

4 files changed

Lines changed: 47 additions & 9 deletions

File tree

java/ql/src/Security/CWE/CWE-023/PartialPathTraversal.expected

Whitespace-only changes.

java/ql/src/Security/CWE/CWE-023/PartialPathTraversal.ql

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,47 @@
1010
* external/cwe/cwe-023
1111
*/
1212

13-
import java
14-
13+
import java
14+
private import semmle.code.java.dataflow.DataFlow
15+
private import semmle.code.java.environment.SystemProperty
1516

1617
class MethodStringStartsWith extends Method {
17-
MethodStringStartsWith() {
18-
this.hasName("startsWith")
19-
}
18+
MethodStringStartsWith() {
19+
this.getDeclaringType() instanceof TypeString and
20+
this.hasName("startsWith")
21+
}
22+
}
23+
24+
class MethodFileGetCanonicalPath extends Method {
25+
MethodFileGetCanonicalPath() {
26+
this.getDeclaringType() instanceof TypeFile and
27+
this.hasName("getCanonicalPath")
28+
}
2029
}
2130

22-
from MethodAccess ma
23-
where ma.getMethod() instanceof MethodStringStartsWith
24-
select ma, "Partial Path Traversal Vulnerability due to insufficient guard against path traversal"
31+
class MethodAccessFileGetCanonicalPath extends MethodAccess {
32+
MethodAccessFileGetCanonicalPath() { this.getMethod() instanceof MethodFileGetCanonicalPath }
33+
}
34+
35+
abstract class FileSeparatorExpr extends Expr { }
36+
37+
class SystemPropFileSeparatorExpr extends FileSeparatorExpr {
38+
SystemPropFileSeparatorExpr() { this = getSystemProperty("file.separator") }
39+
}
40+
41+
class StringLiteralFileSeparatorExpr extends FileSeparatorExpr, StringLiteral {
42+
StringLiteralFileSeparatorExpr() { this.getValue() = "/" }
43+
}
44+
45+
class FileSeparatorAppend extends AddExpr {
46+
FileSeparatorAppend() { this.getRightOperand() instanceof FileSeparatorExpr }
47+
}
48+
49+
predicate isSafe(Expr expr) { DataFlow::localExprFlow(any(FileSeparatorAppend fsa), expr) }
50+
51+
from MethodAccess ma
52+
where
53+
ma.getMethod() instanceof MethodStringStartsWith and
54+
DataFlow::localExprFlow(any(MethodAccessFileGetCanonicalPath gcpma), ma.getQualifier()) and
55+
not isSafe(ma.getArgument(0))
56+
select ma, "Partial Path Traversal Vulnerability due to insufficient guard against path traversal"

java/ql/test/query-tests/security/CWE-023/semmle/tests/PartialPathTraversal.expected

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
| PartialPathTraversalTest.java:94:14:94:63 | startsWith(...) | Partial Path Traversal Vulnerability due to insufficient guard against path traversal |
1212
| PartialPathTraversalTest.java:102:14:102:63 | startsWith(...) | Partial Path Traversal Vulnerability due to insufficient guard against path traversal |
1313
| PartialPathTraversalTest.java:105:14:105:64 | startsWith(...) | Partial Path Traversal Vulnerability due to insufficient guard against path traversal |
14-
| PartialPathTraversalTest.java:150:9:150:43 | startsWith(...) | Partial Path Traversal Vulnerability due to insufficient guard against path traversal |
1514
| PartialPathTraversalTest.java:173:14:173:63 | startsWith(...) | Partial Path Traversal Vulnerability due to insufficient guard against path traversal |
1615
| PartialPathTraversalTest.java:191:18:191:87 | startsWith(...) | Partial Path Traversal Vulnerability due to insufficient guard against path traversal |
1716
| PartialPathTraversalTest.java:209:14:209:64 | startsWith(...) | Partial Path Traversal Vulnerability due to insufficient guard against path traversal |

java/ql/test/query-tests/security/CWE-023/semmle/tests/PartialPathTraversalTest.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,13 @@ void foo22(File dir, File dir2, File parent, boolean conditional) throws IOExcep
211211
}
212212
}
213213

214+
void foo23(File dir, File parent) throws IOException {
215+
String parentCanonical = parent.getCanonicalPath();
216+
if (!dir.getCanonicalPath().startsWith(parentCanonical + "/")) {
217+
throw new IOException("Invalid directory: " + dir.getCanonicalPath());
218+
}
219+
}
220+
214221
public void doesNotFlag() {
215222
"hello".startsWith("goodbye");
216223
}

0 commit comments

Comments
 (0)