Skip to content

Commit 4471af6

Browse files
Update loopback checks to discard bad loopback packets originating outside of the network (#1075)
* 009 Fail - Change dest add of loopback 127.0.0.1 addr * Fix unit tests
1 parent 163ae3f commit 4471af6

File tree

4 files changed

+36
-47
lines changed

4 files changed

+36
-47
lines changed

source/FreeRTOS_IPv4.c

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -221,19 +221,13 @@ BaseType_t xIsIPv4Multicast( uint32_t ulIPAddress )
221221
BaseType_t xBadIPv4Loopback( const IPHeader_t * const pxIPHeader )
222222
{
223223
BaseType_t xReturn = pdFALSE;
224-
const NetworkEndPoint_t * pxEndPoint = FreeRTOS_FindEndPointOnIP_IPv4( pxIPHeader->ulSourceIPAddress, 3 );
224+
BaseType_t x1 = ( xIsIPv4Loopback( pxIPHeader->ulDestinationIPAddress ) != 0 ) ? pdTRUE : pdFALSE;
225+
BaseType_t x2 = ( xIsIPv4Loopback( pxIPHeader->ulSourceIPAddress ) != 0 ) ? pdTRUE : pdFALSE;
225226

226-
/* Allow loopback packets from this node itself only. */
227-
if( pxEndPoint != NULL )
227+
if( x1 != x2 )
228228
{
229-
BaseType_t x1 = ( xIsIPv4Loopback( pxIPHeader->ulDestinationIPAddress ) != 0 ) ? pdTRUE : pdFALSE;
230-
BaseType_t x2 = ( xIsIPv4Loopback( pxIPHeader->ulSourceIPAddress ) != 0 ) ? pdTRUE : pdFALSE;
231-
232-
if( x1 != x2 )
233-
{
234-
/* Either the source or the destination address is an IPv4 loopback address. */
235-
xReturn = pdTRUE;
236-
}
229+
/* Either the source or the destination address is an IPv4 loopback address. */
230+
xReturn = pdTRUE;
237231
}
238232

239233
return xReturn;

source/include/FreeRTOS_IPv6_Private.h

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -179,22 +179,22 @@ struct xICMPRouterSolicitation_IPv6
179179
#include "pack_struct_end.h"
180180
typedef struct xICMPRouterSolicitation_IPv6 ICMPRouterSolicitation_IPv6_t;
181181

182-
#if ( ipconfigUSE_RA != 0 )
183-
#include "pack_struct_start.h"
184-
struct xICMPRouterAdvertisement_IPv6
185-
{
186-
uint8_t ucTypeOfMessage; /* 0 + 1 = 1 */
187-
uint8_t ucTypeOfService; /* 1 + 1 = 2 */
188-
uint16_t usChecksum; /* 2 + 2 = 4 */
189-
uint8_t ucHopLimit; /* 4 + 1 = 5 */
190-
uint8_t ucFlags; /* 5 + 1 = 6 */
191-
uint16_t usLifetime; /* 6 + 2 = 8 */
192-
uint16_t usReachableTime[ 2 ]; /* 8 + 4 = 12 */
193-
uint16_t usRetransTime[ 2 ]; /* 12 + 4 = 16 */
194-
}
195-
#include "pack_struct_end.h"
196-
typedef struct xICMPRouterAdvertisement_IPv6 ICMPRouterAdvertisement_IPv6_t;
182+
#include "pack_struct_start.h"
183+
struct xICMPRouterAdvertisement_IPv6
184+
{
185+
uint8_t ucTypeOfMessage; /* 0 + 1 = 1 */
186+
uint8_t ucTypeOfService; /* 1 + 1 = 2 */
187+
uint16_t usChecksum; /* 2 + 2 = 4 */
188+
uint8_t ucHopLimit; /* 4 + 1 = 5 */
189+
uint8_t ucFlags; /* 5 + 1 = 6 */
190+
uint16_t usLifetime; /* 6 + 2 = 8 */
191+
uint16_t usReachableTime[ 2 ]; /* 8 + 4 = 12 */
192+
uint16_t usRetransTime[ 2 ]; /* 12 + 4 = 16 */
193+
}
194+
#include "pack_struct_end.h"
195+
typedef struct xICMPRouterAdvertisement_IPv6 ICMPRouterAdvertisement_IPv6_t;
197196

197+
#if ( ipconfigUSE_RA != 0 )
198198
#include "pack_struct_start.h"
199199
struct xICMPPrefixOption_IPv6
200200
{

test/unit-test/FreeRTOS_IPv4/FreeRTOS_IPv4_utest.c

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,6 @@ void test_prvAllowIPPacketIPv4_NotMatchingIP( void )
261261
pxIPHeader->ucVersionHeaderLength = 0x45;
262262
pxIPHeader->ulDestinationIPAddress = pxEndpoint->ipv4_settings.ulIPAddress + 1;
263263

264-
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* from xBadIPv4Loopback() */
265264
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* From prvAllowIPPacketIPv4() */
266265
FreeRTOS_IsNetworkUp_ExpectAndReturn( pdTRUE );
267266

@@ -301,7 +300,6 @@ void test_prvAllowIPPacketIPv4_SourceIPBrdCast_DestIPMatch( void )
301300

302301
pxIPHeader->ulSourceIPAddress = 0xFFFFFFFF;
303302

304-
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( pxEndpoint ); /* from xBadIPv4Loopback() */
305303
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( pxEndpoint ); /* From prvAllowIPPacketIPv4() */
306304

307305
eResult = prvAllowIPPacketIPv4( pxIPPacket, pxNetworkBuffer, uxHeaderLength );
@@ -341,7 +339,7 @@ void test_prvAllowIPPacketIPv4_SourceIPBrdCast_DestIPBrdCast( void )
341339

342340
pxIPHeader->ulSourceIPAddress = 0xFFFFFFFF;
343341

344-
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* from xBadIPv4Loopback() */
342+
345343
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* From prvAllowIPPacketIPv4() */
346344

347345
eResult = prvAllowIPPacketIPv4( pxIPPacket, pxNetworkBuffer, uxHeaderLength );
@@ -381,7 +379,7 @@ void test_prvAllowIPPacketIPv4_SourceIPBrdCast_DestIPLLMNR( void )
381379

382380
pxIPHeader->ulSourceIPAddress = 0xFFFFFFFF;
383381

384-
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* from xBadIPv4Loopback() */
382+
385383
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* From prvAllowIPPacketIPv4() */
386384

387385
eResult = prvAllowIPPacketIPv4( pxIPPacket, pxNetworkBuffer, uxHeaderLength );
@@ -417,7 +415,7 @@ void test_prvAllowIPPacketIPv4_SourceIPBrdCast_NoLocalIP( void )
417415

418416
pxIPHeader->ulSourceIPAddress = 0xFFFFFFFF;
419417

420-
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* from xBadIPv4Loopback() */
418+
421419
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* From prvAllowIPPacketIPv4() */
422420
FreeRTOS_IsNetworkUp_ExpectAndReturn( pdFALSE );
423421

@@ -455,7 +453,7 @@ void test_prvAllowIPPacketIPv4_DestMACBrdCast_DestIPUnicast( void )
455453

456454
memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, xBroadcastMACAddress.ucBytes, sizeof( MACAddress_t ) );
457455

458-
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* from xBadIPv4Loopback() */
456+
459457
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* From prvAllowIPPacketIPv4() */
460458
FreeRTOS_IsNetworkUp_ExpectAndReturn( pdTRUE );
461459

@@ -492,7 +490,7 @@ void test_prvAllowIPPacketIPv4_SrcMACBrdCast( void )
492490

493491
memcpy( pxIPPacket->xEthernetHeader.xSourceAddress.ucBytes, xBroadcastMACAddress.ucBytes, sizeof( MACAddress_t ) );
494492

495-
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* from xBadIPv4Loopback() */
493+
496494
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* From prvAllowIPPacketIPv4() */
497495

498496
eResult = prvAllowIPPacketIPv4( pxIPPacket, pxNetworkBuffer, uxHeaderLength );
@@ -530,7 +528,7 @@ void test_prvAllowIPPacketIPv4_SrcMACBrdCastDestMACBrdCast( void )
530528
memcpy( pxIPPacket->xEthernetHeader.xSourceAddress.ucBytes, xBroadcastMACAddress.ucBytes, sizeof( MACAddress_t ) );
531529
memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, xBroadcastMACAddress.ucBytes, sizeof( MACAddress_t ) );
532530

533-
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* from xBadIPv4Loopback() */
531+
534532
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* From prvAllowIPPacketIPv4() */
535533

536534
eResult = prvAllowIPPacketIPv4( pxIPPacket, pxNetworkBuffer, uxHeaderLength );
@@ -573,7 +571,7 @@ void test_prvAllowIPPacketIPv4_SrcIPAddrIsMulticast( void )
573571

574572
pxIPHeader->ulSourceIPAddress = FreeRTOS_htonl( 0xE0000000 + 1 );
575573

576-
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* from xBadIPv4Loopback() */
574+
577575
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* From prvAllowIPPacketIPv4() */
578576

579577
eResult = prvAllowIPPacketIPv4( pxIPPacket, pxNetworkBuffer, uxHeaderLength );
@@ -615,7 +613,7 @@ void test_prvAllowIPPacketIPv4_IncorrectChecksum( void )
615613

616614
pxIPHeader->ulSourceIPAddress = 0xC0C00101;
617615

618-
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* from xBadIPv4Loopback() */
616+
619617
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* From prvAllowIPPacketIPv4() */
620618

621619
FreeRTOS_FindEndPointOnMAC_ExpectAnyArgsAndReturn( NULL );
@@ -661,7 +659,7 @@ void test_prvAllowIPPacketIPv4_IncorrectProtocolChecksum( void )
661659

662660
pxIPHeader->ulSourceIPAddress = 0xC0C00101;
663661

664-
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* from xBadIPv4Loopback() */
662+
665663
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* From prvAllowIPPacketIPv4() */
666664

667665
FreeRTOS_FindEndPointOnMAC_ExpectAnyArgsAndReturn( NULL );
@@ -708,7 +706,7 @@ void test_prvAllowIPPacketIPv4_HappyPath( void )
708706

709707
pxIPHeader->ulSourceIPAddress = 0xC0C00101;
710708

711-
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* from xBadIPv4Loopback() */
709+
712710
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* From prvAllowIPPacketIPv4() */
713711

714712
FreeRTOS_FindEndPointOnMAC_ExpectAnyArgsAndReturn( NULL );
@@ -753,7 +751,7 @@ void test_prvAllowIPPacketIPv4_LoopbackHappyPath( void )
753751

754752
memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, xMACAddress.ucBytes, sizeof( MACAddress_t ) );
755753

756-
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* from xBadIPv4Loopback() */
754+
757755
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* From prvAllowIPPacketIPv4() */
758756

759757
FreeRTOS_FindEndPointOnMAC_ExpectAnyArgsAndReturn( pxEndpoint );
@@ -797,7 +795,7 @@ void test_prvAllowIPPacketIPv4_DestMacBroadcastIPNotBroadcast( void )
797795

798796
pxIPHeader->ulSourceIPAddress = 0xC0C00101;
799797

800-
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* from xBadIPv4Loopback() */
798+
801799
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* From prvAllowIPPacketIPv4() */
802800

803801
eResult = prvAllowIPPacketIPv4( pxIPPacket, pxNetworkBuffer, uxHeaderLength );
@@ -909,8 +907,6 @@ static void xRunBadIPv4Loopback( uint32_t ulSource,
909907

910908
memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, xMACAddress.ucBytes, sizeof( MACAddress_t ) );
911909

912-
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( pxEndpoint );
913-
914910
if( eExpected != eReleaseBuffer )
915911
{
916912
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( pxEndpoint );

test/unit-test/FreeRTOS_IPv4_DiffConfig/FreeRTOS_IPv4_DiffConfig_utest.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,6 @@ void test_prvAllowIPPacketIPv4_BroadcastSourceIP( void )
106106

107107
pxIPHeader->ulSourceIPAddress = 0xFFFFFFFF;
108108

109-
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* from xBadIPv4Loopback() */
110109
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* From prvAllowIPPacketIPv4() */
111110

112111
eResult = prvAllowIPPacketIPv4( pxIPPacket, pxNetworkBuffer, uxHeaderLength );
@@ -149,7 +148,7 @@ void test_prvAllowIPPacketIPv4_BufferLengthLessThanMinimum( void )
149148

150149
pxIPHeader->ulSourceIPAddress = 0xC0C00101;
151150

152-
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* from xBadIPv4Loopback() */
151+
153152
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* From prvAllowIPPacketIPv4() */
154153

155154
eResult = prvAllowIPPacketIPv4( pxIPPacket, pxNetworkBuffer, uxHeaderLength );
@@ -196,7 +195,7 @@ void test_prvAllowIPPacketIPv4_UDPCheckSumZero( void )
196195

197196
pxIPHeader->ulSourceIPAddress = 0xC0C00101;
198197

199-
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* from xBadIPv4Loopback() */
198+
200199
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* From prvAllowIPPacketIPv4() */
201200

202201
eResult = prvAllowIPPacketIPv4( pxIPPacket, pxNetworkBuffer, uxHeaderLength );
@@ -249,7 +248,7 @@ void test_prvAllowIPPacketIPv4_UDP_HappyPath( void )
249248
/* Non-zero checksum. */
250249
pxProtPack->xUDPPacket.xUDPHeader.usChecksum = 0xFF12;
251250

252-
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* from xBadIPv4Loopback() */
251+
253252
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* From prvAllowIPPacketIPv4() */
254253

255254
eResult = prvAllowIPPacketIPv4( pxIPPacket, pxNetworkBuffer, uxHeaderLength );
@@ -296,7 +295,7 @@ void test_prvAllowIPPacketIPv4_TCP_HappyPath( void )
296295

297296
pxIPHeader->ulSourceIPAddress = 0xC0C00101;
298297

299-
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* from xBadIPv4Loopback() */
298+
300299
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* From prvAllowIPPacketIPv4() */
301300

302301
eResult = prvAllowIPPacketIPv4( pxIPPacket, pxNetworkBuffer, uxHeaderLength );

0 commit comments

Comments
 (0)