Skip to content

Commit cf44894

Browse files
committed
Java: apply query alert restrictions
1 parent bf2e23b commit cf44894

File tree

60 files changed

+280
-13
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+280
-13
lines changed

java/ql/lib/semmle/code/java/security/CleartextStorageQuery.qll

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ abstract class Storable extends Call {
3636
abstract Expr getAStore();
3737
}
3838

39-
private module SensitiveSourceFlowConfig implements DataFlow::ConfigSig {
39+
/** Flow configuration for sensitive data flowing into cleartext storage. */
40+
module SensitiveSourceFlowConfig implements DataFlow::ConfigSig {
4041
predicate isSource(DataFlow::Node src) { src.asExpr() instanceof SensitiveExpr }
4142

4243
predicate isSink(DataFlow::Node sink) { sink instanceof CleartextStorageSink }

java/ql/lib/semmle/code/java/security/StackTraceExposureQuery.qll

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ private import semmle.code.java.security.InformationLeak
77
/**
88
* One of the `printStackTrace()` overloads on `Throwable`.
99
*/
10-
private class PrintStackTraceMethod extends Method {
10+
class PrintStackTraceMethod extends Method {
1111
PrintStackTraceMethod() {
1212
this.getDeclaringType()
1313
.getSourceDeclaration()
@@ -17,7 +17,11 @@ private class PrintStackTraceMethod extends Method {
1717
}
1818
}
1919

20-
private module ServletWriterSourceToPrintStackTraceMethodFlowConfig implements DataFlow::ConfigSig {
20+
/**
21+
* Flow configuration for xss vulnerable writer source flowing to `Throwable.printStackTrace()` on
22+
* a stream that is connected to external output.
23+
*/
24+
module ServletWriterSourceToPrintStackTraceMethodFlowConfig implements DataFlow::ConfigSig {
2125
predicate isSource(DataFlow::Node src) { src instanceof XssVulnerableWriterSourceNode }
2226

2327
predicate isSink(DataFlow::Node sink) {
@@ -55,7 +59,10 @@ private predicate printWriterOnStringWriter(Expr printWriter, Variable stringWri
5559
)
5660
}
5761

58-
private predicate stackTraceExpr(Expr exception, MethodCall stackTraceString) {
62+
/**
63+
* Holds if `stackTraceString` writes the stack trace from `exception` to a string.
64+
*/
65+
predicate stackTraceExpr(Expr exception, MethodCall stackTraceString) {
5966
exists(Expr printWriter, Variable stringWriterVar, MethodCall printStackCall |
6067
printWriterOnStringWriter(printWriter, stringWriterVar) and
6168
printStackCall.getMethod() instanceof PrintStackTraceMethod and
@@ -66,7 +73,8 @@ private predicate stackTraceExpr(Expr exception, MethodCall stackTraceString) {
6673
)
6774
}
6875

69-
private module StackTraceStringToHttpResponseSinkFlowConfig implements DataFlow::ConfigSig {
76+
/** Flow configuration for stack trace flowing to http response. */
77+
module StackTraceStringToHttpResponseSinkFlowConfig implements DataFlow::ConfigSig {
7078
predicate isSource(DataFlow::Node src) { stackTraceExpr(_, src.asExpr()) }
7179

7280
predicate isSink(DataFlow::Node sink) { sink instanceof InformationLeakSink }

java/ql/lib/semmle/code/java/security/UnsafeDeserializationQuery.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ deprecated class UnsafeDeserializationConfig extends TaintTracking::Configuratio
334334
}
335335

336336
/** Tracks flows from remote user input to a deserialization sink. */
337-
private module UnsafeDeserializationConfig implements DataFlow::ConfigSig {
337+
module UnsafeDeserializationConfig implements DataFlow::ConfigSig {
338338
predicate isSource(DataFlow::Node source) { source instanceof ThreatModelFlowSource }
339339

340340
predicate isSink(DataFlow::Node sink) { sink instanceof UnsafeDeserializationSink }

java/ql/src/Likely Bugs/Arithmetic/InformationLoss.ql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ Variable getVariable(Expr dest) {
3535

3636
from DangerousAssignOpExpr a, Expr e, Top v
3737
where
38+
AlertFiltering::filterByLocation(a.getLocation()) and
3839
e = a.getSource() and
3940
problematicCasting(a.getDest().getType(), e) and
4041
(

java/ql/src/Security/CWE/CWE-020/OverlyLargeRange.ql

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
* external/cwe/cwe-020
1313
*/
1414

15+
private import semmle.code.java.AlertFiltering
1516
private import semmle.code.java.regex.RegexTreeView::RegexTreeView as TreeView
1617
import codeql.regex.OverlyLargeRangeQuery::Make<TreeView>
1718

@@ -22,6 +23,7 @@ TreeView::RegExpCharacterClass potentialMisparsedCharClass() {
2223

2324
from TreeView::RegExpCharacterRange range, string reason
2425
where
26+
AlertFiltering::filterByLocation(range.getLocation()) and
2527
problem(range, reason) and
2628
not range.getParent() = potentialMisparsedCharClass()
2729
select range, "Suspicious character range that " + reason + "."

java/ql/src/Security/CWE/CWE-022/TaintedPath.ql

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@
1616
import java
1717
import semmle.code.java.security.PathCreation
1818
import semmle.code.java.security.TaintedPathQuery
19+
private import semmle.code.java.dataflow.DataFlowFiltering
20+
21+
module TaintedPathFlow = TaintTracking::Global<FilteredConfig<TaintedPathConfig>>;
22+
1923
import TaintedPathFlow::PathGraph
2024

2125
from TaintedPathFlow::PathNode source, TaintedPathFlow::PathNode sink

java/ql/src/Security/CWE/CWE-022/ZipSlip.ql

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

1515
import java
1616
import semmle.code.java.security.ZipSlipQuery
17+
private import semmle.code.java.dataflow.DataFlowFiltering
18+
19+
module ZipSlipFlow = TaintTracking::Global<FilteredConfig<ZipSlipConfig>>;
20+
1721
import ZipSlipFlow::PathGraph
1822

1923
from ZipSlipFlow::PathNode source, ZipSlipFlow::PathNode sink

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@
1111
*/
1212

1313
import semmle.code.java.security.PartialPathTraversalQuery
14+
private import semmle.code.java.dataflow.DataFlowFiltering
15+
16+
module PartialPathTraversalFromRemoteFlow =
17+
TaintTracking::Global<FilteredConfig<PartialPathTraversalFromRemoteConfig>>;
18+
1419
import PartialPathTraversalFromRemoteFlow::PathGraph
1520

1621
from

java/ql/src/Security/CWE/CWE-074/JndiInjection.ql

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@
1313

1414
import java
1515
import semmle.code.java.security.JndiInjectionQuery
16+
private import semmle.code.java.dataflow.DataFlowFiltering
17+
18+
module JndiInjectionFlow = TaintTracking::Global<FilteredConfig<JndiInjectionFlowConfig>>;
19+
1620
import JndiInjectionFlow::PathGraph
1721

1822
from JndiInjectionFlow::PathNode source, JndiInjectionFlow::PathNode sink

java/ql/src/Security/CWE/CWE-074/XsltInjection.ql

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@
1313

1414
import java
1515
import semmle.code.java.security.XsltInjectionQuery
16+
private import semmle.code.java.dataflow.DataFlowFiltering
17+
18+
module XsltInjectionFlow = TaintTracking::Global<FilteredConfig<XsltInjectionFlowConfig>>;
19+
1620
import XsltInjectionFlow::PathGraph
1721

1822
from XsltInjectionFlow::PathNode source, XsltInjectionFlow::PathNode sink

java/ql/src/Security/CWE/CWE-078/ExecTainted.ql

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,21 @@
1414

1515
import java
1616
import semmle.code.java.security.CommandLineQuery
17+
private import semmle.code.java.dataflow.DataFlowFiltering
18+
private import semmle.code.java.dataflow.TaintTracking
19+
20+
module InputToArgumentToExecFlow =
21+
TaintTracking::Global<FilteredConfig<InputToArgumentToExecFlowConfig>>;
22+
1723
import InputToArgumentToExecFlow::PathGraph
1824

25+
predicate execIsTainted(
26+
InputToArgumentToExecFlow::PathNode source, InputToArgumentToExecFlow::PathNode sink, Expr execArg
27+
) {
28+
InputToArgumentToExecFlow::flowPath(source, sink) and
29+
argumentToExec(execArg, sink.getNode())
30+
}
31+
1932
from
2033
InputToArgumentToExecFlow::PathNode source, InputToArgumentToExecFlow::PathNode sink, Expr execArg
2134
where execIsTainted(source, sink, execArg)

java/ql/src/Security/CWE/CWE-078/ExecUnescaped.ql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ predicate builtFromUncontrolledConcat(Expr expr) {
4747

4848
from StringArgumentToExec argument
4949
where
50+
AlertFiltering::filterByLocation(argument.getLocation()) and
5051
builtFromUncontrolledConcat(argument) and
5152
not execIsTainted(_, _, argument)
5253
select argument, "Command line is built with string concatenation."

java/ql/src/Security/CWE/CWE-079/XSS.ql

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@
1313

1414
import java
1515
import semmle.code.java.security.XssQuery
16+
private import semmle.code.java.dataflow.DataFlowFiltering
17+
18+
module XssFlow = TaintTracking::Global<FilteredConfig<XssConfig>>;
19+
1620
import XssFlow::PathGraph
1721

1822
from XssFlow::PathNode source, XssFlow::PathNode sink

java/ql/src/Security/CWE/CWE-089/SqlTainted.ql

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,18 @@
1515
import java
1616
import semmle.code.java.dataflow.FlowSources
1717
import semmle.code.java.security.SqlInjectionQuery
18+
private import semmle.code.java.dataflow.DataFlowFiltering
19+
20+
module QueryInjectionFlow = TaintTracking::Global<FilteredConfig<QueryInjectionFlowConfig>>;
21+
1822
import QueryInjectionFlow::PathGraph
1923

24+
predicate queryIsTaintedBy(
25+
QueryInjectionSink query, QueryInjectionFlow::PathNode source, QueryInjectionFlow::PathNode sink
26+
) {
27+
QueryInjectionFlow::flowPath(source, sink) and sink.getNode() = query
28+
}
29+
2030
from
2131
QueryInjectionSink query, QueryInjectionFlow::PathNode source, QueryInjectionFlow::PathNode sink
2232
where queryIsTaintedBy(query, source, sink)

java/ql/src/Security/CWE/CWE-090/LdapInjection.ql

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@
1414
import java
1515
import semmle.code.java.dataflow.FlowSources
1616
import semmle.code.java.security.LdapInjectionQuery
17+
private import semmle.code.java.dataflow.DataFlowFiltering
18+
19+
module LdapInjectionFlow = TaintTracking::Global<FilteredConfig<LdapInjectionFlowConfig>>;
20+
1721
import LdapInjectionFlow::PathGraph
1822

1923
from LdapInjectionFlow::PathNode source, LdapInjectionFlow::PathNode sink

java/ql/src/Security/CWE/CWE-094/GroovyInjection.ql

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@
1313

1414
import java
1515
import semmle.code.java.security.GroovyInjectionQuery
16+
private import semmle.code.java.dataflow.DataFlowFiltering
17+
18+
module GroovyInjectionFlow = TaintTracking::Global<FilteredConfig<GroovyInjectionConfig>>;
19+
1620
import GroovyInjectionFlow::PathGraph
1721

1822
from GroovyInjectionFlow::PathNode source, GroovyInjectionFlow::PathNode sink

java/ql/src/Security/CWE/CWE-094/InsecureBeanValidation.ql

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@
1212

1313
import java
1414
import semmle.code.java.security.InsecureBeanValidationQuery
15+
private import semmle.code.java.dataflow.DataFlowFiltering
16+
17+
module BeanValidationFlow = TaintTracking::Global<FilteredConfig<BeanValidationConfig>>;
18+
1519
import BeanValidationFlow::PathGraph
1620

1721
from BeanValidationFlow::PathNode source, BeanValidationFlow::PathNode sink

java/ql/src/Security/CWE/CWE-094/JexlInjection.ql

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@
1313

1414
import java
1515
import semmle.code.java.security.JexlInjectionQuery
16+
private import semmle.code.java.dataflow.DataFlowFiltering
17+
18+
module JexlInjectionFlow = TaintTracking::Global<FilteredConfig<JexlInjectionConfig>>;
19+
1620
import JexlInjectionFlow::PathGraph
1721

1822
from JexlInjectionFlow::PathNode source, JexlInjectionFlow::PathNode sink

java/ql/src/Security/CWE/CWE-094/MvelInjection.ql

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@
1313

1414
import java
1515
import semmle.code.java.security.MvelInjectionQuery
16+
private import semmle.code.java.dataflow.DataFlowFiltering
17+
18+
module MvelInjectionFlow = TaintTracking::Global<FilteredConfig<MvelInjectionFlowConfig>>;
19+
1620
import MvelInjectionFlow::PathGraph
1721

1822
from MvelInjectionFlow::PathNode source, MvelInjectionFlow::PathNode sink

java/ql/src/Security/CWE/CWE-094/SpelInjection.ql

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,11 @@
1313

1414
import java
1515
import semmle.code.java.security.SpelInjectionQuery
16-
import semmle.code.java.dataflow.DataFlow
16+
import semmle.code.java.dataflow.TaintTracking
17+
private import semmle.code.java.dataflow.DataFlowFiltering
18+
19+
module SpelInjectionFlow = TaintTracking::Global<FilteredConfig<SpelInjectionConfig>>;
20+
1721
import SpelInjectionFlow::PathGraph
1822

1923
from SpelInjectionFlow::PathNode source, SpelInjectionFlow::PathNode sink

java/ql/src/Security/CWE/CWE-094/TemplateInjection.ql

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@
1313

1414
import java
1515
import semmle.code.java.security.TemplateInjectionQuery
16+
private import semmle.code.java.dataflow.DataFlowFiltering
17+
18+
module TemplateInjectionFlow = TaintTracking::Global<FilteredConfig<TemplateInjectionFlowConfig>>;
19+
1620
import TemplateInjectionFlow::PathGraph
1721

1822
from TemplateInjectionFlow::PathNode source, TemplateInjectionFlow::PathNode sink

java/ql/src/Security/CWE/CWE-113/NettyResponseSplitting.ql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,4 +93,5 @@ private class InsecureDefaultFullHttpRequestClassInstantiation extends RequestSp
9393
}
9494

9595
from InsecureNettyObjectCreation new
96+
where AlertFiltering::filterByLocation(new.getLocation())
9697
select new, new.splittingType() + " vulnerability due to header value verification being disabled."

java/ql/src/Security/CWE/CWE-113/ResponseSplitting.ql

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@
1313

1414
import java
1515
import semmle.code.java.security.ResponseSplittingQuery
16+
private import semmle.code.java.dataflow.DataFlowFiltering
17+
18+
module ResponseSplittingFlow = TaintTracking::Global<FilteredConfig<ResponseSplittingConfig>>;
19+
1620
import ResponseSplittingFlow::PathGraph
1721

1822
from ResponseSplittingFlow::PathNode source, ResponseSplittingFlow::PathNode sink

java/ql/src/Security/CWE/CWE-1204/StaticInitializationVector.ql

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@
1313

1414
import java
1515
import semmle.code.java.security.StaticInitializationVectorQuery
16+
private import semmle.code.java.dataflow.DataFlowFiltering
17+
18+
module StaticInitializationVectorFlow =
19+
TaintTracking::Global<FilteredConfig<StaticInitializationVectorConfig>>;
20+
1621
import StaticInitializationVectorFlow::PathGraph
1722

1823
from StaticInitializationVectorFlow::PathNode source, StaticInitializationVectorFlow::PathNode sink

java/ql/src/Security/CWE/CWE-134/ExternallyControlledFormatString.ql

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,14 @@
1111
*/
1212

1313
import java
14+
import semmle.code.java.dataflow.TaintTracking
1415
import semmle.code.java.security.ExternallyControlledFormatStringQuery
1516
import semmle.code.java.StringFormat
17+
private import semmle.code.java.dataflow.DataFlowFiltering
18+
19+
module ExternallyControlledFormatStringFlow =
20+
TaintTracking::Global<FilteredConfig<ExternallyControlledFormatStringConfig>>;
21+
1622
import ExternallyControlledFormatStringFlow::PathGraph
1723

1824
from

java/ql/src/Security/CWE/CWE-209/StackTraceExposure.ql

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,35 @@
1515

1616
import java
1717
import semmle.code.java.dataflow.DataFlow
18+
import semmle.code.java.dataflow.TaintTracking
1819
import semmle.code.java.security.StackTraceExposureQuery
20+
private import semmle.code.java.dataflow.DataFlowFiltering
21+
22+
private module ServletWriterSourceToPrintStackTraceMethodFlow =
23+
TaintTracking::Global<FilteredConfig<ServletWriterSourceToPrintStackTraceMethodFlowConfig>>;
24+
25+
private predicate printsStackToWriter(MethodCall call) {
26+
exists(PrintStackTraceMethod printStackTrace |
27+
call.getMethod() = printStackTrace and
28+
ServletWriterSourceToPrintStackTraceMethodFlow::flowToExpr(call.getAnArgument())
29+
)
30+
}
31+
32+
predicate printsStackExternally(MethodCall call, Expr stackTrace) {
33+
printsStackToWriter(call) and
34+
call.getQualifier() = stackTrace and
35+
not call.getQualifier() instanceof SuperAccess
36+
}
37+
38+
private module StackTraceStringToHttpResponseSinkFlow =
39+
TaintTracking::Global<FilteredConfig<StackTraceStringToHttpResponseSinkFlowConfig>>;
40+
41+
predicate stringifiedStackFlowsExternally(DataFlow::Node externalExpr, Expr stackTrace) {
42+
exists(MethodCall stackTraceString |
43+
stackTraceExpr(stackTrace, stackTraceString) and
44+
StackTraceStringToHttpResponseSinkFlow::flow(DataFlow::exprNode(stackTraceString), externalExpr)
45+
)
46+
}
1947

2048
from Expr externalExpr, Expr errorInformation
2149
where

java/ql/src/Security/CWE/CWE-266/IntentUriPermissionManipulation.ql

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,12 @@
1414

1515
import java
1616
import semmle.code.java.security.IntentUriPermissionManipulationQuery
17-
import semmle.code.java.dataflow.DataFlow
17+
import semmle.code.java.dataflow.TaintTracking
18+
private import semmle.code.java.dataflow.DataFlowFiltering
19+
20+
module IntentUriPermissionManipulationFlow =
21+
TaintTracking::Global<FilteredConfig<IntentUriPermissionManipulationConfig>>;
22+
1823
import IntentUriPermissionManipulationFlow::PathGraph
1924

2025
from

java/ql/src/Security/CWE/CWE-287/AndroidInsecureLocalAuthentication.ql

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,7 @@ import java
1414
import semmle.code.java.security.AndroidLocalAuthQuery
1515

1616
from AuthenticationSuccessCallback c
17-
where not exists(c.getAResultUse())
17+
where
18+
AlertFiltering::filterByLocation(c.getLocation()) and
19+
not exists(c.getAResultUse())
1820
select c, "This authentication callback does not use its result for a cryptographic operation."

java/ql/src/Security/CWE/CWE-295/ImproperWebViewCertificateValidation.ql

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,7 @@ import java
1414
import semmle.code.java.security.AndroidWebViewCertificateValidationQuery
1515

1616
from OnReceivedSslErrorMethod m
17-
where trustsAllCerts(m)
17+
where
18+
AlertFiltering::filterByLocation(m.getLocation()) and
19+
trustsAllCerts(m)
1820
select m, "This handler accepts all SSL certificates."

0 commit comments

Comments
 (0)