Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,18 @@ import java
import semmle.code.java.dataflow.FlowSources
import semmle.code.java.dataflow.TaintTracking
import semmle.code.java.security.AndroidIntentRedirection
private import semmle.code.java.dataflow.ExternalFlow

/** A taint tracking configuration for tainted Intents being used to start Android components. */
module IntentRedirectionConfig implements DataFlow::ConfigSig {
predicate isSource(DataFlow::Node source) { source instanceof ActiveThreatModelSource }

predicate isSink(DataFlow::Node sink) { sink instanceof IntentRedirectionSink }

predicate isBarrier(DataFlow::Node sanitizer) { sanitizer instanceof IntentRedirectionSanitizer }
predicate isBarrier(DataFlow::Node sanitizer) {
sanitizer instanceof IntentRedirectionSanitizer or
barrierNode(sanitizer, "java/android/intent-redirection")
}

predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) {
any(IntentRedirectionAdditionalTaintStep c).step(node1, node2)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import semmle.code.java.dataflow.TaintTracking
import semmle.code.java.frameworks.android.Intent
import semmle.code.java.security.SensitiveActions
private import semmle.code.java.dataflow.ExternalFlow

Check warning

Code scanning / CodeQL

Redundant import Warning

Redundant import, the module is already imported inside
semmle.code.java.dataflow.FlowSinks
.
private import semmle.code.java.dataflow.FlowSinks

/**
Expand Down Expand Up @@ -144,7 +145,10 @@
/**
* Holds if broadcast doesn't specify receiving package name of the 3rd party app
*/
predicate isBarrier(DataFlow::Node node) { node instanceof ExplicitIntentSanitizer }
predicate isBarrier(DataFlow::Node node) {
node instanceof ExplicitIntentSanitizer or
barrierNode(node, "java/android/sensitive-communication")
}

predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) {
isSink(node) and exists(c)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import java
import semmle.code.java.dataflow.DataFlow
import semmle.code.java.dataflow.TaintTracking
private import semmle.code.java.dataflow.ExternalFlow
private import semmle.code.java.security.ArbitraryApkInstallation

/**
Expand All @@ -24,6 +25,10 @@ module ApkInstallationConfig implements DataFlow::ConfigSig {
)
}

predicate isBarrier(DataFlow::Node node) {
barrierNode(node, "java/android/arbitrary-apk-installation")
}

predicate observeDiffInformedIncrementalMode() { any() }
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
/** Provides taint-tracking configurations to reason about arithmetic with unvalidated input. */

import java
private import semmle.code.java.dataflow.ExternalFlow
private import semmle.code.java.dataflow.FlowSources
private import semmle.code.java.security.ArithmeticCommon

Expand All @@ -10,7 +11,10 @@ module ArithmeticOverflowConfig implements DataFlow::ConfigSig {

predicate isSink(DataFlow::Node sink) { overflowSink(_, sink.asExpr()) }

predicate isBarrier(DataFlow::Node n) { overflowBarrier(n) }
predicate isBarrier(DataFlow::Node n) {
overflowBarrier(n) or
barrierNode(n, "java/tainted-arithmetic")
}

predicate isBarrierIn(DataFlow::Node node) { isSource(node) }

Expand All @@ -36,7 +40,10 @@ module ArithmeticUnderflowConfig implements DataFlow::ConfigSig {

predicate isSink(DataFlow::Node sink) { underflowSink(_, sink.asExpr()) }

predicate isBarrier(DataFlow::Node n) { underflowBarrier(n) }
predicate isBarrier(DataFlow::Node n) {
underflowBarrier(n) or
barrierNode(n, "java/tainted-arithmetic")
}

predicate isBarrierIn(DataFlow::Node node) { isSource(node) }

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
/** Provides taint-tracking configuration to reason about arithmetic with uncontrolled values. */

import java
private import semmle.code.java.dataflow.ExternalFlow
private import semmle.code.java.dataflow.TaintTracking
private import semmle.code.java.security.RandomQuery
private import semmle.code.java.security.SecurityTests
Expand All @@ -18,7 +19,10 @@ module ArithmeticUncontrolledOverflowConfig implements DataFlow::ConfigSig {

predicate isSink(DataFlow::Node sink) { overflowSink(_, sink.asExpr()) }

predicate isBarrier(DataFlow::Node n) { overflowBarrier(n) }
predicate isBarrier(DataFlow::Node n) {
overflowBarrier(n) or
barrierNode(n, "java/uncontrolled-arithmetic")
}

predicate observeDiffInformedIncrementalMode() {
any() // merged with ArithmeticUncontrolledUnderflow in ArithmeticUncontrolled.ql
Expand All @@ -41,7 +45,10 @@ module ArithmeticUncontrolledUnderflowConfig implements DataFlow::ConfigSig {

predicate isSink(DataFlow::Node sink) { underflowSink(_, sink.asExpr()) }

predicate isBarrier(DataFlow::Node n) { underflowBarrier(n) }
predicate isBarrier(DataFlow::Node n) {
underflowBarrier(n) or
barrierNode(n, "java/uncontrolled-arithmetic")
}

predicate observeDiffInformedIncrementalMode() {
any() // merged with ArithmeticUncontrolledOverflow in ArithmeticUncontrolled.ql
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
/** Provides predicates and classes for reasoning about arithmetic with extreme values. */

import java
private import semmle.code.java.dataflow.ExternalFlow
private import semmle.code.java.dataflow.DataFlow
private import semmle.code.java.security.ArithmeticCommon

Expand Down Expand Up @@ -38,7 +39,10 @@ module MaxValueFlowConfig implements DataFlow::ConfigSig {

predicate isBarrierIn(DataFlow::Node n) { isSource(n) }

predicate isBarrier(DataFlow::Node n) { overflowBarrier(n) }
predicate isBarrier(DataFlow::Node n) {
overflowBarrier(n) or
barrierNode(n, "java/extreme-value-arithmetic")
}
}

/** Dataflow from maximum values to an underflow. */
Expand All @@ -54,7 +58,10 @@ module MinValueFlowConfig implements DataFlow::ConfigSig {

predicate isBarrierIn(DataFlow::Node n) { isSource(n) }

predicate isBarrier(DataFlow::Node n) { underflowBarrier(n) }
predicate isBarrier(DataFlow::Node n) {
underflowBarrier(n) or
barrierNode(n, "java/extreme-value-arithmetic")
}
}

/** Dataflow from minimum values to an underflow. */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import java
private import semmle.code.java.security.Encryption
private import semmle.code.java.dataflow.ExternalFlow
private import semmle.code.java.dataflow.TaintTracking
private import semmle.code.java.security.Sanitizers

Expand Down Expand Up @@ -31,7 +32,10 @@ module InsecureCryptoConfig implements DataFlow::ConfigSig {

predicate isSink(DataFlow::Node n) { exists(CryptoAlgoSpec c | n.asExpr() = c.getAlgoSpec()) }

predicate isBarrier(DataFlow::Node node) { node instanceof SimpleTypeSanitizer }
predicate isBarrier(DataFlow::Node node) {
node instanceof SimpleTypeSanitizer or
barrierNode(node, "java/weak-cryptographic-algorithm")
}

predicate observeDiffInformedIncrementalMode() { any() }

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,10 @@ module InputToArgumentToExecFlowConfig implements DataFlow::ConfigSig {

predicate isSink(DataFlow::Node sink) { sink instanceof CommandInjectionSink }

predicate isBarrier(DataFlow::Node node) { node instanceof CommandInjectionSanitizer }
predicate isBarrier(DataFlow::Node node) {
node instanceof CommandInjectionSanitizer or
barrierNode(node, "java/command-line-injection")
}

predicate isAdditionalFlowStep(DataFlow::Node n1, DataFlow::Node n2) {
any(CommandInjectionAdditionalTaintStep s).step(n1, n2)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import java
import semmle.code.java.dataflow.FlowSources
import semmle.code.java.security.SensitiveActions
import semmle.code.java.controlflow.Guards
private import semmle.code.java.dataflow.ExternalFlow

/**
* Holds if `ma` is controlled by the condition expression `e`.
Expand Down Expand Up @@ -44,6 +45,8 @@ module ConditionalBypassFlowConfig implements DataFlow::ConfigSig {

predicate isSink(DataFlow::Node sink) { conditionControlsMethod(_, sink.asExpr()) }

predicate isBarrier(DataFlow::Node node) { barrierNode(node, "java/user-controlled-bypass") }

predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) {
endsWithStep(node1, node2)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,10 @@ private module SqlExecuteConfig implements DataFlow::ConfigSig {
m.hasName("execute")
)
}

predicate isBarrier(DataFlow::Node node) {
barrierNode(node, "java/csrf-unprotected-request-type")
}
}

/**
Expand Down
5 changes: 5 additions & 0 deletions java/ql/lib/semmle/code/java/security/ExternalAPIs.qll
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ module;
import java
import semmle.code.java.dataflow.FlowSources
import semmle.code.java.dataflow.TaintTracking
private import semmle.code.java.dataflow.ExternalFlow

/**
* A `Method` that is considered a "safe" external API from a security perspective.
Expand Down Expand Up @@ -102,6 +103,10 @@ module UntrustedDataToExternalApiConfig implements DataFlow::ConfigSig {

predicate isSink(DataFlow::Node sink) { sink instanceof ExternalApiDataNode }

predicate isBarrier(DataFlow::Node node) {
barrierNode(node, "java/untrusted-data-to-external-api")
}

predicate observeDiffInformedIncrementalMode() {
any() // Simple use in UntrustedDataToExternalAPI.ql; also used through ExternalApiUsedWithUntrustedData in ExternalAPIsUsedWithUntrustedData.ql
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
/** Provides a taint-tracking configuration to reason about externally controlled format string vulnerabilities. */

import java
private import semmle.code.java.dataflow.ExternalFlow

Check warning

Code scanning / CodeQL

Redundant import Warning

Redundant import, the module is already imported inside
semmle.code.java.dataflow.FlowSinks
.
private import semmle.code.java.dataflow.FlowSinks
private import semmle.code.java.dataflow.FlowSources
private import semmle.code.java.StringFormat
Expand All @@ -21,7 +22,9 @@
predicate isSink(DataFlow::Node sink) { sink instanceof StringFormatSink }

predicate isBarrier(DataFlow::Node node) {
node.getType() instanceof NumericType or node.getType() instanceof BooleanType
node.getType() instanceof NumericType or
node.getType() instanceof BooleanType or
barrierNode(node, "java/tainted-format-string")
}

predicate observeDiffInformedIncrementalMode() { any() }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import java
import semmle.code.java.dataflow.FlowSources
import semmle.code.java.dataflow.TaintTracking
import semmle.code.java.security.FragmentInjection
private import semmle.code.java.dataflow.ExternalFlow

/**
* A taint-tracking configuration for unsafe user input
Expand All @@ -14,6 +15,8 @@ module FragmentInjectionTaintConfig implements DataFlow::ConfigSig {

predicate isSink(DataFlow::Node sink) { sink instanceof FragmentInjectionSink }

predicate isBarrier(DataFlow::Node node) { barrierNode(node, "java/android/fragment-injection") }

predicate isAdditionalFlowStep(DataFlow::Node n1, DataFlow::Node n2) {
any(FragmentInjectionAdditionalTaintStep c).step(n1, n2)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import semmle.code.java.dataflow.FlowSources
import semmle.code.java.dataflow.TaintTracking
import semmle.code.java.security.GroovyInjection
private import semmle.code.java.dataflow.ExternalFlow

Check warning

Code scanning / CodeQL

Redundant import Warning

Redundant import, the module is already imported inside
semmle.code.java.security.GroovyInjection
.

/**
* A taint-tracking configuration for unsafe user input
Expand All @@ -14,6 +15,8 @@

predicate isSink(DataFlow::Node sink) { sink instanceof GroovyInjectionSink }

predicate isBarrier(DataFlow::Node node) { barrierNode(node, "java/groovy-injection") }

predicate isAdditionalFlowStep(DataFlow::Node fromNode, DataFlow::Node toNode) {
any(GroovyInjectionAdditionalTaintStep c).step(fromNode, toNode)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import java
import semmle.code.java.dataflow.DataFlow
import HardcodedCredentials
private import semmle.code.java.dataflow.ExternalFlow

/**
* A data-flow configuration that tracks flow from a hard-coded credential in a call to a sensitive Java API which may compromise security.
Expand Down Expand Up @@ -47,7 +48,8 @@ module HardcodedCredentialApiCallConfig implements DataFlow::ConfigSig {
}

predicate isBarrier(DataFlow::Node n) {
n.asExpr().(MethodCall).getMethod() instanceof MethodSystemGetenv
n.asExpr().(MethodCall).getMethod() instanceof MethodSystemGetenv or
barrierNode(n, "java/hardcoded-credential-api-call")
}

predicate observeDiffInformedIncrementalMode() { any() }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import java
import semmle.code.java.dataflow.DataFlow
import HardcodedCredentials
private import semmle.code.java.dataflow.ExternalFlow

/**
* A data-flow configuration that tracks hardcoded expressions flowing to a parameter whose name suggests
Expand All @@ -15,6 +16,10 @@ module HardcodedCredentialSourceCallConfig implements DataFlow::ConfigSig {

predicate isSink(DataFlow::Node n) { n.asExpr() instanceof FinalCredentialsSourceSink }

predicate isBarrier(DataFlow::Node node) {
barrierNode(node, "java/hardcoded-credential-sensitive-call")
}

predicate observeDiffInformedIncrementalMode() { any() }
}

Expand Down
6 changes: 5 additions & 1 deletion java/ql/lib/semmle/code/java/security/HttpsUrlsQuery.qll
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import semmle.code.java.dataflow.TaintTracking
import semmle.code.java.frameworks.Networking
import semmle.code.java.security.HttpsUrls
private import semmle.code.java.security.Sanitizers
private import semmle.code.java.dataflow.ExternalFlow

/**
* A taint tracking configuration for HTTP connections.
Expand All @@ -18,7 +19,10 @@ module HttpStringToUrlOpenMethodFlowConfig implements DataFlow::ConfigSig {
any(HttpUrlsAdditionalTaintStep c).step(node1, node2)
}

predicate isBarrier(DataFlow::Node node) { node instanceof SimpleTypeSanitizer }
predicate isBarrier(DataFlow::Node node) {
node instanceof SimpleTypeSanitizer or
barrierNode(node, "java/non-https-url")
}

predicate observeDiffInformedIncrementalMode() { any() }
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import semmle.code.java.dataflow.TaintTracking
import semmle.code.java.frameworks.android.Intent
import semmle.code.java.frameworks.android.PendingIntent
import semmle.code.java.security.ImplicitPendingIntents
private import semmle.code.java.dataflow.ExternalFlow

/**
* A taint tracking configuration for implicit `PendingIntent`s
Expand All @@ -23,7 +24,10 @@ module ImplicitPendingIntentStartConfig implements DataFlow::StateConfigSig {
sink instanceof ImplicitPendingIntentSink and state instanceof MutablePendingIntent
}

predicate isBarrier(DataFlow::Node sanitizer) { sanitizer instanceof ExplicitIntentSanitizer }
predicate isBarrier(DataFlow::Node sanitizer) {
sanitizer instanceof ExplicitIntentSanitizer or
barrierNode(sanitizer, "java/android/implicit-pendingintents")
}

predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) {
any(ImplicitPendingIntentAdditionalTaintStep c).step(node1, node2)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import java
private import semmle.code.java.security.internal.ArraySizing
private import semmle.code.java.security.internal.BoundingChecks
private import semmle.code.java.dataflow.DataFlow
private import semmle.code.java.dataflow.ExternalFlow

/**
* A dataflow configuration to reason about improper validation of code-specified array index.
Expand All @@ -15,6 +16,10 @@ module BoundedFlowSourceConfig implements DataFlow::ConfigSig {
exists(CheckableArrayAccess arrayAccess | arrayAccess.canThrowOutOfBounds(sink.asExpr()))
}

predicate isBarrier(DataFlow::Node node) {
barrierNode(node, "java/improper-validation-of-array-index-code-specified")
}

predicate observeDiffInformedIncrementalMode() { any() }
}

Expand Down
Loading