Skip to content

Commit 6b3fb80

Browse files
committed
Refactored and added new cases to CodeQLStackTraceExposure codemod
1 parent 2c4bb17 commit 6b3fb80

File tree

14 files changed

+217
-85
lines changed

14 files changed

+217
-85
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,
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
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 io.codemodder.remediation.xxe.XXEIntermediateXMLStreamReaderRemediator;
12+
13+
import javax.inject.Inject;
14+
import java.util.Optional;
15+
16+
/** A codemod for automatically fixing SQL injection from CodeQL. */
17+
@Codemod(
18+
id = "codeql:java/error-message-exposure",
19+
reviewGuidance = ReviewGuidance.MERGE_AFTER_CURSORY_REVIEW,
20+
importance = Importance.MEDIUM,
21+
executionPriority = CodemodExecutionPriority.HIGH)
22+
public final class CodeQLErrorMessageExposureCodemod extends CodeQLRemediationCodemod {
23+
24+
private final Remediator<Result> remediator;
25+
26+
@Inject
27+
public CodeQLErrorMessageExposureCodemod(@ProvidedCodeQLScan(ruleId = "java/error-message-exposure") final RuleSarif sarif) {
28+
super(GenericRemediationMetadata.ERROR_MESSAGE_EXPOSURE.reporter(), sarif);
29+
this.remediator = new ErrorMessageExposureRemediator<>();
30+
}
31+
32+
@Override
33+
public DetectorRule detectorRule() {
34+
return new DetectorRule(
35+
"error-message-exposure",
36+
"Information exposure through an error message",
37+
"https://codeql.github.com/codeql-query-help/java/java-error-message-exposure/");
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 ->
54+
Optional.ofNullable(
55+
r.getLocations().get(0).getPhysicalLocation().getRegion().getStartColumn()));
56+
}
57+
}

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

Lines changed: 0 additions & 68 deletions
This file was deleted.
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package io.codemodder.codemods.codeql;
2+
3+
import io.codemodder.testutils.CodemodTestMixin;
4+
import io.codemodder.testutils.Metadata;
5+
6+
@Metadata(
7+
codemodType = CodeQLErrorMessageExposureCodemod.class,
8+
testResourceDir = "error-message-exposure",
9+
dependencies = {})
10+
final class CodeQLErrorMessageExposureCodemodTest implements CodemodTestMixin {}

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

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

core-codemods/src/test/resources/stack-trace-exposure/Test.java.after renamed to core-codemods/src/test/resources/error-message-exposure/Test.java.after

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@ public final class Test {
1313
try {
1414
throw new Exception();
1515
} catch (Exception ex) {
16-
ex.printStackTrace();
17-
}
16+
}
1817
}
1918

2019
protected void flowToSendError(HttpServletRequest request, HttpServletResponse response)
@@ -23,7 +22,6 @@ public final class Test {
2322
throw new Exception();
2423
} catch (Exception ex) {
2524
String msg = ex.getMessage();
26-
response.sendError(0);
2725
}
2826
}
2927

@@ -34,7 +32,6 @@ public final class Test {
3432
} catch (Exception ex) {
3533
StringWriter sw = new StringWriter();
3634
ex.printStackTrace(new PrintWriter(sw));
37-
response.sendError(0);
3835
}
3936
}
4037
}

core-codemods/src/test/resources/stack-trace-exposure/Test.java.before renamed to core-codemods/src/test/resources/error-message-exposure/Test.java.before

File renamed without changes.

core-codemods/src/test/resources/stack-trace-exposure/out.sarif renamed to core-codemods/src/test/resources/error-message-exposure/out.sarif

File renamed without changes.

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public boolean match(final Node node, int startLine, int endLine) {
1919
@Override
2020
public boolean match(final Node node, int startLine, int endLine, int startColumn) {
2121
return match(node, startLine, endLine)
22-
&& getRange(node).begin.compareTo(new Position(startLine, startColumn)) <= 0;
22+
&& getRange(node).begin.compareTo(new Position(startLine, startColumn)) >= 0;
2323
}
2424

2525
@Override

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ public enum GenericRemediationMetadata {
1717
WEAK_RANDOM("weak-random"),
1818
PREDICTABLE_SEED("predictable-seed"),
1919
ZIP_SLIP("zip-slip"),
20-
REGEX_INJECTION("regex-injection");
20+
REGEX_INJECTION("regex-injection"),
21+
ERROR_MESSAGE_EXPOSURE("error-message-exposure");
2122

2223
private final CodemodReporterStrategy reporter;
2324

0 commit comments

Comments
 (0)