Skip to content

Commit bdcab03

Browse files
authored
Merge pull request #225 from tls-attacker/serverClosesConnection
Connection Closing Probe
2 parents 3da40b9 + 95e2d3b commit bdcab03

File tree

10 files changed

+253
-38
lines changed

10 files changed

+253
-38
lines changed

TLS-Client-Scanner/src/main/java/de/rub/nds/tlsscanner/clientscanner/execution/TlsClientScanner.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,11 @@ public TlsClientScanner(ClientScannerConfig config, Function<State, Integer> cli
4242
parallelExecutor = new ParallelExecutor(config.getOverallThreads(), 3);
4343
parallelExecutor.setDefaultBeforeTransportInitCallback(clientAfterPreInitCallback);
4444
parallelExecutor.setDefaultBeforeTransportPreInitCallback(createConnectionHook());
45-
fillDefaultProbeLists();
45+
fillProbeLists();
4646
}
4747

4848
@Override
49-
protected void fillDefaultProbeLists() {
49+
protected void fillProbeLists() {
5050
addProbeToProbeList(new BasicProbe(parallelExecutor, config));
5151
addProbeToProbeList(new DheParameterProbe(parallelExecutor, config));
5252
addProbeToProbeList(new ForcedCompressionProbe(parallelExecutor, config));

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
@@ -129,6 +129,7 @@ public enum TlsAnalyzedProperty implements AnalyzedProperty {
129129
SUPPORTS_UNCOMPRESSED_POINT(TlsAnalyzedPropertyCategory.EC),
130130
SUPPORTS_ANSIX962_COMPRESSED_PRIME(TlsAnalyzedPropertyCategory.EC),
131131
SUPPORTS_ANSIX962_COMPRESSED_CHAR2(TlsAnalyzedPropertyCategory.EC),
132+
HANDSHAKES_WITH_UNDEFINED_POINT_FORMAT(TlsAnalyzedPropertyCategory.EC),
132133
SUPPORTS_TLS13_SECP_COMPRESSION(TlsAnalyzedPropertyCategory.EC),
133134
SUPPORTS_EXPLICIT_PRIME_CURVE(TlsAnalyzedPropertyCategory.EC),
134135
SUPPORTS_EXPLICIT_CHAR2_CURVE(TlsAnalyzedPropertyCategory.EC),

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ public enum TlsProbeType implements ProbeType {
6262
CROSS_PROTOCOL_ALPACA("Alpaca attack"),
6363
RANDOMNESS("Randomness"),
6464
TLS_FALLBACK_SCSV("TLS Fallback SCSV"),
65+
CONNECTION_CLOSING_DELTA("Connection Closing Delta"),
6566
// CLIENT SPECIFIC PROBES
6667
FORCED_COMPRESSION("Forced Compression"),
6768
FREAK("Freak"),

TLS-Scanner-Core/src/main/java/de/rub/nds/tlsscanner/core/execution/TlsScanner.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,15 @@ public TlsScanner(List<ScannerProbe> probeList, List<AfterProbe> afterList, List
3131
this.probeList = probeList;
3232
}
3333

34-
protected abstract void fillDefaultProbeLists();
34+
protected abstract void fillProbeLists();
3535

3636
protected void addProbeToProbeList(TlsProbe probe) {
37-
if (probeTypesToExecute == null || probeTypesToExecute.contains(probe.getType())) {
37+
addProbeToProbeList(probe, true);
38+
}
39+
40+
protected void addProbeToProbeList(TlsProbe probe, boolean addByDefault) {
41+
if ((probeTypesToExecute == null && addByDefault)
42+
|| (probeTypesToExecute != null && probeTypesToExecute.contains(probe.getType()))) {
3843
probeList.add(probe);
3944
}
4045
}

TLS-Server-Scanner/src/main/java/de/rub/nds/tlsscanner/serverscanner/execution/TlsServerScanner.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
import de.rub.nds.tlsscanner.serverscanner.probe.CipherSuiteProbe;
6161
import de.rub.nds.tlsscanner.serverscanner.probe.CommonBugProbe;
6262
import de.rub.nds.tlsscanner.serverscanner.probe.CompressionsProbe;
63+
import de.rub.nds.tlsscanner.serverscanner.probe.ConnectionClosingProbe;
6364
import de.rub.nds.tlsscanner.serverscanner.probe.DirectRaccoonProbe;
6465
import de.rub.nds.tlsscanner.serverscanner.probe.DrownProbe;
6566
import de.rub.nds.tlsscanner.serverscanner.probe.DtlsBugsProbe;
@@ -122,7 +123,7 @@ public TlsServerScanner(ServerScannerConfig config) {
122123
parallelExecutor = new ParallelExecutor(config.getOverallThreads(), 3,
123124
new NamedThreadFactory(config.getClientDelegate().getHost() + "-Worker"));
124125
setCallbacks();
125-
fillDefaultProbeLists();
126+
fillProbeLists();
126127
}
127128

128129
public TlsServerScanner(ServerScannerConfig config, ParallelExecutor parallelExecutor) {
@@ -132,7 +133,7 @@ public TlsServerScanner(ServerScannerConfig config, ParallelExecutor parallelExe
132133
this.parallelExecutor = parallelExecutor;
133134
closeAfterFinishParallel = false;
134135
setCallbacks();
135-
fillDefaultProbeLists();
136+
fillProbeLists();
136137
}
137138

138139
public TlsServerScanner(ServerScannerConfig config, ParallelExecutor parallelExecutor, List<ScannerProbe> probeList,
@@ -171,7 +172,7 @@ private void setCallbacks() {
171172
}
172173

173174
@Override
174-
protected void fillDefaultProbeLists() {
175+
protected void fillProbeLists() {
175176
if (config.getAdditionalRandomnessHandshakes() > 0) {
176177
addProbeToProbeList(new RandomnessProbe(configSelector, parallelExecutor));
177178
}
@@ -203,7 +204,6 @@ protected void fillDefaultProbeLists() {
203204
addProbeToProbeList(new SignatureAndHashAlgorithmProbe(configSelector, parallelExecutor));
204205
addProbeToProbeList(new SignatureHashAlgorithmOrderProbe(configSelector, parallelExecutor));
205206
addProbeToProbeList(new TlsFallbackScsvProbe(configSelector, parallelExecutor));
206-
// Init StatsWriter
207207

208208
afterList.add(new Sweet32AfterProbe());
209209
afterList.add(new FreakAfterProbe());
@@ -236,8 +236,10 @@ protected void fillDefaultProbeLists() {
236236
addProbeToProbeList(new HttpFalseStartProbe(configSelector, parallelExecutor));
237237
}
238238
addProbeToProbeList(new DrownProbe(configSelector, parallelExecutor));
239+
addProbeToProbeList(new ConnectionClosingProbe(configSelector, parallelExecutor), false);
239240
afterList.add(new PoodleAfterProbe());
240241
}
242+
// Init StatsWriter
241243
setDefaultProbeWriter();
242244
}
243245

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
/**
2+
* TLS-Server-Scanner - A TLS configuration and analysis tool based on TLS-Attacker
3+
*
4+
* Copyright 2017-2022 Ruhr University Bochum, Paderborn University, Hackmanit GmbH
5+
*
6+
* Licensed under Apache License, Version 2.0
7+
* http://www.apache.org/licenses/LICENSE-2.0.txt
8+
*/
9+
10+
package de.rub.nds.tlsscanner.serverscanner.probe;
11+
12+
import de.rub.nds.scanner.core.constants.TestResults;
13+
import de.rub.nds.tlsattacker.core.config.Config;
14+
import de.rub.nds.tlsattacker.core.constants.CipherSuite;
15+
import de.rub.nds.tlsattacker.core.constants.NamedGroup;
16+
import de.rub.nds.tlsattacker.core.constants.ProtocolVersion;
17+
import de.rub.nds.tlsattacker.core.constants.RunningModeType;
18+
import de.rub.nds.tlsattacker.core.https.HttpsRequestMessage;
19+
import de.rub.nds.tlsattacker.core.protocol.message.ApplicationMessage;
20+
import de.rub.nds.tlsattacker.core.state.State;
21+
import de.rub.nds.tlsattacker.core.workflow.ParallelExecutor;
22+
import de.rub.nds.tlsattacker.core.workflow.WorkflowTrace;
23+
import de.rub.nds.tlsattacker.core.workflow.action.SendAction;
24+
import de.rub.nds.tlsattacker.core.workflow.factory.WorkflowConfigurationFactory;
25+
import de.rub.nds.tlsattacker.core.workflow.factory.WorkflowTraceType;
26+
import de.rub.nds.tlsattacker.transport.socket.SocketState;
27+
import de.rub.nds.tlsattacker.transport.tcp.TcpTransportHandler;
28+
import de.rub.nds.tlsscanner.core.constants.TlsAnalyzedProperty;
29+
import de.rub.nds.tlsscanner.core.constants.TlsProbeType;
30+
import de.rub.nds.tlsscanner.core.probe.TlsProbe;
31+
import de.rub.nds.tlsscanner.serverscanner.config.ServerScannerConfig;
32+
import de.rub.nds.tlsscanner.serverscanner.probe.result.ConnectionClosingResult;
33+
import de.rub.nds.tlsscanner.serverscanner.report.ServerReport;
34+
import de.rub.nds.tlsscanner.serverscanner.selector.ConfigSelector;
35+
import java.io.IOException;
36+
37+
/**
38+
* Determines when the server closes the connection. It's meant for tests in the lab so we limit the probe. Note that
39+
* NO_RESULT may indicate that we couldn't identify a closing delta, i.e the server didn't close the connection within
40+
* our limit or the probe could not be executed.
41+
*/
42+
public class ConnectionClosingProbe extends TlsServerProbe<ConfigSelector, ServerReport, ConnectionClosingResult> {
43+
44+
public static final long NO_RESULT = -1;
45+
private static final long LIMIT = 5000;
46+
47+
private boolean useHttpAppData = false;
48+
49+
public ConnectionClosingProbe(ConfigSelector configSelector, ParallelExecutor parallelExecutor) {
50+
super(parallelExecutor, TlsProbeType.CONNECTION_CLOSING_DELTA, configSelector);
51+
}
52+
53+
@Override
54+
public ConnectionClosingResult executeTest() {
55+
Config tlsConfig = configSelector.getBaseConfig();
56+
configSelector.repairConfig(tlsConfig);
57+
tlsConfig.setWorkflowTraceType(WorkflowTraceType.HTTPS);
58+
tlsConfig.setWorkflowExecutorShouldClose(false);
59+
60+
WorkflowTrace handshakeOnly = getWorkflowTrace(tlsConfig);
61+
WorkflowTrace handshakeWithAppData = getWorkflowTrace(tlsConfig);
62+
if (useHttpAppData) {
63+
handshakeWithAppData.addTlsAction(new SendAction(new HttpsRequestMessage(tlsConfig)));
64+
} else {
65+
handshakeWithAppData.addTlsAction(new SendAction(new ApplicationMessage(tlsConfig)));
66+
}
67+
68+
return new ConnectionClosingResult(evaluateClosingDelta(tlsConfig, handshakeOnly),
69+
evaluateClosingDelta(tlsConfig, handshakeWithAppData));
70+
}
71+
72+
public WorkflowTrace getWorkflowTrace(Config tlsConfig) {
73+
WorkflowConfigurationFactory factory = new WorkflowConfigurationFactory(tlsConfig);
74+
return factory.createWorkflowTrace(WorkflowTraceType.HANDSHAKE, RunningModeType.CLIENT);
75+
}
76+
77+
private long evaluateClosingDelta(Config tlsConfig, WorkflowTrace workflowTrace) {
78+
State state = new State(tlsConfig, workflowTrace);
79+
executeState(state);
80+
long delta = 0;
81+
SocketState socketState = null;
82+
do {
83+
try {
84+
socketState = (((TcpTransportHandler) (state.getTlsContext().getTransportHandler())).getSocketState());
85+
switch (socketState) {
86+
case CLOSED:
87+
case IO_EXCEPTION:
88+
case PEER_WRITE_CLOSED:
89+
case SOCKET_EXCEPTION:
90+
case TIMEOUT:
91+
closeSocket(state);
92+
return delta;
93+
default:
94+
}
95+
Thread.sleep(10);
96+
delta += 10;
97+
} catch (InterruptedException ignored) {
98+
}
99+
} while (delta < LIMIT);
100+
closeSocket(state);
101+
return NO_RESULT;
102+
}
103+
104+
public void closeSocket(State state) {
105+
try {
106+
state.getTlsContext().getTransportHandler().closeConnection();
107+
} catch (IOException ignored) {
108+
}
109+
}
110+
111+
@Override
112+
public boolean canBeExecuted(ServerReport report) {
113+
return report.isProbeAlreadyExecuted(TlsProbeType.HTTP_HEADER);
114+
}
115+
116+
@Override
117+
public ConnectionClosingResult getCouldNotExecuteResult() {
118+
return new ConnectionClosingResult(NO_RESULT, NO_RESULT);
119+
}
120+
121+
@Override
122+
public void adjustConfig(ServerReport report) {
123+
useHttpAppData = report.getResult(TlsAnalyzedProperty.SUPPORTS_HTTPS) == TestResults.TRUE;
124+
}
125+
126+
}

0 commit comments

Comments
 (0)