mirror of
https://github.com/github/codeql.git
synced 2025-12-24 04:36:35 +01:00
Attempt to use information-leak sink category
This commit is contained in:
@@ -16,6 +16,7 @@ import java
|
|||||||
import semmle.code.java.dataflow.DataFlow
|
import semmle.code.java.dataflow.DataFlow
|
||||||
import semmle.code.java.dataflow.TaintTracking
|
import semmle.code.java.dataflow.TaintTracking
|
||||||
import semmle.code.java.security.XSS
|
import semmle.code.java.security.XSS
|
||||||
|
import semmle.code.java.security.InformationLeak
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* One of the `printStackTrace()` overloads on `Throwable`.
|
* One of the `printStackTrace()` overloads on `Throwable`.
|
||||||
@@ -83,14 +84,17 @@ predicate stackTraceExpr(Expr exception, MethodAccess stackTraceString) {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
class StackTraceStringToXssSinkFlowConfig extends TaintTracking::Configuration {
|
class StackTraceStringToHTTPResponseSinkFlowConfig extends TaintTracking::Configuration {
|
||||||
StackTraceStringToXssSinkFlowConfig() {
|
StackTraceStringToHTTPResponseSinkFlowConfig() {
|
||||||
this = "StackTraceExposure::StackTraceStringToXssSinkFlowConfig"
|
this = "StackTraceExposure::StackTraceStringToHTTPResponseSinkFlowConfig"
|
||||||
}
|
}
|
||||||
|
|
||||||
override predicate isSource(DataFlow::Node src) { stackTraceExpr(_, src.asExpr()) }
|
override predicate isSource(DataFlow::Node src) { stackTraceExpr(_, src.asExpr()) }
|
||||||
|
|
||||||
override predicate isSink(DataFlow::Node sink) { sink instanceof XssSink }
|
override predicate isSink(DataFlow::Node sink) {
|
||||||
|
sink instanceof XssSink or
|
||||||
|
sink instanceof InformationLeakSink
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -106,7 +110,7 @@ predicate printsStackExternally(MethodAccess call, Expr stackTrace) {
|
|||||||
* A stringified stack trace flows to an external sink.
|
* A stringified stack trace flows to an external sink.
|
||||||
*/
|
*/
|
||||||
predicate stringifiedStackFlowsExternally(XssSink externalExpr, Expr stackTrace) {
|
predicate stringifiedStackFlowsExternally(XssSink externalExpr, Expr stackTrace) {
|
||||||
exists(MethodAccess stackTraceString, StackTraceStringToXssSinkFlowConfig conf |
|
exists(MethodAccess stackTraceString, StackTraceStringToHTTPResponseSinkFlowConfig conf |
|
||||||
stackTraceExpr(stackTrace, stackTraceString) and
|
stackTraceExpr(stackTrace, stackTraceString) and
|
||||||
conf.hasFlow(DataFlow::exprNode(stackTraceString), externalExpr)
|
conf.hasFlow(DataFlow::exprNode(stackTraceString), externalExpr)
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -79,6 +79,7 @@ private module Frameworks {
|
|||||||
private import semmle.code.java.frameworks.guava.Guava
|
private import semmle.code.java.frameworks.guava.Guava
|
||||||
private import semmle.code.java.frameworks.jackson.JacksonSerializability
|
private import semmle.code.java.frameworks.jackson.JacksonSerializability
|
||||||
private import semmle.code.java.security.ResponseSplitting
|
private import semmle.code.java.security.ResponseSplitting
|
||||||
|
private import semmle.code.java.security.InformationLeak
|
||||||
private import semmle.code.java.security.XSS
|
private import semmle.code.java.security.XSS
|
||||||
private import semmle.code.java.security.LdapInjection
|
private import semmle.code.java.security.LdapInjection
|
||||||
private import semmle.code.java.security.XPath
|
private import semmle.code.java.security.XPath
|
||||||
|
|||||||
23
java/ql/src/semmle/code/java/security/InformationLeak.qll
Normal file
23
java/ql/src/semmle/code/java/security/InformationLeak.qll
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
/** Provides classes to reason about System Information Leak vulnerabilities. */
|
||||||
|
|
||||||
|
import java
|
||||||
|
import semmle.code.java.dataflow.DataFlow
|
||||||
|
import semmle.code.java.dataflow.ExternalFlow
|
||||||
|
|
||||||
|
/** CSV sink models representing methods not susceptible to XSS but outputing to an HTTP response body. */
|
||||||
|
private class DefaultInformationLeakSinkModel extends SinkModelCsv {
|
||||||
|
override predicate row(string row) {
|
||||||
|
row =
|
||||||
|
[
|
||||||
|
"javax.servlet.http;HttpServletResponse;false;sendError;(int,String);;Argument[1];information-leak"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** A sink that represent a method that outputs data to an HTTP response. */
|
||||||
|
abstract class InformationLeakSink extends DataFlow::Node { }
|
||||||
|
|
||||||
|
/** A default sink representing methods outputing data to an HTTP response. */
|
||||||
|
private class DefaultInformationLeakSink extends InformationLeakSink {
|
||||||
|
DefaultInformationLeakSink() { sinkNode(this, "information-leak") }
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user