Skip to content

Commit 525dcdb

Browse files
authored
Merge pull request #727 from tls-attacker/anvil-fixes
doNotSendSNI parameter and record length test
2 parents 01d34b1 + 23e1d83 commit 525dcdb

File tree

10 files changed

+83
-19
lines changed

10 files changed

+83
-19
lines changed

TLS-Client-Scanner/src/main/java/de/rub/nds/tlsscanner/clientscanner/probe/RecordFragmentationProbe.java

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,20 +28,37 @@
2828
import de.rub.nds.tlsscanner.core.constants.TlsAnalyzedProperty;
2929
import de.rub.nds.tlsscanner.core.constants.TlsProbeType;
3030
import de.rub.nds.tlsscanner.core.probe.requirements.ProtocolTypeFalseRequirement;
31+
import java.util.List;
3132

3233
public class RecordFragmentationProbe extends TlsClientProbe {
33-
private TestResult result = TestResults.COULD_NOT_TEST;
34+
35+
private TestResult supportsFragmentation = TestResults.COULD_NOT_TEST;
36+
private int minRecordLength = 16384;
3437

3538
public RecordFragmentationProbe(
3639
ParallelExecutor parallelExecutor, ClientScannerConfig scannerConfig) {
3740
super(parallelExecutor, TlsProbeType.RECORD_FRAGMENTATION, scannerConfig);
3841
register(TlsAnalyzedProperty.SUPPORTS_RECORD_FRAGMENTATION);
42+
register(TlsAnalyzedProperty.MIN_RECORD_LENGTH);
3943
}
4044

4145
@Override
4246
protected void executeTest() {
47+
List<Integer> toTest = List.of(16384, 111, 50, 1);
48+
for (Integer length : toTest) {
49+
if (supportsFragmentation(length)) {
50+
minRecordLength = length;
51+
} else {
52+
break;
53+
}
54+
}
55+
56+
supportsFragmentation = minRecordLength < 16384 ? TestResults.TRUE : TestResults.FALSE;
57+
}
58+
59+
public boolean supportsFragmentation(int recordLength) {
4360
Config config = scannerConfig.createConfig();
44-
config.setDefaultMaxRecordData(50);
61+
config.setDefaultMaxRecordData(recordLength);
4562

4663
WorkflowConfigurationFactory factory = new WorkflowConfigurationFactory(config);
4764
WorkflowTrace workflowTrace =
@@ -51,11 +68,8 @@ protected void executeTest() {
5168
State state = new State(config, workflowTrace);
5269
executeState(state);
5370

54-
result =
55-
WorkflowTraceResultUtil.didReceiveMessage(
56-
state.getWorkflowTrace(), HandshakeMessageType.FINISHED)
57-
? TestResults.TRUE
58-
: TestResults.FALSE;
71+
return WorkflowTraceResultUtil.didReceiveMessage(
72+
state.getWorkflowTrace(), HandshakeMessageType.FINISHED);
5973
}
6074

6175
@Override
@@ -68,6 +82,7 @@ public void adjustConfig(ClientReport report) {}
6882

6983
@Override
7084
protected void mergeData(ClientReport report) {
71-
put(TlsAnalyzedProperty.SUPPORTS_RECORD_FRAGMENTATION, result);
85+
put(TlsAnalyzedProperty.SUPPORTS_RECORD_FRAGMENTATION, supportsFragmentation);
86+
put(TlsAnalyzedProperty.MIN_RECORD_LENGTH, minRecordLength);
7287
}
7388
}

TLS-Scanner-Core/src/main/java/de/rub/nds/tlsscanner/core/constants/TlsAnalyzedProperty.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,7 @@ public enum TlsAnalyzedProperty implements AnalyzedProperty {
249249
/** does it handle a http false start */
250250
SUPPORTS_HTTP_FALSE_START(TlsAnalyzedPropertyCategory.QUIRKS),
251251
SUPPORTS_RECORD_FRAGMENTATION(TlsAnalyzedPropertyCategory.QUIRKS),
252+
MIN_RECORD_LENGTH(TlsAnalyzedPropertyCategory.QUIRKS),
252253
/** does it have a grease value intolerance? */
253254
HAS_GREASE_CIPHER_SUITE_INTOLERANCE(TlsAnalyzedPropertyCategory.QUIRKS),
254255
HAS_GREASE_NAMED_GROUP_INTOLERANCE(TlsAnalyzedPropertyCategory.QUIRKS),

TLS-Scanner-Core/src/main/java/de/rub/nds/tlsscanner/core/report/TlsScanReport.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,16 @@ public synchronized Integer getTotalReceivedRetransmissions() {
8282
return integerResult == null ? null : integerResult.getValue();
8383
}
8484

85+
/**
86+
* Returns the minimum supported record length of the SUT.
87+
*
88+
* @return The lowest possible record length still supported.
89+
*/
90+
public synchronized Integer getMinRecordLength() {
91+
IntegerResult integerResult = getIntegerResult(TlsAnalyzedProperty.MIN_RECORD_LENGTH);
92+
return integerResult == null ? null : integerResult.getValue();
93+
}
94+
8595
/**
8696
* Returns whether CCA is supported.
8797
*

TLS-Server-Scanner/src/main/java/de/rub/nds/tlsscanner/serverscanner/config/ServerScannerConfig.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,13 @@ public class ServerScannerConfig extends TlsScannerConfig {
5454
"Pause between config tests to ensure the server finished processing the previously rejected messages")
5555
private boolean configSearchCooldown = false;
5656

57+
@Parameter(
58+
names = "-doNotSendSNIExtension",
59+
description =
60+
"Usually the hostname for the SNI extension is inferred automatically. "
61+
+ "This option can overwrite the default behaviour.")
62+
private boolean doNotSendSNIExtension = false;
63+
5764
public ServerScannerConfig(GeneralDelegate delegate) {
5865
super(delegate);
5966

@@ -121,4 +128,12 @@ public boolean isConfigSearchCooldown() {
121128
public void setConfigSearchCooldown(boolean configSearchCooldown) {
122129
this.configSearchCooldown = configSearchCooldown;
123130
}
131+
132+
public boolean isDoNotSendSNIExtension() {
133+
return doNotSendSNIExtension;
134+
}
135+
136+
public void setDoNotSendSNIExtension(boolean doNotSendSNIExtension) {
137+
this.doNotSendSNIExtension = doNotSendSNIExtension;
138+
}
124139
}

TLS-Server-Scanner/src/main/java/de/rub/nds/tlsscanner/serverscanner/probe/RecordFragmentationProbe.java

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,33 +24,46 @@
2424
import de.rub.nds.tlsscanner.core.probe.requirements.ProtocolTypeFalseRequirement;
2525
import de.rub.nds.tlsscanner.serverscanner.report.ServerReport;
2626
import de.rub.nds.tlsscanner.serverscanner.selector.ConfigSelector;
27+
import java.util.List;
2728

2829
public class RecordFragmentationProbe extends TlsServerProbe {
2930

30-
private TestResult supported = TestResults.COULD_NOT_TEST;
31+
private TestResult supportsFragmentation = TestResults.COULD_NOT_TEST;
32+
private int minRecordLength = 16384;
3133

3234
public RecordFragmentationProbe(
3335
ConfigSelector configSelector, ParallelExecutor parallelExecutor) {
3436
super(parallelExecutor, TlsProbeType.RECORD_FRAGMENTATION, configSelector);
3537
register(TlsAnalyzedProperty.SUPPORTS_RECORD_FRAGMENTATION);
38+
register(TlsAnalyzedProperty.MIN_RECORD_LENGTH);
3639
}
3740

3841
@Override
3942
protected void executeTest() {
43+
List<Integer> toTest = List.of(16384, 111, 50, 1);
44+
for (Integer length : toTest) {
45+
if (supportsFragmentation(length)) {
46+
minRecordLength = length;
47+
} else {
48+
break;
49+
}
50+
}
51+
52+
supportsFragmentation = minRecordLength < 16384 ? TestResults.TRUE : TestResults.FALSE;
53+
}
54+
55+
public boolean supportsFragmentation(int recordLength) {
4056
Config config = configSelector.getAnyWorkingBaseConfig();
41-
config.setDefaultMaxRecordData(50);
57+
config.setDefaultMaxRecordData(recordLength);
4258
config.setWorkflowTraceType(WorkflowTraceType.DYNAMIC_HELLO);
4359
State state = new State(config);
4460
executeState(state);
4561
HandshakeMessageType expectedFinalMessage =
4662
state.getTlsContext().getSelectedProtocolVersion() == ProtocolVersion.TLS13
4763
? HandshakeMessageType.FINISHED
4864
: HandshakeMessageType.SERVER_HELLO_DONE;
49-
supported =
50-
WorkflowTraceResultUtil.didReceiveMessage(
51-
state.getWorkflowTrace(), expectedFinalMessage)
52-
? TestResults.TRUE
53-
: TestResults.FALSE;
65+
return WorkflowTraceResultUtil.didReceiveMessage(
66+
state.getWorkflowTrace(), expectedFinalMessage);
5467
}
5568

5669
@Override
@@ -63,6 +76,7 @@ public Requirement<ServerReport> getRequirements() {
6376

6477
@Override
6578
protected void mergeData(ServerReport report) {
66-
put(TlsAnalyzedProperty.SUPPORTS_RECORD_FRAGMENTATION, supported);
79+
put(TlsAnalyzedProperty.SUPPORTS_RECORD_FRAGMENTATION, supportsFragmentation);
80+
put(TlsAnalyzedProperty.MIN_RECORD_LENGTH, minRecordLength);
6781
}
6882
}

TLS-Server-Scanner/src/main/java/de/rub/nds/tlsscanner/serverscanner/report/ServerReportPrinter.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1593,6 +1593,7 @@ public StringBuilder appendRecordFragmentation(StringBuilder builder) {
15931593
builder,
15941594
"Supports Record Fragmentation",
15951595
TlsAnalyzedProperty.SUPPORTS_RECORD_FRAGMENTATION);
1596+
prettyAppend(builder, "Mininum Record Length", "" + report.getMinRecordLength());
15961597
return builder;
15971598
}
15981599

TLS-Server-Scanner/src/main/java/de/rub/nds/tlsscanner/serverscanner/selector/ConfigSelector.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -276,8 +276,9 @@ private void applyScannerConfigParameters(Config config) {
276276
}
277277

278278
private void repairSni(Config config) {
279-
if (!IPAddress.isValid(config.getDefaultClientConnection().getHostname())
280-
|| scannerConfig.getClientDelegate().getSniHostname() != null) {
279+
if (!scannerConfig.isDoNotSendSNIExtension()
280+
&& (!IPAddress.isValid(config.getDefaultClientConnection().getHostname())
281+
|| scannerConfig.getClientDelegate().getSniHostname() != null)) {
281282
config.setAddServerNameIndicationExtension(true);
282283
} else {
283284
config.setAddServerNameIndicationExtension(false);

TLS-Server-Scanner/src/main/resources/rating/influencers.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2465,6 +2465,9 @@
24652465
<ratingInfluencer>
24662466
<property>SUPPORTS_RECORD_FRAGMENTATION</property>
24672467
</ratingInfluencer>
2468+
<ratingInfluencer>
2469+
<property>MIN_RECORD_LENGTH</property>
2470+
</ratingInfluencer>
24682471
<ratingInfluencer>
24692472
<property>HAS_GREASE_CIPHER_SUITE_INTOLERANCE</property>
24702473
</ratingInfluencer>

TLS-Server-Scanner/src/test/java/de/rub/nds/tlsscanner/serverscanner/probe/RecordFragmentationProbeIT.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ protected void prepareReport() {}
3131

3232
@Override
3333
protected boolean executedAsPlanned() {
34-
return verifyProperty(TlsAnalyzedProperty.SUPPORTS_RECORD_FRAGMENTATION, TestResults.TRUE);
34+
boolean supportsFragmentation =
35+
verifyProperty(TlsAnalyzedProperty.SUPPORTS_RECORD_FRAGMENTATION, TestResults.TRUE);
36+
int recordLength = report.getMinRecordLength();
37+
return supportsFragmentation && recordLength == 1;
3538
}
3639
}

TLS-Server-Scanner/src/test/java/de/rub/nds/tlsscanner/serverscanner/report/rating/DefaultInfluencersIT.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1158,6 +1158,7 @@ public void createDefaultRatingInfluencers() throws IOException, JAXBException {
11581158
TlsAnalyzedProperty.SUPPORTS_RENEGOTIATION,
11591159
TlsAnalyzedProperty.HANDSHAKES_WITH_UNDEFINED_POINT_FORMAT,
11601160
TlsAnalyzedProperty.SUPPORTS_RECORD_FRAGMENTATION,
1161+
TlsAnalyzedProperty.MIN_RECORD_LENGTH,
11611162
TlsAnalyzedProperty.HAS_GREASE_CIPHER_SUITE_INTOLERANCE,
11621163
TlsAnalyzedProperty.HAS_GREASE_NAMED_GROUP_INTOLERANCE,
11631164
TlsAnalyzedProperty

0 commit comments

Comments
 (0)