Skip to content

Commit 9fe0a17

Browse files
authored
New CodeQL Error Message Exposure codemod (#471)
Rewrote StackTraceExposureCodemod with the remediator API. Also added support for a new case. Fixed a node position matching bug. Had to adjust/fix some codemods and tests. Fixed flakyness from a codemod. \close #work
1 parent 4e332a1 commit 9fe0a17

27 files changed

+51930
-117
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public static List<Class<? extends CodeChanger>> asList() {
2727
AddMissingOverrideCodemod.class,
2828
AvoidImplicitPublicConstructorCodemod.class,
2929
CodeQLDeserializationOfUserControlledDataCodemod.class,
30+
CodeQLErrorMessageExposureCodemod.class,
3031
CodeQLHttpResponseSplittingCodemod.class,
3132
CodeQLInputResourceLeakCodemod.class,
3233
CodeQLInsecureCookieCodemod.class,
@@ -39,7 +40,6 @@ public static List<Class<? extends CodeChanger>> asList() {
3940
CodeQLRegexInjectionCodemod.class,
4041
CodeQLSQLInjectionCodemod.class,
4142
CodeQLSSRFCodemod.class,
42-
CodeQLStackTraceExposureCodemod.class,
4343
CodeQLUnverifiedJwtCodemod.class,
4444
CodeQLXSSCodemod.class,
4545
CodeQLXXECodemod.class,

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public CodemodFileScanningResult visit(
5959
: Optional.empty(),
6060
i ->
6161
i.getTextRange() != null
62-
? Optional.of(i.getTextRange().getStartOffset() + 1)
62+
? Optional.of(i.getTextRange().getStartOffset())
6363
: Optional.empty());
6464
}
6565
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
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.errorexposure.ErrorMessageExposureRemediator;
11+
import java.util.Optional;
12+
import javax.inject.Inject;
13+
14+
/** A codemod that removes sensitive information exposure from error messages * */
15+
@Codemod(
16+
id = "codeql:java/error-message-exposure",
17+
reviewGuidance = ReviewGuidance.MERGE_AFTER_CURSORY_REVIEW,
18+
importance = Importance.MEDIUM,
19+
executionPriority = CodemodExecutionPriority.HIGH)
20+
public final class CodeQLErrorMessageExposureCodemod extends CodeQLRemediationCodemod {
21+
22+
private final Remediator<Result> remediator;
23+
24+
@Inject
25+
public CodeQLErrorMessageExposureCodemod(
26+
@ProvidedCodeQLScan(ruleId = "java/error-message-exposure") final RuleSarif sarif) {
27+
super(GenericRemediationMetadata.ERROR_MESSAGE_EXPOSURE.reporter(), sarif);
28+
this.remediator = new ErrorMessageExposureRemediator<>();
29+
}
30+
31+
@Override
32+
public DetectorRule detectorRule() {
33+
return new DetectorRule(
34+
"error-message-exposure",
35+
"Information exposure through an error message",
36+
"https://codeql.github.com/codeql-query-help/java/java-error-message-exposure/");
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 ->
53+
Optional.ofNullable(
54+
r.getLocations().get(0).getPhysicalLocation().getRegion().getStartColumn()));
55+
}
56+
}

core-codemods/src/main/java/io/codemodder/codemods/codeql/CodeQLStackTraceExposureCodemod.java

Lines changed: 0 additions & 68 deletions
This file was deleted.
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
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 CodeQLErrorMessageExposureCodemodTest {
8+
9+
@Nested
10+
@Metadata(
11+
codemodType = CodeQLErrorMessageExposureCodemod.class,
12+
testResourceDir = "error-message-exposure/IntoPrinter",
13+
renameTestFile =
14+
"app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/TrackbackServlet"
15+
+ ".java",
16+
expectingFixesAtLines = {147, 221},
17+
dependencies = {})
18+
final class IntoPrinterTest implements CodemodTestMixin {}
19+
20+
@Nested
21+
@Metadata(
22+
codemodType = CodeQLErrorMessageExposureCodemod.class,
23+
testResourceDir = "error-message-exposure/SendErrorAndPrintStackTrace",
24+
dependencies = {})
25+
final class SendErrorAndPrintStackTraceTest implements CodemodTestMixin {}
26+
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ final class CodeQLRegexInjectionCodemodTest {
1414
expectingFixesAtLines = 438,
1515
doRetransformTest = false,
1616
dependencies = {})
17-
class BannedWordlistTest implements CodemodTestMixin {}
17+
final class BannedWordlistTest implements CodemodTestMixin {}
1818

1919
@Nested
2020
@Metadata(
@@ -24,5 +24,5 @@ class BannedWordlistTest implements CodemodTestMixin {}
2424
expectingFixesAtLines = {71, 66, 49},
2525
doRetransformTest = false,
2626
dependencies = {})
27-
class RegexUtilTest implements CodemodTestMixin {}
27+
final class RegexUtilTest implements CodemodTestMixin {}
2828
}

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

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

0 commit comments

Comments
 (0)