Skip to content

Commit 44c72d0

Browse files
authored
Merge pull request #338 from tls-attacker/feature/newClientScanningProbes
Added new client scanning probes
2 parents fcec2ed + 6560c6b commit 44c72d0

File tree

23 files changed

+1005
-251
lines changed

23 files changed

+1005
-251
lines changed

TLS-Client-Scanner/src/main/java/de/rub/nds/tlsscanner/clientscanner/config/ClientScannerConfig.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ public class ClientScannerConfig extends TlsScannerConfig {
6060
"The directory the scanner should use to log the client output. Be wary: This creates a lot of files for a full scan")
6161
private String logDirectory = null;
6262

63+
private Function<State, Integer> externalRunCallback = null;
64+
6365
public ClientScannerConfig(GeneralDelegate delegate) {
6466
super(delegate);
6567

@@ -80,7 +82,9 @@ public Config createConfig() {
8082

8183
Config config = super.createConfig(Config.createConfig());
8284
config.getDefaultClientConnection().setTimeout(getTimeout());
83-
85+
config.setRespectClientProposedExtensions(true);
86+
// will only be added if proposed by client
87+
config.setAddRenegotiationInfoExtension(true);
8488
return config;
8589
}
8690

@@ -129,7 +133,11 @@ public File getLogDirectory() {
129133
}
130134

131135
public Function<State, Integer> getRunCommandExecutionCallback() {
132-
return getRunCommandExecutionCallback(getRunCommand());
136+
if (externalRunCallback != null) {
137+
return externalRunCallback;
138+
} else {
139+
return getRunCommandExecutionCallback(getRunCommand());
140+
}
133141
}
134142

135143
/** Provides a callback that executes the client run command. */
@@ -182,4 +190,12 @@ private Integer getServerPort(TransportHandler serverTransportHandler) {
182190
throw new RuntimeException(
183191
"Got unknown ServerTransportHandler when trying to extract server port.");
184192
}
193+
194+
public Function<State, Integer> getExternalRunCallback() {
195+
return externalRunCallback;
196+
}
197+
198+
public void setExternalRunCallback(Function<State, Integer> externalRunCallback) {
199+
this.externalRunCallback = externalRunCallback;
200+
}
185201
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,21 @@
2525
import de.rub.nds.tlsscanner.clientscanner.probe.CertificateProbe;
2626
import de.rub.nds.tlsscanner.clientscanner.probe.CipherSuiteProbe;
2727
import de.rub.nds.tlsscanner.clientscanner.probe.CompressionProbe;
28+
import de.rub.nds.tlsscanner.clientscanner.probe.ConnectionClosingProbe;
2829
import de.rub.nds.tlsscanner.clientscanner.probe.DheParameterProbe;
2930
import de.rub.nds.tlsscanner.clientscanner.probe.DtlsBugsProbe;
3031
import de.rub.nds.tlsscanner.clientscanner.probe.DtlsFragmentationProbe;
3132
import de.rub.nds.tlsscanner.clientscanner.probe.DtlsHelloVerifyRequestProbe;
3233
import de.rub.nds.tlsscanner.clientscanner.probe.DtlsMessageSequenceProbe;
3334
import de.rub.nds.tlsscanner.clientscanner.probe.DtlsReorderingProbe;
3435
import de.rub.nds.tlsscanner.clientscanner.probe.DtlsRetransmissionsProbe;
36+
import de.rub.nds.tlsscanner.clientscanner.probe.ECPointFormatProbe;
3537
import de.rub.nds.tlsscanner.clientscanner.probe.FreakProbe;
3638
import de.rub.nds.tlsscanner.clientscanner.probe.PaddingOracleProbe;
3739
import de.rub.nds.tlsscanner.clientscanner.probe.ProtocolVersionProbe;
3840
import de.rub.nds.tlsscanner.clientscanner.probe.RecordFragmentationProbe;
3941
import de.rub.nds.tlsscanner.clientscanner.probe.ResumptionProbe;
42+
import de.rub.nds.tlsscanner.clientscanner.probe.ServerCertificateKeySizeProbe;
4043
import de.rub.nds.tlsscanner.clientscanner.probe.SniProbe;
4144
import de.rub.nds.tlsscanner.clientscanner.probe.Version13RandomProbe;
4245
import de.rub.nds.tlsscanner.clientscanner.report.ClientReport;
@@ -99,6 +102,9 @@ protected void fillProbeLists() {
99102
addProbeToProbeList(new AlpnProbe(parallelExecutor, config));
100103
addProbeToProbeList(new SniProbe(parallelExecutor, config));
101104
addProbeToProbeList(new ResumptionProbe(parallelExecutor, config));
105+
addProbeToProbeList(new ServerCertificateKeySizeProbe(parallelExecutor, config));
106+
addProbeToProbeList(new ConnectionClosingProbe(parallelExecutor, config));
107+
addProbeToProbeList(new ECPointFormatProbe(parallelExecutor, config));
102108
afterList.add(new Sweet32AfterProbe());
103109
afterList.add(new FreakAfterProbe());
104110
afterList.add(new LogjamAfterProbe());

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

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -141,25 +141,25 @@ public CipherSuiteProbe(ParallelExecutor executor, ClientScannerConfig scannerCo
141141
@Override
142142
public void executeTest() {
143143
pairLists = new LinkedList<>();
144+
List<State> statesToExecute = new LinkedList<>();
144145
for (ProtocolVersion version : protocolVersions) {
146+
pairLists.add(new VersionSuiteListPair(version, new LinkedList<>()));
145147
LOGGER.debug("Testing cipher suites for version {}", version);
146148

147-
Config config;
148-
if (version.isTLS13()) {
149-
config = getTls13Config();
150-
} else {
151-
config = getBaseConfig();
152-
}
153-
config.setHighestProtocolVersion(version);
154-
config.setDefaultSelectedProtocolVersion(version);
155-
config.setEnforceSettings(true);
156-
157149
List<CipherSuite> toTestList = getToTestCipherSuitesByVersion(version);
158-
List<CipherSuite> supportedSuites = new LinkedList<>();
159150

160151
while (!toTestList.isEmpty()) {
152+
Config config;
153+
if (version.isTLS13()) {
154+
config = getTls13Config();
155+
} else {
156+
config = getBaseConfig();
157+
}
158+
config.setHighestProtocolVersion(version);
159+
config.setDefaultSelectedProtocolVersion(version);
160+
config.setEnforceSettings(true);
161161
CipherSuite currentSuite = toTestList.get(0);
162-
config.setDefaultServerSupportedCipherSuites(toTestList);
162+
config.setDefaultServerSupportedCipherSuites(currentSuite);
163163
config.setDefaultSelectedCipherSuite(currentSuite);
164164
WorkflowTrace trace =
165165
new WorkflowConfigurationFactory(config)
@@ -168,15 +168,27 @@ public void executeTest() {
168168
trace.addTlsAction(new ReceiveTillAction(new FinishedMessage()));
169169

170170
State state = new State(config, trace);
171-
executeState(state);
172-
if (state.getWorkflowTrace().executedAsPlanned()) {
173-
supportedSuites.add(currentSuite);
174-
}
171+
statesToExecute.add(state);
172+
175173
toTestList.remove(currentSuite);
176174
}
177-
178-
if (!supportedSuites.isEmpty()) {
179-
pairLists.add(new VersionSuiteListPair(version, supportedSuites));
175+
}
176+
executeState(statesToExecute);
177+
for (State executedState : statesToExecute) {
178+
if (executedState.getWorkflowTrace().executedAsPlanned()
179+
&& executedState.getTlsContext().getSelectedCipherSuite()
180+
== executedState.getConfig().getDefaultSelectedCipherSuite()) {
181+
pairLists.stream()
182+
.filter(
183+
pair ->
184+
pair.getVersion()
185+
== executedState
186+
.getConfig()
187+
.getDefaultSelectedProtocolVersion())
188+
.findAny()
189+
.orElseThrow()
190+
.getCipherSuiteList()
191+
.add(executedState.getConfig().getDefaultSelectedCipherSuite());
180192
}
181193
}
182194
}
@@ -212,7 +224,6 @@ private Config getBaseConfig() {
212224
config.setStopActionsAfterIOException(true);
213225
config.setStopTraceAfterUnexpected(true);
214226
config.setStopActionsAfterWarning(true);
215-
config.setAddRenegotiationInfoExtension(false);
216227
return config;
217228
}
218229

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/*
2+
* TLS-Scanner - A TLS configuration and analysis tool based on TLS-Attacker
3+
*
4+
* Copyright 2017-2023 Ruhr University Bochum, Paderborn University, Technology Innovation Institute, and Hackmanit GmbH
5+
*
6+
* Licensed under Apache License, Version 2.0
7+
* http://www.apache.org/licenses/LICENSE-2.0.txt
8+
*/
9+
package de.rub.nds.tlsscanner.clientscanner.probe;
10+
11+
import de.rub.nds.scanner.core.probe.requirements.Requirement;
12+
import de.rub.nds.tlsattacker.core.config.Config;
13+
import de.rub.nds.tlsattacker.core.constants.RunningModeType;
14+
import de.rub.nds.tlsattacker.core.protocol.message.ApplicationMessage;
15+
import de.rub.nds.tlsattacker.core.state.State;
16+
import de.rub.nds.tlsattacker.core.workflow.ParallelExecutor;
17+
import de.rub.nds.tlsattacker.core.workflow.WorkflowTrace;
18+
import de.rub.nds.tlsattacker.core.workflow.action.SendAction;
19+
import de.rub.nds.tlsscanner.clientscanner.config.ClientScannerConfig;
20+
import de.rub.nds.tlsscanner.clientscanner.report.ClientReport;
21+
import de.rub.nds.tlsscanner.core.constants.TlsProbeType;
22+
import de.rub.nds.tlsscanner.core.probe.closing.ConnectionClosingUtils;
23+
24+
public class ConnectionClosingProbe extends TlsClientProbe<ClientScannerConfig, ClientReport> {
25+
26+
private long closedAfterFinishedDelta = ConnectionClosingUtils.NO_RESULT;
27+
private long closedAfterAppDataDelta = ConnectionClosingUtils.NO_RESULT;
28+
29+
public ConnectionClosingProbe(
30+
ParallelExecutor parallelExecutor, ClientScannerConfig scannerConfig) {
31+
super(parallelExecutor, TlsProbeType.CONNECTION_CLOSING_DELTA, scannerConfig);
32+
}
33+
34+
@Override
35+
protected void mergeData(ClientReport report) {
36+
report.setClosedAfterAppDataDelta(closedAfterAppDataDelta);
37+
report.setClosedAfterFinishedDelta(closedAfterFinishedDelta);
38+
}
39+
40+
@Override
41+
public void executeTest() {
42+
// TODO extend with HTTP app data
43+
Config tlsConfig = scannerConfig.createConfig();
44+
WorkflowTrace handshakeOnly =
45+
ConnectionClosingUtils.getWorkflowTrace(tlsConfig, RunningModeType.SERVER);
46+
WorkflowTrace handshakeWithAppData =
47+
ConnectionClosingUtils.getWorkflowTrace(tlsConfig, RunningModeType.SERVER);
48+
handshakeWithAppData.addTlsAction(new SendAction(new ApplicationMessage()));
49+
State runningState = new State(tlsConfig, handshakeOnly);
50+
executeState(runningState);
51+
closedAfterFinishedDelta = ConnectionClosingUtils.evaluateClosingDelta(runningState);
52+
runningState = new State(tlsConfig, handshakeWithAppData);
53+
executeState(runningState);
54+
closedAfterAppDataDelta = ConnectionClosingUtils.evaluateClosingDelta(runningState);
55+
}
56+
57+
@Override
58+
public Requirement getRequirements() {
59+
return Requirement.NO_REQUIREMENT;
60+
}
61+
62+
@Override
63+
public void adjustConfig(ClientReport report) {}
64+
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,8 @@ public Requirement getRequirements() {
187187
public void adjustConfig(ClientReport report) {
188188
supportedDheCipherSuites = new LinkedList<>();
189189
for (CipherSuite suite : report.getSupportedCipherSuites()) {
190-
if (AlgorithmResolver.getKeyExchangeAlgorithm(suite).isKeyExchangeDhe()) {
190+
if (AlgorithmResolver.getKeyExchangeAlgorithm(suite) != null
191+
&& AlgorithmResolver.getKeyExchangeAlgorithm(suite).isKeyExchangeDhe()) {
191192
supportedDheCipherSuites.add(suite);
192193
}
193194
}

0 commit comments

Comments
 (0)