Skip to content

Commit 508a671

Browse files
committed
Email Injection detection in IAST
initial commit
1 parent 866fc61 commit 508a671

File tree

10 files changed

+68
-3
lines changed

10 files changed

+68
-3
lines changed

dd-java-agent/agent-iast/src/main/java/com/datadog/iast/IastSystem.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import com.datadog.iast.securitycontrol.IastSecurityControlTransformer;
1212
import com.datadog.iast.sink.ApplicationModuleImpl;
1313
import com.datadog.iast.sink.CommandInjectionModuleImpl;
14+
import com.datadog.iast.sink.EmailInjectionModuleImpl;
1415
import com.datadog.iast.sink.HardcodedSecretModuleImpl;
1516
import com.datadog.iast.sink.HeaderInjectionModuleImpl;
1617
import com.datadog.iast.sink.HstsMissingHeaderModuleImpl;
@@ -179,7 +180,8 @@ private static Stream<IastModule> iastModules(
179180
HardcodedSecretModuleImpl.class,
180181
InsecureAuthProtocolModuleImpl.class,
181182
ReflectionInjectionModuleImpl.class,
182-
UntrustedDeserializationModuleImpl.class);
183+
UntrustedDeserializationModuleImpl.class,
184+
EmailInjectionModuleImpl.class);
183185
if (iast != FULLY_ENABLED) {
184186
modules = modules.filter(IastSystem::isOptOut);
185187
}

dd-java-agent/agent-iast/src/main/java/com/datadog/iast/model/VulnerabilityType.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static com.datadog.iast.util.CRCUtils.update;
44
import static datadog.trace.api.iast.VulnerabilityMarks.COMMAND_INJECTION_MARK;
5+
import static datadog.trace.api.iast.VulnerabilityMarks.EMAIL_INJECTION_MARK;
56
import static datadog.trace.api.iast.VulnerabilityMarks.HEADER_INJECTION_MARK;
67
import static datadog.trace.api.iast.VulnerabilityMarks.LDAP_INJECTION_MARK;
78
import static datadog.trace.api.iast.VulnerabilityMarks.NOT_MARKED;
@@ -109,6 +110,9 @@ public interface VulnerabilityType {
109110
.mark(UNTRUSTED_DESERIALIZATION_MARK)
110111
.build();
111112

113+
VulnerabilityType EMAIL_INJECTION =
114+
type(VulnerabilityTypes.EMAIL_INJECTION).mark(EMAIL_INJECTION_MARK).build();
115+
112116
/* All vulnerability types that have a mark. Should be updated if new vulnerabilityType with mark is added */
113117
VulnerabilityType[] MARKED_VULNERABILITIES = {
114118
SQL_INJECTION,
@@ -122,7 +126,8 @@ public interface VulnerabilityType {
122126
XSS,
123127
HEADER_INJECTION,
124128
REFLECTION_INJECTION,
125-
UNTRUSTED_DESERIALIZATION
129+
UNTRUSTED_DESERIALIZATION,
130+
EMAIL_INJECTION
126131
};
127132

128133
String name();
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.datadog.iast.sink;
2+
3+
import com.datadog.iast.Dependencies;
4+
import com.datadog.iast.model.VulnerabilityType;
5+
import datadog.trace.api.iast.sink.EmailInjectionModule;
6+
import javax.annotation.Nullable;
7+
import javax.mail.internet.MimeMessage;
8+
9+
public class EmailInjectionModuleImpl extends SinkModuleBase implements EmailInjectionModule {
10+
11+
public EmailInjectionModuleImpl(final Dependencies dependencies) {
12+
super(dependencies);
13+
}
14+
15+
@Override
16+
public void onSendEmail(@Nullable final MimeMessage message) {
17+
if (message == null) {
18+
return;
19+
}
20+
21+
checkInjection(VulnerabilityType.EMAIL_INJECTION, message);
22+
}
23+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
muzzle {
2+
pass {
3+
coreJdk()
4+
}
5+
}
6+
7+
apply from: "$rootDir/gradle/java.gradle"
8+
apply plugin: 'call-site-instrumentation'
9+
10+
addTestSuiteForDir('latestDepTest', 'test')
11+
12+
dependencies {
13+
testRuntimeOnly project(':dd-java-agent:instrumentation:iast-instrumenter')
14+
}
15+
16+
17+
tasks.compileTestJava.configure {
18+
setJavaVersion(it, 8)
19+
}

internal-api/src/main/java/datadog/trace/api/iast/InstrumentationBridge.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import datadog.trace.api.iast.propagation.StringModule;
66
import datadog.trace.api.iast.sink.ApplicationModule;
77
import datadog.trace.api.iast.sink.CommandInjectionModule;
8+
import datadog.trace.api.iast.sink.EmailInjectionModule;
89
import datadog.trace.api.iast.sink.HardcodedSecretModule;
910
import datadog.trace.api.iast.sink.HeaderInjectionModule;
1011
import datadog.trace.api.iast.sink.HstsMissingHeaderModule;
@@ -67,6 +68,7 @@ public abstract class InstrumentationBridge {
6768
public static InsecureAuthProtocolModule INSECURE_AUTH_PROTOCOL;
6869
public static ReflectionInjectionModule REFLECTION_INJECTION;
6970
public static UntrustedDeserializationModule UNTRUSTED_DESERIALIZATION;
71+
public static EmailInjectionModule EMAIL_INJECTION;
7072

7173
private static final Map<Class<? extends IastModule>, Field> MODULE_MAP = buildModuleMap();
7274

internal-api/src/main/java/datadog/trace/api/iast/VulnerabilityMarks.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ private VulnerabilityMarks() {}
2222
public static final int UNTRUSTED_DESERIALIZATION_MARK = 1 << 11;
2323

2424
public static final int CUSTOM_SECURITY_CONTROL_MARK = 1 << 13;
25+
public static final int EMAIL_INJECTION_MARK = 1 << 14;
2526

2627
public static int markForAll() {
2728
return XSS_MARK

internal-api/src/main/java/datadog/trace/api/iast/VulnerabilityTypes.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ private VulnerabilityTypes() {}
3737
public static final byte SESSION_REWRITING = 28;
3838
public static final byte DEFAULT_APP_DEPLOYED = 29;
3939
public static final byte UNTRUSTED_DESERIALIZATION = 30;
40+
public static final byte EMAIL_INJECTION = 31;
4041

4142
/**
4243
* Use for telemetry only, this is a special vulnerability type that is not reported, reported
@@ -115,7 +116,8 @@ private VulnerabilityTypes() {}
115116
"REFLECTION_INJECTION",
116117
"SESSION_REWRITING",
117118
"DEFAULT_APP_DEPLOYED",
118-
"UNTRUSTED_DESERIALIZATION"
119+
"UNTRUSTED_DESERIALIZATION",
120+
"EMAIL_INJECTION"
119121
};
120122

121123
public static String toString(final byte vulnerability) {
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package datadog.trace.api.iast.sink;
2+
3+
import datadog.trace.api.iast.IastModule;
4+
import javax.annotation.Nullable;
5+
import javax.mail.internet.MimeMessage;
6+
7+
public interface EmailInjectionModule extends IastModule {
8+
void onSendEmail(@Nullable MimeMessage body);
9+
}

internal-api/src/test/groovy/datadog/trace/api/iast/VulnerabilityTypesTest.groovy

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,5 +45,6 @@ class VulnerabilityTypesTest extends DDSpecification {
4545
VulnerabilityTypes.SESSION_REWRITING | 'SESSION_REWRITING'
4646
VulnerabilityTypes.DEFAULT_APP_DEPLOYED | 'DEFAULT_APP_DEPLOYED'
4747
VulnerabilityTypes.UNTRUSTED_DESERIALIZATION | 'UNTRUSTED_DESERIALIZATION'
48+
VulnerabilityTypes.EMAIL_INJECTION | 'EMAIL_INJECTION'
4849
}
4950
}

settings.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,7 @@ include ':dd-java-agent:instrumentation:java-security'
297297
include ':dd-java-agent:instrumentation:java-util'
298298
include ':dd-java-agent:instrumentation:javax-naming'
299299
include ':dd-java-agent:instrumentation:javax-xml'
300+
include ':dd-java-agent:instrumentation:javax-mail'
300301
include ':dd-java-agent:instrumentation:jax-rs-annotations-1'
301302
include ':dd-java-agent:instrumentation:jax-rs-annotations-2'
302303
include ':dd-java-agent:instrumentation:jax-rs-annotations-2:filter-jersey'

0 commit comments

Comments
 (0)