Skip to content

Commit e29b65d

Browse files
authored
Merge pull request wolfSSL#9140 from dgarske/sniffer_partialoverlap
Improve sniffer detection of partial overlap
2 parents 095fd88 + 6dd626d commit e29b65d

1 file changed

Lines changed: 20 additions & 58 deletions

File tree

src/sniffer.c

Lines changed: 20 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -504,11 +504,6 @@ typedef struct KeyShareInfo {
504504
int curve_id;
505505
} KeyShareInfo;
506506

507-
/* maximum previous acks to capture */
508-
#ifndef WC_SNIFFER_HS_ACK_HIST_MAX
509-
#define WC_SNIFFER_HS_ACK_HIST_MAX 10
510-
#endif
511-
512507
/* Sniffer Session holds info for each client/server SSL/TLS session */
513508
typedef struct SnifferSession {
514509
SnifferServer* context; /* server context */
@@ -520,10 +515,10 @@ typedef struct SnifferSession {
520515
word16 cliPort; /* client port */
521516
word32 cliSeqStart; /* client start sequence */
522517
word32 srvSeqStart; /* server start sequence */
518+
word32 cliSeqLast; /* client last sequence */
519+
word32 srvSeqLast; /* server last sequence */
523520
word32 cliExpected; /* client expected sequence (relative) */
524521
word32 srvExpected; /* server expected sequence (relative) */
525-
word32 cliAcks[WC_SNIFFER_HS_ACK_HIST_MAX]; /* history of acks during handshake */
526-
word32 srvAcks[WC_SNIFFER_HS_ACK_HIST_MAX]; /* history of acks during handshake */
527522
FinCapture finCapture; /* retain out of order FIN s */
528523
Flags flags; /* session flags */
529524
time_t lastUsed; /* last used ticks */
@@ -5638,55 +5633,16 @@ static int AddFinCapture(SnifferSession* session, word32 sequence)
56385633
return 1;
56395634
}
56405635

5641-
static int FindPrevAck(SnifferSession* session, word32 realAck)
5642-
{
5643-
int i;
5644-
word32* acks = (session->flags.side == WOLFSSL_SERVER_END) ?
5645-
session->cliAcks : session->srvAcks;
5646-
/* if previous ack found return 1, otherwise 0 */
5647-
for (i=0; i<WC_SNIFFER_HS_ACK_HIST_MAX; i++) {
5648-
if (acks[i] == realAck) {
5649-
return 1;
5650-
}
5651-
5652-
}
5653-
return 0;
5654-
}
5655-
static void AddAck(SnifferSession* session, word32 realAck)
5656-
{
5657-
int i;
5658-
word32* acks = (session->flags.side == WOLFSSL_SERVER_END) ?
5659-
session->cliAcks : session->srvAcks;
5660-
/* find first empty ack slot */
5661-
for (i=0; i<WC_SNIFFER_HS_ACK_HIST_MAX; i++) {
5662-
if (acks[i] == 0) {
5663-
break;
5664-
}
5665-
}
5666-
/* if out of slots, find oldest */
5667-
if (i == WC_SNIFFER_HS_ACK_HIST_MAX) {
5668-
int idx = 0;
5669-
word32 lastAck = realAck;
5670-
for (i=0; i<WC_SNIFFER_HS_ACK_HIST_MAX; i++) {
5671-
if (acks[i] < lastAck) {
5672-
idx = i;
5673-
lastAck = acks[i];
5674-
}
5675-
}
5676-
i = idx;
5677-
}
5678-
5679-
acks[i] = realAck;
5680-
}
5681-
56825636
/* Adjust incoming sequence based on side */
56835637
/* returns 0 on success (continue), -1 on error, 1 on success (end) */
56845638
static int AdjustSequence(TcpInfo* tcpInfo, SnifferSession* session,
56855639
int* sslBytes, const byte** sslFrame, char* error)
56865640
{
56875641
int ret = 0;
56885642
word32 seqStart = (session->flags.side == WOLFSSL_SERVER_END) ?
5689-
session->cliSeqStart :session->srvSeqStart;
5643+
session->cliSeqStart : session->srvSeqStart;
5644+
word32* seqLast = (session->flags.side == WOLFSSL_SERVER_END) ?
5645+
&session->cliSeqLast : &session->srvSeqLast;
56905646
word32 real = tcpInfo->sequence - seqStart;
56915647
word32* expected = (session->flags.side == WOLFSSL_SERVER_END) ?
56925648
&session->cliExpected : &session->srvExpected;
@@ -5747,15 +5703,21 @@ static int AdjustSequence(TcpInfo* tcpInfo, SnifferSession* session,
57475703
}
57485704
}
57495705
else if (*sslBytes > 0) {
5750-
if (overlap < *sslBytes) {
5751-
/* adjust to remove partial overlap */
5752-
*sslFrame += overlap;
5706+
if (real + *sslBytes - 1 > *seqLast) {
5707+
/* fix segment overlap */
5708+
#ifdef DEBUG_SNIFFER
5709+
WOLFSSL* ssl = (session->flags.side == WOLFSSL_SERVER_END) ?
5710+
session->sslServer : session->sslClient;
5711+
printf("\tSegment %d overlap (%d -> %d)\n",
5712+
*sslBytes,
5713+
ssl->buffers.inputBuffer.length - overlap,
5714+
ssl->buffers.inputBuffer.length + *sslBytes - overlap - 1);
5715+
#endif
57535716
*sslBytes -= overlap;
5754-
}
5755-
else {
5756-
/* DUP overlap, allow */
5717+
*sslFrame += overlap;
57575718
}
57585719

5720+
/* DUP overlap, allow */
57595721
skipPartial = 0; /* do not reset sslBytes */
57605722
}
57615723
ret = 0;
@@ -5765,13 +5727,13 @@ static int AdjustSequence(TcpInfo* tcpInfo, SnifferSession* session,
57655727
* possible spurious retransmission. */
57665728
if (*sslBytes > 0) {
57675729
/* If packet has data attempt to process packet, if hasn't
5768-
* already been ack'd during handshake */
5730+
* already been received */
57695731
if (
57705732
#ifdef WOLFSSL_ASYNC_CRYPT
57715733
session->sslServer->error != WC_NO_ERR_TRACE(WC_PENDING_E) &&
57725734
session->pendSeq != tcpInfo->sequence &&
57735735
#endif
5774-
FindPrevAck(session, real)) {
5736+
real + *sslBytes -1 <= *seqLast) {
57755737
Trace(DUPLICATE_STR);
57765738
ret = 1;
57775739
}
@@ -5843,7 +5805,7 @@ static int AdjustSequence(TcpInfo* tcpInfo, SnifferSession* session,
58435805
*expected += 1;
58445806
}
58455807
if (*sslBytes > 0) {
5846-
AddAck(session, real);
5808+
*seqLast = real + *sslBytes - 1;
58475809
}
58485810
if (*sslBytes > 0 && skipPartial) {
58495811
*sslBytes = 0;

0 commit comments

Comments
 (0)