Skip to content

Commit 3e93da7

Browse files
authored
Create and use shared SQL injection reporting metadata (#408)
1 parent e93537d commit 3e93da7

File tree

9 files changed

+76
-62
lines changed

9 files changed

+76
-62
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import io.codemodder.providers.sonar.ProvidedSonarScan;
88
import io.codemodder.providers.sonar.RuleHotspot;
99
import io.codemodder.providers.sonar.SonarRemediatingJavaParserChanger;
10+
import io.codemodder.remediation.GenericRemediationMetadata;
1011
import io.codemodder.sonar.model.Hotspot;
1112
import io.codemodder.sonar.model.SonarFinding;
1213
import java.util.List;
@@ -26,7 +27,7 @@ public final class SonarSQLInjectionCodemod extends SonarRemediatingJavaParserCh
2627
@Inject
2728
public SonarSQLInjectionCodemod(
2829
@ProvidedSonarScan(ruleId = "java:S2077") final RuleHotspot hotspots) {
29-
super(CodemodReporterStrategy.fromClasspath(SQLParameterizerCodemod.class), hotspots);
30+
super(GenericRemediationMetadata.SQL_INJECTION.reporter(), hotspots);
3031
this.hotspots = Objects.requireNonNull(hotspots);
3132
this.remediationStrategy = JavaParserSQLInjectionRemediatorStrategy.DEFAULT;
3233
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import io.codemodder.providers.sonar.ProvidedSonarScan;
77
import io.codemodder.providers.sonar.RuleIssue;
88
import io.codemodder.providers.sonar.SonarRemediatingJavaParserChanger;
9-
import io.codemodder.remediation.GenericVulnerabilityReporterStrategies;
9+
import io.codemodder.remediation.GenericRemediationMetadata;
1010
import io.codemodder.remediation.reflectioninjection.ReflectionInjectionRemediator;
1111
import io.codemodder.sonar.model.Issue;
1212
import java.util.Objects;
@@ -27,7 +27,7 @@ public final class SonarUnsafeReflectionRemediationCodemod
2727
@Inject
2828
public SonarUnsafeReflectionRemediationCodemod(
2929
@ProvidedSonarScan(ruleId = "java:S2658") final RuleIssue issues) {
30-
super(GenericVulnerabilityReporterStrategies.reflectionInjectionStrategy, issues);
30+
super(GenericRemediationMetadata.REFLECTION_INJECTION.reporter(), issues);
3131
this.remediator = ReflectionInjectionRemediator.DEFAULT;
3232
this.issues = Objects.requireNonNull(issues);
3333
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import io.codemodder.providers.sonar.ProvidedSonarScan;
77
import io.codemodder.providers.sonar.RuleIssue;
88
import io.codemodder.providers.sonar.SonarRemediatingJavaParserChanger;
9-
import io.codemodder.remediation.GenericVulnerabilityReporterStrategies;
9+
import io.codemodder.remediation.GenericRemediationMetadata;
1010
import io.codemodder.remediation.xxe.XXERemediator;
1111
import io.codemodder.sonar.model.Issue;
1212
import io.codemodder.sonar.model.SonarFinding;
@@ -26,7 +26,7 @@ public final class SonarXXECodemod extends SonarRemediatingJavaParserChanger {
2626

2727
@Inject
2828
public SonarXXECodemod(@ProvidedSonarScan(ruleId = "java:S2755") final RuleIssue issues) {
29-
super(GenericVulnerabilityReporterStrategies.xxeReporterStrategy, issues);
29+
super(GenericRemediationMetadata.XXE.reporter(), issues);
3030
this.issues = Objects.requireNonNull(issues);
3131
this.remediationStrategy = XXERemediator.DEFAULT;
3232
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package io.codemodder.remediation;
2+
3+
import io.codemodder.CodeChanger;
4+
import io.codemodder.CodemodReporterStrategy;
5+
6+
/** Reporter strategies that are useful without mentioning specific APIs. */
7+
public enum GenericRemediationMetadata {
8+
XXE("xxe"),
9+
JNDI("jndi-injection"),
10+
HEADER_INJECTION("header-injection"),
11+
REFLECTION_INJECTION("reflection-injection"),
12+
SQL_INJECTION("sql-injection");
13+
14+
private final CodemodReporterStrategy reporter;
15+
16+
GenericRemediationMetadata(final String dir) {
17+
this.reporter =
18+
CodemodReporterStrategy.fromClasspathDirectory(
19+
CodeChanger.class, "/generic-remediation-reports/" + dir);
20+
}
21+
22+
/** Get the reporter strategy for this vulnerability class. */
23+
public CodemodReporterStrategy reporter() {
24+
return reporter;
25+
}
26+
}

framework/codemodder-base/src/main/java/io/codemodder/remediation/GenericVulnerabilityReporterStrategies.java

Lines changed: 0 additions & 26 deletions
This file was deleted.
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
This change refactors SQL statements to be parameterized, rather than built by hand.
2+
3+
Without parameterization, developers must remember to escape inputs using the rules for that database. It's usually buggy, at the least -- and sometimes vulnerable.
4+
5+
Our changes look something like this:
6+
7+
```diff
8+
- Statement stmt = connection.createStatement();
9+
- ResultSet rs = stmt.executeQuery("SELECT * FROM users WHERE name = '" + user + "'");
10+
+ PreparedStatement stmt = connection.prepareStatement("SELECT * FROM users WHERE name = ?");
11+
+ stmt.setString(1, user);
12+
+ ResultSet rs = stmt.executeQuery();
13+
```
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"summary" : "Refactored to use parameterized SQL APIs",
3+
"change": "Parameterized SQL usage to prevent any bugs or vulnerabilities",
4+
"reviewGuidanceIJustification" : "Although there should be no functional differences, the rewrite here is complex and should be verified by a human.",
5+
"references" : [
6+
"https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html",
7+
"https://cwe.mitre.org/data/definitions/89.html"
8+
]
9+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package io.codemodder.remediation;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import io.codemodder.CodemodChange;
6+
import io.codemodder.CodemodReporterStrategy;
7+
import java.nio.file.Path;
8+
import org.junit.jupiter.params.ParameterizedTest;
9+
import org.junit.jupiter.params.provider.EnumSource;
10+
11+
final class GenericRemediationMetadataTest {
12+
13+
@ParameterizedTest
14+
@EnumSource(GenericRemediationMetadata.class)
15+
void it_can_find_generic_report_elements(final GenericRemediationMetadata metadata) {
16+
CodemodReporterStrategy reporter = metadata.reporter();
17+
assertThat(reporter.getReferences()).isNotEmpty();
18+
assertThat(reporter.getDescription()).isNotEmpty();
19+
assertThat(reporter.getSummary()).isNotEmpty();
20+
assertThat(reporter.getChange(Path.of("Foo.java"), CodemodChange.from(5))).isNotEmpty();
21+
}
22+
}

framework/codemodder-base/src/test/java/io/codemodder/remediation/GenericVulnerabilityReporterStrategiesTest.java

Lines changed: 0 additions & 31 deletions
This file was deleted.

0 commit comments

Comments
 (0)