Skip to content

Commit bf2254b

Browse files
committed
A fix which should make the majority-vote oracle redundant
1 parent ceb2675 commit bf2254b

File tree

3 files changed

+44
-6
lines changed

3 files changed

+44
-6
lines changed

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1114,6 +1114,12 @@ public static Config createEmptyConfig() {
11141114
.hexStringToByteArray("963c77cdc13a2a8d75cdddd1e0449929843711c21d47ce6e6383cdda37e47da3");
11151115

11161116
private ECPointFormat defaultSelectedPointFormat = ECPointFormat.UNCOMPRESSED;
1117+
1118+
/**
1119+
* TLS-Attacker will parse encrypted messages with invalid MAC or padding
1120+
* as unknown if this option is set.
1121+
*/
1122+
private Boolean doNotParseInvalidMacOrPadMessages = false;
11171123

11181124
Config() {
11191125
defaultClientConnection = new OutboundConnection("client", 443, "localhost");
@@ -3349,4 +3355,12 @@ public Boolean isAddPWDProtectExtension() {
33493355
public void setAddPWDProtectExtension(Boolean addPWDProtectExtension) {
33503356
this.addPWDProtectExtension = addPWDProtectExtension;
33513357
}
3358+
3359+
public Boolean isDoNotParseInvalidMacOrPadMessages() {
3360+
return doNotParseInvalidMacOrPadMessages;
3361+
}
3362+
3363+
public void setDoNotParseInvalidMacOrPadMessages(Boolean doNotParseInvalidMacOrPadMessages) {
3364+
this.doNotParseInvalidMacOrPadMessages = doNotParseInvalidMacOrPadMessages;
3365+
}
33523366
}

TLS-Core/src/main/java/de/rub/nds/tlsattacker/core/workflow/action/executor/ReceiveMessageHelper.java

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,10 @@
3030
import de.rub.nds.tlsattacker.core.protocol.message.HandshakeMessage;
3131
import de.rub.nds.tlsattacker.core.protocol.message.ProtocolMessage;
3232
import de.rub.nds.tlsattacker.core.protocol.message.SSL2HandshakeMessage;
33+
import de.rub.nds.tlsattacker.core.protocol.message.UnknownMessage;
3334
import de.rub.nds.tlsattacker.core.record.AbstractRecord;
35+
import de.rub.nds.tlsattacker.core.record.cipher.RecordNullCipher;
36+
import de.rub.nds.tlsattacker.core.record.layer.RecordLayerType;
3437
import de.rub.nds.tlsattacker.core.state.TlsContext;
3538
import de.rub.nds.tlsattacker.transport.ConnectionEndType;
3639
import java.io.ByteArrayOutputStream;
@@ -224,19 +227,24 @@ private List<AbstractRecord> parseRecords(byte[] recordBytes, TlsContext context
224227
}
225228

226229
public MessageParsingResult parseMessages(RecordGroup recordGroup, TlsContext context) {
227-
byte[] cleanProtocolMessageBytes = recordGroup.getCleanBytes();
230+
228231
// Due to TLS 1.3 Encrypted Type it might be necessary to look for
229232
// new groups here
230233
List<ProtocolMessage> messages = new LinkedList<>();
231234
List<DtlsHandshakeMessageFragment> messageFragments = new LinkedList<>();
232235
for (RecordGroup group : RecordGroup.generateRecordGroups(recordGroup.getRecords(), context)) {
236+
boolean parseAsUnknown = false;
237+
if ( context.getConfig().isDoNotParseInvalidMacOrPadMessages() ) {
238+
parseAsUnknown = group.isMacOrPadInvalid(context);
239+
}
240+
byte[] cleanProtocolMessageBytes = recordGroup.getCleanBytes();
233241

234242
if (context.getChooser().getSelectedProtocolVersion().isDTLS()) {
235243
// if the protocol is DTLS, parsing HANDSHAKE messages results
236244
// in fragments.
237245
if (group.getProtocolMessageType() == ProtocolMessageType.HANDSHAKE) {
238246
List<ProtocolMessage> parsedMessages = handleCleanBytes(cleanProtocolMessageBytes,
239-
group.getProtocolMessageType(), context, true, true);
247+
group.getProtocolMessageType(), context, true, true, parseAsUnknown);
240248
for (ProtocolMessage parsedMessage : parsedMessages) {
241249
// we need this check since there might be
242250
// "unknown messages", note, we do not maintain ordering
@@ -258,25 +266,30 @@ public MessageParsingResult parseMessages(RecordGroup recordGroup, TlsContext co
258266
boolean onlyParse = isInOrder ? false : context.getConfig().isDtlsUpdateOnOutOfOrder() ? false
259267
: true;
260268
List<ProtocolMessage> parsedMessages = handleCleanBytes(cleanProtocolMessageBytes,
261-
group.getProtocolMessageType(), context, onlyParse, false);
269+
group.getProtocolMessageType(), context, onlyParse, false, parseAsUnknown);
262270
if (isInOrder || !context.getConfig().isDtlsExcludeOutOfOrder()) {
263271
messages.addAll(parsedMessages);
264272
}
265273
}
266274
} else {
267275
List<ProtocolMessage> parsedMessages = handleCleanBytes(cleanProtocolMessageBytes,
268-
group.getProtocolMessageType(), context, false, false);
276+
group.getProtocolMessageType(), context, false, false, parseAsUnknown);
269277
messages.addAll(parsedMessages);
270278
}
271279
}
272280
return new MessageParsingResult(messages, messageFragments);
273281
}
274282

275283
private List<ProtocolMessage> handleCleanBytes(byte[] cleanProtocolMessageBytes,
276-
ProtocolMessageType typeFromRecord, TlsContext context, boolean onlyParse,
277-
boolean handleHandshakeAsDtlsFragments) {
284+
ProtocolMessageType typeFromRecord, TlsContext context,
285+
boolean onlyParse, boolean handleHandshakeAsDtlsFragments, boolean parseAsUnknown) {
278286
int dataPointer = 0;
279287
List<ProtocolMessage> receivedMessages = new LinkedList<>();
288+
if (parseAsUnknown) {
289+
ParserResult result = tryHandleAsUnknownMessage(cleanProtocolMessageBytes, 0, context);
290+
receivedMessages.add(result.getMessage());
291+
return receivedMessages;
292+
}
280293
while (dataPointer < cleanProtocolMessageBytes.length) {
281294
ParserResult result = null;
282295
try {

TLS-Core/src/main/java/de/rub/nds/tlsattacker/core/workflow/action/executor/RecordGroup.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,17 @@ public void adjustContext(TlsContext context) {
113113
record.adjustContext(context);
114114
}
115115
}
116+
117+
public boolean isMacOrPadInvalid(TlsContext context) {
118+
for (AbstractRecord record : getRecords()) {
119+
if (record instanceof Record) {
120+
if (Boolean.FALSE.equals(((Record) record).getComputations().getMacValid())
121+
|| Boolean.FALSE.equals(((Record) record).getComputations().getPaddingValid()))
122+
return true;
123+
}
124+
}
125+
return false;
126+
}
116127

117128
private boolean addRecord(AbstractRecord record) {
118129
boolean isFitting = false;

0 commit comments

Comments
 (0)