Skip to content

Commit 7d5f459

Browse files
authored
Merge pull request #749 from tls-attacker/fuzzer
Fuzzer changes
2 parents 9fa9b64 + 232f349 commit 7d5f459

File tree

201 files changed

+1682
-443
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

201 files changed

+1682
-443
lines changed

Attacks/src/main/java/de/rub/nds/tlsattacker/attacks/impl/BleichenbacherAttacker.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,16 @@ public class BleichenbacherAttacker extends Attacker<BleichenbacherCommandConfig
6363

6464
private List<VectorResponse> fingerprintPairList;
6565

66+
private boolean selfShutdown = false;
67+
6668
/**
6769
* @param bleichenbacherConfig
6870
* @param baseConfig
6971
*/
7072
public BleichenbacherAttacker(BleichenbacherCommandConfig bleichenbacherConfig, Config baseConfig) {
7173
super(bleichenbacherConfig, baseConfig);
7274
executor = new ParallelExecutor(1, 3);
75+
selfShutdown = true;
7376
}
7477

7578
/**
@@ -81,6 +84,7 @@ public BleichenbacherAttacker(BleichenbacherCommandConfig bleichenbacherConfig,
8184
ParallelExecutor executor) {
8285
super(bleichenbacherConfig, baseConfig);
8386
this.executor = executor;
87+
selfShutdown = false;
8488
}
8589

8690
/**
@@ -151,6 +155,9 @@ public EqualityError isVulnerable(List<Pkcs1Vector> pkcs1Vectors, RSAPublicKey p
151155
if (error != EqualityError.NONE) {
152156
CONSOLE.info("Found a vulnerability with " + config.getWorkflowType().getDescription());
153157
}
158+
if (selfShutdown && !config.isExecuteAttack()) {
159+
executor.shutdown();
160+
}
154161
return error;
155162
}
156163

@@ -298,6 +305,9 @@ public void executeAttack() {
298305
attacker.attack();
299306
BigInteger solution = attacker.getSolution();
300307
CONSOLE.info(solution.toString(16));
308+
if (selfShutdown) {
309+
executor.shutdown();
310+
}
301311
}
302312

303313
private ResponseFingerprint extractValidFingerprint(RSAPublicKey publicKey, ProtocolVersion version) {

Attacks/src/main/java/de/rub/nds/tlsattacker/attacks/pkcs1/Bleichenbacher.java

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public void attack() throws OracleException {
7474
if (this.msgIsPKCS) {
7575
LOGGER.info("Step skipped --> " + "Message is considered as PKCS compliant.");
7676
LOGGER.info("Testing the validity of the original message");
77-
oracle.checkPKCSConformity(encryptedMsg);
77+
saveCheckPKCSConformity(encryptedMsg);
7878
s0 = BigInteger.ONE;
7979
c0 = new BigInteger(1, encryptedMsg);
8080
interval = new Interval[] { new Interval(BigInteger.valueOf(2).multiply(bigB),
@@ -116,7 +116,7 @@ protected void stepOne() throws OracleException {
116116
send = prepareMsg(ciphered, si);
117117

118118
// check PKCS#1 conformity
119-
pkcsConform = oracle.checkPKCSConformity(send);
119+
pkcsConform = saveCheckPKCSConformity(send);
120120
} while (!pkcsConform);
121121

122122
c0 = new BigInteger(1, send);
@@ -153,7 +153,7 @@ protected void stepTwo(final int i) throws OracleException {
153153
*/
154154
protected void stepTwoA() throws OracleException {
155155
byte[] send;
156-
boolean pkcsConform;
156+
boolean pkcsConform = false;
157157
BigInteger n = publicKey.getModulus();
158158

159159
LOGGER.debug("Step 2a: Starting the search");
@@ -173,21 +173,22 @@ protected void stepTwoA() throws OracleException {
173173
send = prepareMsg(c0, si);
174174

175175
// check PKCS#1 conformity
176-
pkcsConform = oracle.checkPKCSConformity(send);
176+
pkcsConform = saveCheckPKCSConformity(send);
177+
177178
} while (!pkcsConform);
178179
}
179180

180181
private void stepTwoB() throws OracleException {
181182
byte[] send;
182-
boolean pkcsConform;
183+
boolean pkcsConform = false;
183184
LOGGER.debug("Step 2b: Searching with more than" + " one interval left");
184185

185186
do {
186187
si = si.add(BigInteger.ONE);
187188
send = prepareMsg(c0, si);
188189

189190
// check PKCS#1 conformity
190-
pkcsConform = oracle.checkPKCSConformity(send);
191+
pkcsConform = saveCheckPKCSConformity(send);
191192
} while (!pkcsConform);
192193
}
193194

@@ -228,10 +229,26 @@ protected void stepTwoC() throws OracleException {
228229
send = prepareMsg(c0, si);
229230

230231
// check PKCS#1 conformity
231-
pkcsConform = oracle.checkPKCSConformity(send);
232+
pkcsConform = saveCheckPKCSConformity(send);
233+
232234
} while (!pkcsConform);
233235
}
234236

237+
private boolean saveCheckPKCSConformity(byte[] send) {
238+
boolean pkcsConform = false;
239+
boolean needToRedo = true;
240+
while (needToRedo) {
241+
242+
try {
243+
pkcsConform = oracle.checkPKCSConformity(send);
244+
needToRedo = false;
245+
} catch (Exception e) {
246+
LOGGER.warn(e.toString());
247+
}
248+
}
249+
return pkcsConform;
250+
}
251+
235252
private void stepThree(final int i) {
236253
BigInteger n = publicKey.getModulus();
237254
BigInteger r;

Attacks/src/main/java/de/rub/nds/tlsattacker/attacks/task/FingerPrintTask.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99

1010
package de.rub.nds.tlsattacker.attacks.task;
1111

12-
import de.rub.nds.tlsattacker.attacks.exception.FingerprintExtractionException;
1312
import de.rub.nds.tlsattacker.attacks.util.response.ResponseExtractor;
1413
import de.rub.nds.tlsattacker.attacks.util.response.ResponseFingerprint;
1514
import de.rub.nds.tlsattacker.core.state.State;

Attacks/src/main/resources/log4j2.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
<Logger name="de.rub.nds.tlsattacker.core.state" level="WARN"/>
3535
<Logger name="de.rub.nds.tlsattacker.core.constants" level="WARN"/>
3636
<Logger name="de.rub.nds.modifiablevariable" level="WARN"/>
37-
37+
<Logger name="de.rub.nds.tlsattacker.transport.tcp.ClientTcpTransportHandler" level="WARN"/>
3838
<Root level="INFO">
3939
<AppenderRef ref="Console"/>
4040
</Root>

TLS-Core/src/main/java/de/rub/nds/tlsattacker/core/config/Config.java

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
package de.rub.nds.tlsattacker.core.config;
1111

1212
import de.rub.nds.modifiablevariable.util.ArrayConverter;
13+
import de.rub.nds.modifiablevariable.util.IllegalStringAdapter;
1314
import de.rub.nds.modifiablevariable.util.UnformattedByteArrayAdapter;
1415
import de.rub.nds.tlsattacker.core.certificate.CertificateKeyPair;
1516
import de.rub.nds.tlsattacker.core.connection.InboundConnection;
@@ -78,15 +79,11 @@
7879
import java.util.Arrays;
7980
import java.util.LinkedList;
8081
import java.util.List;
81-
import java.util.Objects;
8282
import javax.xml.bind.annotation.XmlAccessType;
8383
import javax.xml.bind.annotation.XmlAccessorType;
8484
import javax.xml.bind.annotation.XmlElement;
85-
import javax.xml.bind.annotation.XmlElementDecl;
8685
import javax.xml.bind.annotation.XmlElementWrapper;
87-
import javax.xml.bind.annotation.XmlList;
8886
import javax.xml.bind.annotation.XmlRootElement;
89-
import javax.xml.bind.annotation.XmlSchema;
9087
import javax.xml.bind.annotation.XmlType;
9188
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
9289
import org.apache.logging.log4j.LogManager;
@@ -376,8 +373,10 @@ public static Config createEmptyConfig() {
376373
*/
377374
@XmlElement(name = "defaultProposedAlpnProtocol")
378375
@XmlElementWrapper
376+
@XmlJavaTypeAdapter(IllegalStringAdapter.class)
379377
private List<String> defaultProposedAlpnProtocols;
380378

379+
@XmlJavaTypeAdapter(IllegalStringAdapter.class)
381380
private String defaultSelectedAlpnProtocol = AlpnProtocol.HTTP_2.getConstant();
382381

383382
/**
@@ -622,11 +621,13 @@ public static Config createEmptyConfig() {
622621
/**
623622
* Default cookie value to use if addHttpsCookie is true.
624623
*/
624+
@XmlJavaTypeAdapter(IllegalStringAdapter.class)
625625
private String defaultHttpsCookieName = "tls-attacker";
626626

627627
/**
628628
* Default cookie value to use if addHttpsCookie is true.
629629
*/
630+
@XmlJavaTypeAdapter(IllegalStringAdapter.class)
630631
private String defaultHttpsCookieValue = "42130912812";
631632

632633
/**
@@ -861,6 +862,7 @@ public static Config createEmptyConfig() {
861862

862863
private GOSTCurve defaultSelectedGostCurve = GOSTCurve.GostR3410_2001_CryptoPro_XchB;
863864

865+
@XmlJavaTypeAdapter(IllegalStringAdapter.class)
864866
private String defaultApplicationMessageData = "Test";
865867

866868
@XmlElement(name = "clientCertificateType")
@@ -1145,6 +1147,7 @@ public static Config createEmptyConfig() {
11451147
* requestPath to use in LocationHeader if none is saved during the connection, e.g. no received HttpsRequestMessage
11461148
* or httpsParsing is disabled
11471149
*/
1150+
@XmlJavaTypeAdapter(IllegalStringAdapter.class)
11481151
private String defaultHttpsRequestPath = "/";
11491152

11501153
private StarttlsType starttlsType = StarttlsType.NONE;
@@ -1191,6 +1194,7 @@ public static Config createEmptyConfig() {
11911194
/**
11921195
* Use username from the example of RFC8492
11931196
*/
1197+
@XmlJavaTypeAdapter(IllegalStringAdapter.class)
11941198
private String defaultClientPWDUsername = "fred";
11951199

11961200
/**
@@ -1209,6 +1213,7 @@ public static Config createEmptyConfig() {
12091213
/**
12101214
* Use password from the example of RFC8492
12111215
*/
1216+
@XmlJavaTypeAdapter(IllegalStringAdapter.class)
12121217
private String defaultPWDPassword = "barney";
12131218

12141219
/**
@@ -3560,7 +3565,7 @@ public void setDefaultClientPWDUsername(String username) {
35603565
}
35613566

35623567
public byte[] getDefaultServerPWDSalt() {
3563-
return defaultServerPWDSalt;
3568+
return Arrays.copyOf(defaultServerPWDSalt, defaultServerPWDSalt.length);
35643569
}
35653570

35663571
public void setDefaultServerPWDSalt(byte[] salt) {
@@ -3584,31 +3589,31 @@ public void setDefaultPWDIterations(Integer defaultPWDIterations) {
35843589
}
35853590

35863591
public byte[] getDefaultServerPWDPrivate() {
3587-
return defaultServerPWDPrivate;
3592+
return Arrays.copyOf(defaultServerPWDPrivate, defaultServerPWDPrivate.length);
35883593
}
35893594

35903595
public void setDefaultServerPWDPrivate(byte[] defaultServerPWDPrivate) {
35913596
this.defaultServerPWDPrivate = defaultServerPWDPrivate;
35923597
}
35933598

35943599
public byte[] getDefaultServerPWDMask() {
3595-
return defaultServerPWDMask;
3600+
return Arrays.copyOf(defaultServerPWDMask, defaultServerPWDMask.length);
35963601
}
35973602

35983603
public void setDefaultServerPWDMask(byte[] defaultServerPWDMask) {
35993604
this.defaultServerPWDMask = defaultServerPWDMask;
36003605
}
36013606

36023607
public byte[] getDefaultClientPWDPrivate() {
3603-
return defaultClientPWDPrivate;
3608+
return Arrays.copyOf(defaultClientPWDPrivate, defaultClientPWDPrivate.length);
36043609
}
36053610

36063611
public void setDefaultClientPWDPrivate(byte[] defaultClientPWDPrivate) {
36073612
this.defaultClientPWDPrivate = defaultClientPWDPrivate;
36083613
}
36093614

36103615
public byte[] getDefaultClientPWDMask() {
3611-
return defaultClientPWDMask;
3616+
return Arrays.copyOf(defaultClientPWDMask, defaultClientPWDMask.length);
36123617
}
36133618

36143619
public void setDefaultClientPWDMask(byte[] defaultClientPWDMask) {
@@ -3700,23 +3705,23 @@ public final void setEsniServerKeyPairs(KeyShareEntry... esniServerKeyPairs) {
37003705
}
37013706

37023707
public byte[] getDefaultEsniClientNonce() {
3703-
return defaultEsniClientNonce;
3708+
return Arrays.copyOf(defaultEsniClientNonce, defaultEsniClientNonce.length);
37043709
}
37053710

37063711
public void setDefaultEsniClientNonce(byte[] defaultEsniClientNonce) {
37073712
this.defaultEsniClientNonce = defaultEsniClientNonce;
37083713
}
37093714

37103715
public byte[] getDefaultEsniServerNonce() {
3711-
return defaultEsniServerNonce;
3716+
return Arrays.copyOf(defaultEsniServerNonce, defaultEsniServerNonce.length);
37123717
}
37133718

37143719
public void setDefaultEsniServerNonce(byte[] defaultEsniServerNonce) {
37153720
this.defaultEsniServerNonce = defaultEsniServerNonce;
37163721
}
37173722

37183723
public byte[] getDefaultEsniRecordBytes() {
3719-
return defaultEsniRecordBytes;
3724+
return Arrays.copyOf(defaultEsniRecordBytes, defaultEsniRecordBytes.length);
37203725
}
37213726

37223727
public void setDefaultEsniRecordBytes(byte[] defaultEsniRecordBytes) {
@@ -3732,7 +3737,7 @@ public void setDefaultEsniRecordVersion(EsniDnsKeyRecordVersion defaultEsniRecor
37323737
}
37333738

37343739
public byte[] getDefaultEsniRecordChecksum() {
3735-
return defaultEsniRecordChecksum;
3740+
return Arrays.copyOf(defaultEsniRecordChecksum, defaultEsniRecordChecksum.length);
37363741
}
37373742

37383743
public void setDefaultEsniRecordChecksum(byte[] defaultEsniRecordChecksum) {
@@ -3872,7 +3877,7 @@ public void setDefaultMaxEarlyDataSize(Integer defaultMaxEarlyDataSize) {
38723877
}
38733878

38743879
public byte[] getDefaultLastClientHello() {
3875-
return defaultLastClientHello;
3880+
return Arrays.copyOf(defaultLastClientHello, defaultLastClientHello.length);
38763881
}
38773882

38783883
public void setDefaultLastClientHello(byte[] defaultLastClientHello) {

TLS-Core/src/main/java/de/rub/nds/tlsattacker/core/config/ConfigIO.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import java.io.OutputStream;
2424
import javax.xml.XMLConstants;
2525
import javax.xml.bind.DataBindingException;
26+
import java.nio.charset.StandardCharsets;
2627
import javax.xml.bind.JAXB;
2728
import javax.xml.bind.JAXBContext;
2829
import javax.xml.bind.JAXBException;
@@ -65,10 +66,9 @@ public static void write(Config config, File f) {
6566

6667
public static void write(Config config, OutputStream os) {
6768
ByteArrayOutputStream tempStream = new ByteArrayOutputStream();
68-
6969
JAXB.marshal(config, tempStream);
7070
try {
71-
os.write(new String(tempStream.toByteArray()).getBytes());
71+
os.write(new String(tempStream.toByteArray()).getBytes(StandardCharsets.ISO_8859_1));
7272
} catch (IOException ex) {
7373
throw new RuntimeException("Could not format XML");
7474
}

TLS-Core/src/main/java/de/rub/nds/tlsattacker/core/constants/AlgorithmResolver.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@ public static CipherAlgorithm getCipher(CipherSuite cipherSuite) {
305305
if (cipherSuite == CipherSuite.TLS_FALLBACK_SCSV
306306
|| cipherSuite == CipherSuite.TLS_EMPTY_RENEGOTIATION_INFO_SCSV) {
307307
throw new UnsupportedOperationException(
308-
"The CipherSuite:" + cipherSuite.name() + " does not specify a Cipher");
308+
"The CipherSuite:" + cipherSuite.name() + " does not specify a CipherAlgorithm");
309309
}
310310

311311
LOGGER.warn("The cipher algorithm in " + cipherSuite + " is not supported yet. Falling back to NULL.");

TLS-Core/src/main/java/de/rub/nds/tlsattacker/core/crypto/SignatureCalculator.java

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import de.rub.nds.modifiablevariable.util.ArrayConverter;
1313
import de.rub.nds.modifiablevariable.util.BadRandom;
1414
import de.rub.nds.tlsattacker.core.constants.AlgorithmResolver;
15+
import de.rub.nds.tlsattacker.core.constants.KeyExchangeAlgorithm;
1516
import de.rub.nds.tlsattacker.core.constants.ProtocolVersion;
1617
import de.rub.nds.tlsattacker.core.constants.SignatureAndHashAlgorithm;
1718
import de.rub.nds.tlsattacker.core.exceptions.CryptoException;
@@ -66,17 +67,21 @@ public static byte[] generateSignature(PrivateKey key, byte[] toBeSigned, Signat
6667
|| chooser.getSelectedProtocolVersion() == ProtocolVersion.TLS10
6768
|| chooser.getSelectedProtocolVersion() == ProtocolVersion.TLS11
6869
|| chooser.getSelectedProtocolVersion() == ProtocolVersion.DTLS10) {
69-
if (AlgorithmResolver.getKeyExchangeAlgorithm(chooser.getSelectedCipherSuite()).name().contains("RSA")) {
70-
algoName = "NONEwithRSA";
71-
toBeSigned = ArrayConverter.concatenate(MD5Utils.md5(toBeSigned), SHA1Utils.sha1(toBeSigned));
72-
} else if (AlgorithmResolver.getKeyExchangeAlgorithm(chooser.getSelectedCipherSuite()).name()
73-
.contains("ECDSA")) {
74-
algoName = "SHA1withECDSA";
75-
} else if (AlgorithmResolver.getKeyExchangeAlgorithm(chooser.getSelectedCipherSuite()).name()
76-
.contains("DSS")) {
77-
algoName = "SHA1withDSA";
70+
KeyExchangeAlgorithm keyExchangeAlgorithm =
71+
AlgorithmResolver.getKeyExchangeAlgorithm(chooser.getSelectedCipherSuite());
72+
if (keyExchangeAlgorithm != null) {
73+
if (keyExchangeAlgorithm.name().contains("RSA")) {
74+
algoName = "NONEwithRSA";
75+
toBeSigned = ArrayConverter.concatenate(MD5Utils.md5(toBeSigned), SHA1Utils.sha1(toBeSigned));
76+
} else if (keyExchangeAlgorithm.name().contains("ECDSA")) {
77+
algoName = "SHA1withECDSA";
78+
} else if (keyExchangeAlgorithm.name().contains("DSS")) {
79+
algoName = "SHA1withDSA";
80+
} else {
81+
throw new UnsupportedOperationException("Cipher suite not supported - Check Debug Log");
82+
}
7883
} else {
79-
throw new UnsupportedOperationException("Cipher suite not supported - Check Debug Log");
84+
algoName = algorithm.getJavaName();
8085
}
8186
} else {
8287
algoName = algorithm.getJavaName();
@@ -90,7 +95,7 @@ public static byte[] generateSignature(PrivateKey key, byte[] toBeSigned, Signat
9095
instance.update(toBeSigned);
9196
return instance.sign();
9297
} catch (SignatureException | InvalidKeyException | NoSuchAlgorithmException
93-
| InvalidAlgorithmParameterException ex) {
98+
| InvalidAlgorithmParameterException | IllegalArgumentException ex) {
9499
throw new CryptoException("Could not sign Data", ex);
95100
}
96101
}

0 commit comments

Comments
 (0)