Skip to content

Commit a117920

Browse files
committed
add regex injection fixer with codeql for first example
1 parent 3ee3ad9 commit a117920

File tree

13 files changed

+103589
-1
lines changed

13 files changed

+103589
-1
lines changed

core-codemods/src/main/java/io/codemodder/codemods/DefaultCodemods.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ public static List<Class<? extends CodeChanger>> asList() {
3636
CodeQLMavenSecureURLCodemod.class,
3737
CodeQLOutputResourceLeakCodemod.class,
3838
CodeQLPredictableSeedCodemod.class,
39+
CodeQLRegexInjectionCodemod.class,
3940
CodeQLSQLInjectionCodemod.class,
4041
CodeQLSSRFCodemod.class,
4142
CodeQLStackTraceExposureCodemod.class,
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package io.codemodder.codemods.codeql;
2+
3+
import com.contrastsecurity.sarif.Result;
4+
import com.github.javaparser.ast.CompilationUnit;
5+
import io.codemodder.*;
6+
import io.codemodder.codetf.DetectorRule;
7+
import io.codemodder.providers.sarif.codeql.ProvidedCodeQLScan;
8+
import io.codemodder.remediation.GenericRemediationMetadata;
9+
import io.codemodder.remediation.Remediator;
10+
import io.codemodder.remediation.regexinjection.RegexInjectionRemediator;
11+
import java.util.Optional;
12+
import javax.inject.Inject;
13+
14+
/** A codemod for automatically fixing Regex Injections from CodeQL. */
15+
@Codemod(
16+
id = "codeql:java/regex-injection",
17+
reviewGuidance = ReviewGuidance.MERGE_AFTER_CURSORY_REVIEW,
18+
importance = Importance.HIGH,
19+
executionPriority = CodemodExecutionPriority.HIGH)
20+
public final class CodeQLRegexInjectionCodemod extends CodeQLRemediationCodemod {
21+
22+
private final Remediator<Result> remediator;
23+
24+
@Inject
25+
public CodeQLRegexInjectionCodemod(
26+
@ProvidedCodeQLScan(ruleId = "java/regex-injection") final RuleSarif sarif) {
27+
super(GenericRemediationMetadata.REGEX_INJECTION.reporter(), sarif);
28+
this.remediator = new RegexInjectionRemediator<>();
29+
}
30+
31+
@Override
32+
public DetectorRule detectorRule() {
33+
return new DetectorRule(
34+
"regex-injectiom",
35+
"Regular expression injection",
36+
"https://codeql.github.com/codeql-query-help/java/java-regex-injection/");
37+
}
38+
39+
@Override
40+
public CodemodFileScanningResult visit(
41+
final CodemodInvocationContext context, final CompilationUnit cu) {
42+
return remediator.remediateAll(
43+
cu,
44+
context.path().toString(),
45+
detectorRule(),
46+
ruleSarif.getResultsByLocationPath(context.path()),
47+
SarifFindingKeyUtil::buildFindingId,
48+
r -> r.getLocations().get(0).getPhysicalLocation().getRegion().getStartLine(),
49+
r -> Optional.of(r.getLocations().get(0).getPhysicalLocation().getRegion().getEndLine()),
50+
r ->
51+
Optional.of(
52+
r.getLocations().get(0).getPhysicalLocation().getRegion().getStartColumn()));
53+
}
54+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package io.codemodder.codemods.codeql;
2+
3+
import io.codemodder.testutils.CodemodTestMixin;
4+
import io.codemodder.testutils.Metadata;
5+
import org.junit.jupiter.api.Nested;
6+
7+
final class CodeQLRegexInjectionCodemodTest {
8+
9+
@Nested
10+
@Metadata(
11+
codemodType = CodeQLRegexInjectionCodemod.class,
12+
testResourceDir = "codeql-regex-injection/bannedwordlist",
13+
renameTestFile = "app/src/main/java/org/apache/roller/weblogger/util/Bannedwordslist.java",
14+
expectingFixesAtLines = 438,
15+
doRetransformTest = false,
16+
dependencies = {})
17+
class BannedWordlistTest implements CodemodTestMixin {}
18+
19+
@Nested
20+
@Metadata(
21+
codemodType = CodeQLRegexInjectionCodemod.class,
22+
testResourceDir = "codeql-regex-injection/regexutil",
23+
renameTestFile = "app/src/main/java/org/apache/roller/util/RegexUtil.java",
24+
expectingFixesAtLines = {71, 66, 49},
25+
doRetransformTest = false,
26+
dependencies = {})
27+
class RegexUtilTest implements CodemodTestMixin {}
28+
}

0 commit comments

Comments
 (0)