Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merge develop for new release #535

Merged
merged 28 commits into from
Mar 15, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
2059bdc
Bump soot from 4.2.1 to 4.4.1
dependabot[bot] Nov 17, 2023
f66919b
Bump org.slf4j:slf4j-simple from 2.0.11 to 2.0.12
dependabot[bot] Feb 12, 2024
cfc2799
Bump org.slf4j:slf4j-api from 2.0.11 to 2.0.12
dependabot[bot] Feb 12, 2024
be892c5
Merge pull request #524 from CROSSINGTUD/dependabot/maven/org.slf4j-s…
schlichtig Feb 13, 2024
0afb936
Merge pull request #525 from CROSSINGTUD/dependabot/maven/org.slf4j-s…
schlichtig Feb 14, 2024
7dd0d4f
Merge branch 'develop' into dependabot/maven/org.soot-oss-soot-4.4.1
smeyer198 Feb 16, 2024
3d80bc5
Add transformer architecture to deal with new features from Soot 4.4.1
smeyer198 Feb 19, 2024
a84be9b
Merge pull request #431 from CROSSINGTUD/dependabot/maven/org.soot-os…
schlichtig Feb 19, 2024
2817db0
output warning when GitHub won't display all annotations
Timbals Feb 28, 2024
6d7014d
group log output for the setup
Timbals Feb 28, 2024
a98ea78
output the default command line report for `GitHubAnnotationReporter`
Timbals Feb 28, 2024
cc81b55
add `GITHUB_ANNOTATION` report option to the `README.md`
Timbals Feb 29, 2024
7d58701
Bump org.eclipse.emf:org.eclipse.emf.ecore from 2.35.0 to 2.36.0
dependabot[bot] Mar 4, 2024
59902d7
Bump org.eclipse.xtext:org.eclipse.xtext.xbase from 2.33.0 to 2.34.0
dependabot[bot] Mar 4, 2024
b8e6e66
Bump org.eclipse.emf:org.eclipse.emf.common from 2.29.0 to 2.30.0
dependabot[bot] Mar 4, 2024
ed85404
Merge pull request #528 from CROSSINGTUD/dependabot/maven/org.eclipse…
schlichtig Mar 8, 2024
b0ce3c2
Remove scopes to have dependencies on classpath at runtime
smeyer198 Mar 8, 2024
d5914f6
Merge pull request #529 from CROSSINGTUD/dependabot/maven/org.eclipse…
schlichtig Mar 8, 2024
afa3a3c
Merge pull request #530 from CROSSINGTUD/dependabot/maven/org.eclipse…
schlichtig Mar 8, 2024
33c2a1d
Swap Type and Name of CrySLObject for instanceOf and neverTypeOf pred…
smeyer198 Mar 8, 2024
9d60b5b
Report IncompleteOperationErrors only once for each dataflow path wit…
smeyer198 Mar 10, 2024
2229ffa
Bump com.fasterxml.jackson.core:jackson-databind from 2.16.1 to 2.16.2
dependabot[bot] Mar 11, 2024
14ba3b9
Merge pull request #531 from CROSSINGTUD/dependabot/maven/com.fasterx…
schlichtig Mar 12, 2024
b440c21
Merge pull request #527 from Timbals/annotations-limit-workaround
schlichtig Mar 12, 2024
b086bd2
Merge pull request #532 from CROSSINGTUD/fix/classpath-scopes
schlichtig Mar 12, 2024
63969b9
Merge pull request #533 from CROSSINGTUD/fix/parameter_order
schlichtig Mar 12, 2024
776d662
Add tests for IncompleteOperationErrors
smeyer198 Mar 13, 2024
ffc1e7f
Merge pull request #534 from CROSSINGTUD/fix/incomplete_operation_errors
schlichtig Mar 14, 2024
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
17 changes: 7 additions & 10 deletions CryptoAnalysis/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@

<properties>
<spdsVersion>2.5.1</spdsVersion>
<sootVersion>4.2.1</sootVersion>
<sootVersion>4.4.1</sootVersion>
</properties>
<build>
<pluginManagement>
Expand Down Expand Up @@ -308,7 +308,6 @@
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk18on</artifactId>
<version>1.77</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.bouncycastle/bctls-jdk18on -->
<dependency>
Expand All @@ -319,18 +318,17 @@
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.11</version>
<version>2.0.12</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>2.0.11</version>
<version>2.0.12</version>
</dependency>
<dependency>
<groupId>com.google.crypto.tink</groupId>
<artifactId>tink</artifactId>
<version>1.3.0</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
Expand All @@ -346,31 +344,30 @@
<dependency>
<groupId>org.eclipse.xtext</groupId>
<artifactId>org.eclipse.xtext.xbase</artifactId>
<version>2.33.0</version>
<version>2.34.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.eclipse.emf/org.eclipse.emf.common -->
<dependency>
<groupId>org.eclipse.emf</groupId>
<artifactId>org.eclipse.emf.common</artifactId>
<version>2.29.0</version>
<version>2.30.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.eclipse.emf/org.eclipse.emf.ecore -->
<dependency>
<groupId>org.eclipse.emf</groupId>
<artifactId>org.eclipse.emf.ecore</artifactId>
<version>2.35.0</version>
<version>2.36.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.16.1</version>
<version>2.16.2</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
Expand Down
22 changes: 15 additions & 7 deletions CryptoAnalysis/src/main/java/crypto/HeadlessCryptoScanner.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import boomerang.callgraph.ObservableICFG;
import boomerang.debugger.Debugger;
import boomerang.debugger.IDEVizDebugger;
import boomerang.preanalysis.BoomerangPretransformer;
import com.google.common.base.Stopwatch;
import com.google.common.collect.Lists;
import crypto.analysis.CrySLAnalysisListener;
Expand All @@ -16,8 +15,8 @@
import crypto.analysis.IAnalysisSeed;
import crypto.exceptions.CryptoAnalysisException;
import crypto.exceptions.CryptoAnalysisParserException;
import crypto.preanalysis.ExceptionAwareTransformer;
import crypto.preanalysis.SeedFactory;
import crypto.preanalysis.TransformerSetup;
import crypto.providerdetection.ProviderDetection;
import crypto.reporting.CSVReporter;
import crypto.reporting.CSVSummaryReporter;
Expand Down Expand Up @@ -138,7 +137,7 @@ public void exec() {
} catch (CryptoAnalysisException e) {
LOGGER.error("Error happened when executing HeadlessCryptoScanner.", e);
}
ExceptionAwareTransformer.setup(rules);

LOGGER.info("Analysis soot setup done in {} ", stopwatch);
analyse();
LOGGER.info("Analysis finished in {}", stopwatch);
Expand Down Expand Up @@ -189,8 +188,8 @@ private Transformer createAnalysisTransformer() {

@Override
protected void internalTransform(String phaseName, Map<String, String> options) {
BoomerangPretransformer.v().reset();
BoomerangPretransformer.v().apply();
TransformerSetup.v().setupPreTransformer(rules);

ObservableDynamicICFG observableDynamicICFG = new ObservableDynamicICFG(false);
List<CrySLRule> rules = HeadlessCryptoScanner.rules;

Expand Down Expand Up @@ -336,6 +335,14 @@ private void initializeSootWithEntryPointAllReachable(boolean wholeProgram) thro
Options.v().set_no_bodies_for_excluded(true);
Options.v().set_allow_phantom_refs(true);
Options.v().set_keep_line_number(true);

/* This phase is new in soot 4.3.0 and manipulates the jimple code in a
* way that CryptoAnalysis is not able to find seeds in some cases (see
* https://github.com/CROSSINGTUD/CryptoAnalysis/issues/293). Therefore,
* it is disabled.
*/
Options.v().setPhaseOption("jb.sils", "enabled:false");

// JAVA 8
if(getJavaVersion() < 9)
{
Expand Down Expand Up @@ -380,13 +387,14 @@ private List<String> getIncludeList() {
includeList.add("java.lang.String");
includeList.add("java.lang.StringCoding");
includeList.add("java.lang.StringIndexOutOfBoundsException");
return includeList;
return new LinkedList<>();
}

private List<String> getExcludeList() {
List<String> exList = new LinkedList<String>();
List<CrySLRule> rules = getRules();
for(CrySLRule r : rules) {

for (CrySLRule r : rules) {
exList.add(r.getClassName());
}
return exList;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,31 +1,18 @@
package crypto.analysis;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;

import boomerang.callgraph.ObservableICFG;
import boomerang.debugger.Debugger;
import boomerang.jimple.AllocVal;
import boomerang.jimple.Statement;
import boomerang.jimple.Val;
import boomerang.results.ForwardBoomerangResults;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Multimap;
import com.google.common.collect.Sets;
import com.google.common.collect.Table;
import com.google.common.collect.Table.Cell;

import boomerang.callgraph.ObservableICFG;
import boomerang.debugger.Debugger;
import boomerang.jimple.AllocVal;
import boomerang.jimple.Statement;
import boomerang.jimple.Val;
import boomerang.results.ForwardBoomerangResults;
import crypto.analysis.errors.AbstractError;
import crypto.analysis.errors.IncompleteOperationError;
import crypto.analysis.errors.RequiredPredicateError;
Expand Down Expand Up @@ -61,14 +48,25 @@
import soot.jimple.Constant;
import soot.jimple.IntConstant;
import soot.jimple.InvokeExpr;
import soot.jimple.Stmt;
import soot.jimple.StringConstant;
import soot.jimple.ThrowStmt;
import sync.pds.solver.nodes.Node;
import typestate.TransitionFunction;
import typestate.finiteautomata.ITransition;
import typestate.finiteautomata.State;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.stream.Collectors;

public class AnalysisSeedWithSpecification extends IAnalysisSeed {

private final ClassSpecification spec;
Expand Down Expand Up @@ -182,9 +180,10 @@ private void computeTypestateErrorUnits() {

private void computeTypestateErrorsForEndOfObjectLifeTime() {
Table<Statement, Val, TransitionFunction> endPathOfPropagation = results.getObjectDestructingStatements();
Map<Statement, Set<SootMethod>> incompleteOperations = new HashMap<>();

for (Cell<Statement, Val, TransitionFunction> c : endPathOfPropagation.cellSet()) {
Set<SootMethod> expectedMethodsToBeCalled = Sets.newHashSet();
Set<SootMethod> expectedMethodsToBeCalled = new HashSet<>();

for (ITransition n : c.getValue().values()) {
if (n.to() == null) {
Expand All @@ -209,18 +208,89 @@ private void computeTypestateErrorsForEndOfObjectLifeTime() {
}

if (!expectedMethodsToBeCalled.isEmpty()) {
Statement s = c.getRowKey();
Val val = c.getColumnKey();
incompleteOperations.put(c.getRowKey(), expectedMethodsToBeCalled);
}
}

// No incomplete operations were found
if (incompleteOperations.entrySet().isEmpty()) {
return;
}

/* If there is only one incomplete operation, then there is only one dataflow path. Hence,
* the error can be reported directly.
*/
if (incompleteOperations.entrySet().size() == 1) {
Entry<Statement, Set<SootMethod>> entry = incompleteOperations.entrySet().iterator().next();
Statement s = entry.getKey();
Set<SootMethod> methodsToBeCalled = entry.getValue();

if (!s.getUnit().isPresent()) {
return;
}

if (s.getUnit().get() instanceof ThrowStmt) {
return;
}

IncompleteOperationError incompleteOperationError = new IncompleteOperationError(this, s, spec.getRule(), methodsToBeCalled);
this.addError(incompleteOperationError);
cryptoScanner.getAnalysisListener().reportError(this, incompleteOperationError);
}

/* Multiple incomplete operations were found. Depending on the dataflow paths, the
* errors are reported:
* 1) A dataflow path ends in an accepting state: No error is reported
* 2) A dataflow path does not end in an accepting state: Report the error on the last used statement on this path
*/
if (incompleteOperations.size() > 1) {
for (Entry<Statement, Set<SootMethod>> entry : incompleteOperations.entrySet()) {
Statement statement = entry.getKey();
Set<SootMethod> expectedMethodsToBeCalled = entry.getValue();

// Extract the called SootMethod from the statement
if (!statement.getUnit().isPresent()) {
continue;
}

if (statement.getUnit().get() instanceof ThrowStmt) {
continue;
}

if (!statement.getUnit().get().containsInvokeExpr()) {
continue;
}

if (!(s.getUnit().get() instanceof ThrowStmt)) {
IncompleteOperationError incompleteOperationError = new IncompleteOperationError(s, val, getSpec().getRule(), this, expectedMethodsToBeCalled);
this.addError(incompleteOperationError);
cryptoScanner.getAnalysisListener().reportError(this, incompleteOperationError);
// Only if the path does not end in an accepting state, the error should be reported
InvokeExpr invokeExpr = statement.getUnit().get().getInvokeExpr();
if (isMethodToAcceptingState(invokeExpr.getMethod())) {
continue;
}

IncompleteOperationError incompleteOperationError = new IncompleteOperationError(this, statement, spec.getRule(), expectedMethodsToBeCalled, true);
this.addError(incompleteOperationError);
cryptoScanner.getAnalysisListener().reportError(this, incompleteOperationError);
}
}
}

private boolean isMethodToAcceptingState(SootMethod method) {
Collection<TransitionEdge> transitions = spec.getRule().getUsagePattern().getAllTransitions();
Collection<CrySLMethod> methods = CrySLMethodToSootMethod.v().convert(method);

for (TransitionEdge edge : transitions) {
if (edge.getLabel().stream().noneMatch(e -> methods.contains(e))) {
continue;
}

if (edge.to().getAccepting()) {
return true;
}
}

return false;
}

private void typeStateChangeAtStatement(Statement curr, State stateNode) {
if (typeStateChange.put(curr, stateNode)) {
if (stateNode instanceof ReportingErrorStateNode) {
Expand Down
Loading
Loading