Skip to content

Commit 56aba73

Browse files
authored
New rules, first implemented in CodeQL (#483)
This change introduces new remediation logic for weak crypto algorithms, and log injection, two unexciting vulnerability classes for different reasons, but for completeness, should be present.
1 parent f69332a commit 56aba73

File tree

23 files changed

+307611
-2
lines changed

23 files changed

+307611
-2
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,10 @@ public static List<Class<? extends CodeChanger>> asList() {
3434
CodeQLJDBCResourceLeakCodemod.class,
3535
CodeQLJEXLInjectionCodemod.class,
3636
CodeQLJNDIInjectionCodemod.class,
37+
CodeQLLogInjectionCodemod.class,
3738
CodeQLMavenSecureURLCodemod.class,
3839
CodeQLOutputResourceLeakCodemod.class,
40+
CodeQLPotentiallyUnsafeCryptoAlgorithmCodemod.class,
3941
CodeQLPredictableSeedCodemod.class,
4042
CodeQLRegexInjectionCodemod.class,
4143
CodeQLSQLInjectionCodemod.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.loginjection.LogInjectionRemediator;
11+
import java.util.Optional;
12+
import javax.inject.Inject;
13+
14+
/** A codemod for automatically fixing Log Injection from CodeQL. */
15+
@Codemod(
16+
id = "codeql:java/log-injection",
17+
reviewGuidance = ReviewGuidance.MERGE_WITHOUT_REVIEW,
18+
importance = Importance.HIGH,
19+
executionPriority = CodemodExecutionPriority.HIGH)
20+
public final class CodeQLLogInjectionCodemod extends CodeQLRemediationCodemod {
21+
22+
private final Remediator<Result> remediator;
23+
24+
@Inject
25+
public CodeQLLogInjectionCodemod(
26+
@ProvidedCodeQLScan(ruleId = "java/log-injection") final RuleSarif sarif) {
27+
super(GenericRemediationMetadata.LOG_INJECTION.reporter(), sarif);
28+
this.remediator = new LogInjectionRemediator<>();
29+
}
30+
31+
@Override
32+
public DetectorRule detectorRule() {
33+
return new DetectorRule(
34+
"log-injection",
35+
"Log Injection",
36+
"https://codeql.github.com/codeql-query-help/java/java-log-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 ->
50+
Optional.ofNullable(
51+
r.getLocations().get(0).getPhysicalLocation().getRegion().getEndLine()),
52+
r -> Optional.empty());
53+
}
54+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
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.weakcrypto.WeakCryptoAlgorithmRemediator;
11+
import java.util.Optional;
12+
import javax.inject.Inject;
13+
14+
/** A codemod for automatically fixing weak crypto algorithms. */
15+
@Codemod(
16+
id = "codeql:java/potentially-weak-cryptographic-algorithm",
17+
reviewGuidance = ReviewGuidance.MERGE_AFTER_REVIEW,
18+
importance = Importance.HIGH,
19+
executionPriority = CodemodExecutionPriority.HIGH)
20+
public final class CodeQLPotentiallyUnsafeCryptoAlgorithmCodemod extends CodeQLRemediationCodemod {
21+
22+
private final Remediator<Result> remediator;
23+
24+
@Inject
25+
public CodeQLPotentiallyUnsafeCryptoAlgorithmCodemod(
26+
@ProvidedCodeQLScan(ruleId = "java/potentially-weak-cryptographic-algorithm")
27+
final RuleSarif sarif) {
28+
super(GenericRemediationMetadata.WEAK_CRYPTO_ALGORITHM.reporter(), sarif);
29+
this.remediator = new WeakCryptoAlgorithmRemediator<>();
30+
}
31+
32+
@Override
33+
public DetectorRule detectorRule() {
34+
return new DetectorRule(
35+
"potentially-weak-cryptographic-algorithm",
36+
"Use of a potentially broken or risky cryptographic algorithm",
37+
"https://codeql.github.com/codeql-query-help/java/java-potentially-weak-cryptographic-algorithm/");
38+
}
39+
40+
@Override
41+
public CodemodFileScanningResult visit(
42+
final CodemodInvocationContext context, final CompilationUnit cu) {
43+
return remediator.remediateAll(
44+
cu,
45+
context.path().toString(),
46+
detectorRule(),
47+
ruleSarif.getResultsByLocationPath(context.path()),
48+
SarifFindingKeyUtil::buildFindingId,
49+
r -> r.getLocations().get(0).getPhysicalLocation().getRegion().getStartLine(),
50+
r ->
51+
Optional.ofNullable(
52+
r.getLocations().get(0).getPhysicalLocation().getRegion().getEndLine()),
53+
r -> Optional.empty());
54+
}
55+
}

core-codemods/src/test/java/io/codemodder/codemods/codeql/CodeQLJEXLInjectionCodemodTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,6 @@
66
@Metadata(
77
codemodType = CodeQLJEXLInjectionCodemod.class,
88
testResourceDir = "jexl-expression-injection",
9+
doRetransformTest = false,
910
dependencies = {})
1011
final class CodeQLJEXLInjectionCodemodTest implements CodemodTestMixin {}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package io.codemodder.codemods.codeql;
2+
3+
import io.codemodder.testutils.CodemodTestMixin;
4+
import io.codemodder.testutils.Metadata;
5+
6+
@Metadata(
7+
codemodType = CodeQLLogInjectionCodemod.class,
8+
testResourceDir = "codeql-log-injection",
9+
renameTestFile =
10+
"app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Templates.java",
11+
doRetransformTest = false,
12+
expectingFixesAtLines = {124},
13+
dependencies = {})
14+
final class CodeQLLogInjectionCodemodTest implements CodemodTestMixin {}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package io.codemodder.codemods.codeql;
2+
3+
import io.codemodder.testutils.CodemodTestMixin;
4+
import io.codemodder.testutils.Metadata;
5+
6+
@Metadata(
7+
codemodType = CodeQLPotentiallyUnsafeCryptoAlgorithmCodemod.class,
8+
testResourceDir = "codeql-potentially-unsafe-crypto-algorithm",
9+
renameTestFile = "app/src/main/java/org/apache/roller/weblogger/util/WSSEUtilities.java",
10+
expectingFixesAtLines = {38},
11+
doRetransformTest = false,
12+
dependencies = {})
13+
final class CodeQLPotentiallyUnsafeCryptoAlgorithmCodemodTest implements CodemodTestMixin {}

0 commit comments

Comments
 (0)