Skip to content

Commit

Permalink
Merge pull request #255 from CROSSINGTUD/issue206_ignoring_package
Browse files Browse the repository at this point in the history
Ignoring certain packages #206
  • Loading branch information
schlichtig authored Jan 11, 2024
2 parents fd09a8d + 4b9eed1 commit e339dec
Show file tree
Hide file tree
Showing 19 changed files with 638 additions and 62 deletions.
52 changes: 34 additions & 18 deletions CryptoAnalysis/src/main/java/crypto/HeadlessCryptoScanner.java
Original file line number Diff line number Diff line change
@@ -1,24 +1,12 @@
package crypto;

import java.io.File;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.common.base.Stopwatch;
import com.google.common.collect.Lists;

import boomerang.callgraph.ObservableDynamicICFG;
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;
import crypto.analysis.CrySLResultsReporter;
import crypto.analysis.CryptoScanner;
Expand All @@ -40,6 +28,8 @@
import crypto.rules.CrySLRule;
import crypto.rules.CrySLRuleReader;
import ideal.IDEALSeedSolver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import soot.Body;
import soot.BodyTransformer;
import soot.EntryPoints;
Expand All @@ -55,11 +45,19 @@
import soot.options.Options;
import typestate.TransitionFunction;

import java.io.File;
import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

public abstract class HeadlessCryptoScanner {

private static final Logger LOGGER = LoggerFactory.getLogger(HeadlessCryptoScanner.class);

private static CryptoScannerSettings settings = new CryptoScannerSettings();
private static final CryptoScannerSettings settings = new CryptoScannerSettings();
private static Stopwatch callGraphWatch;
private static List<CrySLRule> rules = Lists.newArrayList();
private static String rulesetRootPath;
Expand Down Expand Up @@ -197,7 +195,7 @@ protected void internalTransform(String phaseName, Map<String, String> options)

Set<ReportFormat> formats = reportFormats();

if (formats.size() > 0) {
if (!formats.isEmpty()) {
for (ReportFormat format : formats) {
switch (format) {
case CMD:
Expand Down Expand Up @@ -261,6 +259,17 @@ public Debugger<TransitionFunction> debugger(IDEALSeedSolver<TransitionFunction>
}
return super.debugger(solver, seed);
}

@Override
public Collection<String> getForbiddenPredicates() {
return forbiddenPredicates();
}

@Override
public Collection<String> getIgnoredSections() {
return ignoredSections();
}

};

if (providerDetection()) {
Expand Down Expand Up @@ -418,6 +427,14 @@ protected boolean providerDetection() {
protected boolean includeStatistics() {
return settings.isIncludeStatistics();
}

protected Collection<String> forbiddenPredicates() {
return settings.getForbiddenPredicates();
}

protected Collection<String> ignoredSections() {
return settings.getIgnoredSections();
}

private static String pathToJCE() {
// When whole program mode is disabled, the classpath misses jce.jar
Expand All @@ -441,5 +458,4 @@ private boolean isModularProject() {
boolean check = new File(moduleFile).exists();
return check;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,13 @@
import boomerang.jimple.Statement;
import boomerang.jimple.Val;
import boomerang.results.ForwardBoomerangResults;
import crypto.analysis.errors.ForbiddenPredicateError;
import crypto.analysis.errors.IncompleteOperationError;
import crypto.analysis.errors.RequiredPredicateError;
import crypto.analysis.errors.TypestateError;
import crypto.constraints.ConstraintSolver;
import crypto.constraints.EvaluableConstraint;
import crypto.extractparameter.CallSiteWithExtractedValue;
import crypto.extractparameter.CallSiteWithParamIndex;
import crypto.extractparameter.ExtractParameterAnalysis;
import crypto.extractparameter.ExtractedValue;
Expand Down Expand Up @@ -302,7 +305,8 @@ private boolean predicateParameterEquals(List<ICrySLPredicateParameter> paramete
private void expectPredicateOnOtherObject(CrySLPredicate predToBeEnsured, Statement currStmt, Val accessGraph, boolean satisfiesConstraintSytem) {
// TODO refactor this method.
boolean matched = false;
for (ClassSpecification spec : cryptoScanner.getClassSpecifictions()) {
EnsuredCrySLPredicate ensuredCrySLPredicate = new EnsuredCrySLPredicate(predToBeEnsured, parameterAnalysis.getCollectedValues());
for (ClassSpecification spec : cryptoScanner.getClassSpecifications()) {
if (accessGraph.value() == null) {
continue;
}
Expand All @@ -313,7 +317,8 @@ private void expectPredicateOnOtherObject(CrySLPredicate predToBeEnsured, Statem
if (satisfiesConstraintSytem) {
AnalysisSeedWithSpecification seed = cryptoScanner.getOrCreateSeedWithSpec(new AnalysisSeedWithSpecification(cryptoScanner, currStmt, accessGraph, spec));
matched = true;
seed.addEnsuredPredicateFromOtherRule(new EnsuredCrySLPredicate(predToBeEnsured, parameterAnalysis.getCollectedValues()));
seed.addEnsuredPredicateFromOtherRule(ensuredCrySLPredicate);
cryptoScanner.getPredicateHandler().reportForbiddenPredicate(ensuredCrySLPredicate, currStmt, seed);
}
}
}
Expand All @@ -323,7 +328,7 @@ private void expectPredicateOnOtherObject(CrySLPredicate predToBeEnsured, Statem
AnalysisSeedWithEnsuredPredicate seed = cryptoScanner.getOrCreateSeed(new Node<Statement, Val>(currStmt, accessGraph));
predicateHandler.expectPredicate(seed, currStmt, predToBeEnsured);
if (satisfiesConstraintSytem) {
seed.addEnsuredPredicate(new EnsuredCrySLPredicate(predToBeEnsured, parameterAnalysis.getCollectedValues()));
seed.addEnsuredPredicate(ensuredCrySLPredicate);
} else {
missingPredicates.add(new RequiredCrySLPredicate(predToBeEnsured, currStmt));
}
Expand Down
66 changes: 53 additions & 13 deletions CryptoAnalysis/src/main/java/crypto/analysis/CryptoScanner.java
Original file line number Diff line number Diff line change
@@ -1,26 +1,19 @@
package crypto.analysis;

import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.TimeUnit;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.common.base.Stopwatch;
import com.google.common.collect.Lists;

import boomerang.Query;
import boomerang.callgraph.ObservableICFG;
import boomerang.debugger.Debugger;
import boomerang.jimple.Statement;
import boomerang.jimple.Val;
import com.google.common.base.Stopwatch;
import com.google.common.collect.Lists;
import crypto.predicates.PredicateHandler;
import crypto.rules.CrySLRule;
import crypto.typestate.CrySLMethodToSootMethod;
import heros.utilities.DefaultValueMap;
import ideal.IDEALSeedSolver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import soot.MethodOrMethodContext;
import soot.Scene;
import soot.SootMethod;
Expand All @@ -30,6 +23,12 @@
import sync.pds.solver.nodes.Node;
import typestate.TransitionFunction;

import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.TimeUnit;

public abstract class CryptoScanner {

private final LinkedList<IAnalysisSeed> worklist = Lists.newLinkedList();
Expand Down Expand Up @@ -126,10 +125,16 @@ private void initialize() {
while (listener.hasNext()) {
MethodOrMethodContext next = listener.next();
SootMethod method = next.method();

if (method == null || !method.hasActiveBody() || !method.getDeclaringClass().isApplicationClass()) {
continue;
}
for (ClassSpecification spec : getClassSpecifictions()) {

if (isOnIgnoreSectionList(method)) {
continue;
}

for (ClassSpecification spec : getClassSpecifications()) {
spec.invokesForbiddenMethod(method);

for (Query seed : spec.getInitialSeeds(method)) {
Expand All @@ -139,14 +144,41 @@ private void initialize() {
}
}

public List<ClassSpecification> getClassSpecifictions() {
public List<ClassSpecification> getClassSpecifications() {
return specifications;
}

protected void addToWorkList(IAnalysisSeed analysisSeedWithSpecification) {
worklist.add(analysisSeedWithSpecification);
}

protected boolean isOnIgnoreSectionList(SootMethod method) {
String declaringClass = method.getDeclaringClass().getName();
String methodName = declaringClass + "." + method.getName();

for (String ignoredSection : getIgnoredSections()) {
// Check for class name
if (ignoredSection.equals(declaringClass)) {
logger.info("Ignoring seeds in class " + declaringClass);
return true;
}

// Check for method name
if (ignoredSection.equals(methodName)) {
logger.info("Ignoring seeds in method " + methodName);
return true;
}

// Check for wildcards (i.e. *)
if (ignoredSection.endsWith(".*") && declaringClass.startsWith(ignoredSection.substring(0, ignoredSection.length() - 2))) {
logger.info("Ignoring seeds in class " + declaringClass + " and method " + methodName);
return true;
}
}

return false;
}

public AnalysisSeedWithEnsuredPredicate getOrCreateSeed(Node<Statement,Val> factAtStatement) {
boolean addToWorklist = false;
if (!seedsWithoutSpec.containsKey(factAtStatement))
Expand Down Expand Up @@ -180,4 +212,12 @@ public PredicateHandler getPredicateHandler() {
public Collection<AnalysisSeedWithSpecification> getAnalysisSeeds() {
return this.seedsWithSpec.values();
}

public Collection<String> getForbiddenPredicates() {
return new ArrayList<>();
}

public Collection<String> getIgnoredSections() {
return new ArrayList<>();
}
}
Loading

0 comments on commit e339dec

Please sign in to comment.