Skip to content

Commit

Permalink
Update loopback checks to discard bad loopback packets originating ou…
Browse files Browse the repository at this point in the history
…tside of the network (#1075)

* 009 Fail - Change dest add of loopback 127.0.0.1 addr

* Fix unit tests
  • Loading branch information
tony-josi-aws committed Jan 17, 2024
1 parent 163ae3f commit 4471af6
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 47 deletions.
16 changes: 5 additions & 11 deletions source/FreeRTOS_IPv4.c
Original file line number Diff line number Diff line change
Expand Up @@ -221,19 +221,13 @@ BaseType_t xIsIPv4Multicast( uint32_t ulIPAddress )
BaseType_t xBadIPv4Loopback( const IPHeader_t * const pxIPHeader )
{
BaseType_t xReturn = pdFALSE;
const NetworkEndPoint_t * pxEndPoint = FreeRTOS_FindEndPointOnIP_IPv4( pxIPHeader->ulSourceIPAddress, 3 );
BaseType_t x1 = ( xIsIPv4Loopback( pxIPHeader->ulDestinationIPAddress ) != 0 ) ? pdTRUE : pdFALSE;
BaseType_t x2 = ( xIsIPv4Loopback( pxIPHeader->ulSourceIPAddress ) != 0 ) ? pdTRUE : pdFALSE;

/* Allow loopback packets from this node itself only. */
if( pxEndPoint != NULL )
if( x1 != x2 )
{
BaseType_t x1 = ( xIsIPv4Loopback( pxIPHeader->ulDestinationIPAddress ) != 0 ) ? pdTRUE : pdFALSE;
BaseType_t x2 = ( xIsIPv4Loopback( pxIPHeader->ulSourceIPAddress ) != 0 ) ? pdTRUE : pdFALSE;

if( x1 != x2 )
{
/* Either the source or the destination address is an IPv4 loopback address. */
xReturn = pdTRUE;
}
/* Either the source or the destination address is an IPv4 loopback address. */
xReturn = pdTRUE;
}

return xReturn;
Expand Down
30 changes: 15 additions & 15 deletions source/include/FreeRTOS_IPv6_Private.h
Original file line number Diff line number Diff line change
Expand Up @@ -179,22 +179,22 @@ struct xICMPRouterSolicitation_IPv6
#include "pack_struct_end.h"
typedef struct xICMPRouterSolicitation_IPv6 ICMPRouterSolicitation_IPv6_t;

#if ( ipconfigUSE_RA != 0 )
#include "pack_struct_start.h"
struct xICMPRouterAdvertisement_IPv6
{
uint8_t ucTypeOfMessage; /* 0 + 1 = 1 */
uint8_t ucTypeOfService; /* 1 + 1 = 2 */
uint16_t usChecksum; /* 2 + 2 = 4 */
uint8_t ucHopLimit; /* 4 + 1 = 5 */
uint8_t ucFlags; /* 5 + 1 = 6 */
uint16_t usLifetime; /* 6 + 2 = 8 */
uint16_t usReachableTime[ 2 ]; /* 8 + 4 = 12 */
uint16_t usRetransTime[ 2 ]; /* 12 + 4 = 16 */
}
#include "pack_struct_end.h"
typedef struct xICMPRouterAdvertisement_IPv6 ICMPRouterAdvertisement_IPv6_t;
#include "pack_struct_start.h"
struct xICMPRouterAdvertisement_IPv6
{
uint8_t ucTypeOfMessage; /* 0 + 1 = 1 */
uint8_t ucTypeOfService; /* 1 + 1 = 2 */
uint16_t usChecksum; /* 2 + 2 = 4 */
uint8_t ucHopLimit; /* 4 + 1 = 5 */
uint8_t ucFlags; /* 5 + 1 = 6 */
uint16_t usLifetime; /* 6 + 2 = 8 */
uint16_t usReachableTime[ 2 ]; /* 8 + 4 = 12 */
uint16_t usRetransTime[ 2 ]; /* 12 + 4 = 16 */
}
#include "pack_struct_end.h"
typedef struct xICMPRouterAdvertisement_IPv6 ICMPRouterAdvertisement_IPv6_t;

#if ( ipconfigUSE_RA != 0 )
#include "pack_struct_start.h"
struct xICMPPrefixOption_IPv6
{
Expand Down
28 changes: 12 additions & 16 deletions test/unit-test/FreeRTOS_IPv4/FreeRTOS_IPv4_utest.c
Original file line number Diff line number Diff line change
Expand Up @@ -261,7 +261,6 @@ void test_prvAllowIPPacketIPv4_NotMatchingIP( void )
pxIPHeader->ucVersionHeaderLength = 0x45;
pxIPHeader->ulDestinationIPAddress = pxEndpoint->ipv4_settings.ulIPAddress + 1;

FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* from xBadIPv4Loopback() */
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* From prvAllowIPPacketIPv4() */
FreeRTOS_IsNetworkUp_ExpectAndReturn( pdTRUE );

Expand Down Expand Up @@ -301,7 +300,6 @@ void test_prvAllowIPPacketIPv4_SourceIPBrdCast_DestIPMatch( void )

pxIPHeader->ulSourceIPAddress = 0xFFFFFFFF;

FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( pxEndpoint ); /* from xBadIPv4Loopback() */
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( pxEndpoint ); /* From prvAllowIPPacketIPv4() */

eResult = prvAllowIPPacketIPv4( pxIPPacket, pxNetworkBuffer, uxHeaderLength );
Expand Down Expand Up @@ -341,7 +339,7 @@ void test_prvAllowIPPacketIPv4_SourceIPBrdCast_DestIPBrdCast( void )

pxIPHeader->ulSourceIPAddress = 0xFFFFFFFF;

FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* from xBadIPv4Loopback() */

FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* From prvAllowIPPacketIPv4() */

eResult = prvAllowIPPacketIPv4( pxIPPacket, pxNetworkBuffer, uxHeaderLength );
Expand Down Expand Up @@ -381,7 +379,7 @@ void test_prvAllowIPPacketIPv4_SourceIPBrdCast_DestIPLLMNR( void )

pxIPHeader->ulSourceIPAddress = 0xFFFFFFFF;

FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* from xBadIPv4Loopback() */

FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* From prvAllowIPPacketIPv4() */

eResult = prvAllowIPPacketIPv4( pxIPPacket, pxNetworkBuffer, uxHeaderLength );
Expand Down Expand Up @@ -417,7 +415,7 @@ void test_prvAllowIPPacketIPv4_SourceIPBrdCast_NoLocalIP( void )

pxIPHeader->ulSourceIPAddress = 0xFFFFFFFF;

FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* from xBadIPv4Loopback() */

FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* From prvAllowIPPacketIPv4() */
FreeRTOS_IsNetworkUp_ExpectAndReturn( pdFALSE );

Expand Down Expand Up @@ -455,7 +453,7 @@ void test_prvAllowIPPacketIPv4_DestMACBrdCast_DestIPUnicast( void )

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

FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* from xBadIPv4Loopback() */

FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* From prvAllowIPPacketIPv4() */
FreeRTOS_IsNetworkUp_ExpectAndReturn( pdTRUE );

Expand Down Expand Up @@ -492,7 +490,7 @@ void test_prvAllowIPPacketIPv4_SrcMACBrdCast( void )

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

FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* from xBadIPv4Loopback() */

FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* From prvAllowIPPacketIPv4() */

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

FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* from xBadIPv4Loopback() */

FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* From prvAllowIPPacketIPv4() */

eResult = prvAllowIPPacketIPv4( pxIPPacket, pxNetworkBuffer, uxHeaderLength );
Expand Down Expand Up @@ -573,7 +571,7 @@ void test_prvAllowIPPacketIPv4_SrcIPAddrIsMulticast( void )

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

FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* from xBadIPv4Loopback() */

FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* From prvAllowIPPacketIPv4() */

eResult = prvAllowIPPacketIPv4( pxIPPacket, pxNetworkBuffer, uxHeaderLength );
Expand Down Expand Up @@ -615,7 +613,7 @@ void test_prvAllowIPPacketIPv4_IncorrectChecksum( void )

pxIPHeader->ulSourceIPAddress = 0xC0C00101;

FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* from xBadIPv4Loopback() */

FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* From prvAllowIPPacketIPv4() */

FreeRTOS_FindEndPointOnMAC_ExpectAnyArgsAndReturn( NULL );
Expand Down Expand Up @@ -661,7 +659,7 @@ void test_prvAllowIPPacketIPv4_IncorrectProtocolChecksum( void )

pxIPHeader->ulSourceIPAddress = 0xC0C00101;

FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* from xBadIPv4Loopback() */

FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* From prvAllowIPPacketIPv4() */

FreeRTOS_FindEndPointOnMAC_ExpectAnyArgsAndReturn( NULL );
Expand Down Expand Up @@ -708,7 +706,7 @@ void test_prvAllowIPPacketIPv4_HappyPath( void )

pxIPHeader->ulSourceIPAddress = 0xC0C00101;

FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* from xBadIPv4Loopback() */

FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* From prvAllowIPPacketIPv4() */

FreeRTOS_FindEndPointOnMAC_ExpectAnyArgsAndReturn( NULL );
Expand Down Expand Up @@ -753,7 +751,7 @@ void test_prvAllowIPPacketIPv4_LoopbackHappyPath( void )

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

FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* from xBadIPv4Loopback() */

FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* From prvAllowIPPacketIPv4() */

FreeRTOS_FindEndPointOnMAC_ExpectAnyArgsAndReturn( pxEndpoint );
Expand Down Expand Up @@ -797,7 +795,7 @@ void test_prvAllowIPPacketIPv4_DestMacBroadcastIPNotBroadcast( void )

pxIPHeader->ulSourceIPAddress = 0xC0C00101;

FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* from xBadIPv4Loopback() */

FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* From prvAllowIPPacketIPv4() */

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

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

FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( pxEndpoint );

if( eExpected != eReleaseBuffer )
{
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( pxEndpoint );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,6 @@ void test_prvAllowIPPacketIPv4_BroadcastSourceIP( void )

pxIPHeader->ulSourceIPAddress = 0xFFFFFFFF;

FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* from xBadIPv4Loopback() */
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* From prvAllowIPPacketIPv4() */

eResult = prvAllowIPPacketIPv4( pxIPPacket, pxNetworkBuffer, uxHeaderLength );
Expand Down Expand Up @@ -149,7 +148,7 @@ void test_prvAllowIPPacketIPv4_BufferLengthLessThanMinimum( void )

pxIPHeader->ulSourceIPAddress = 0xC0C00101;

FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* from xBadIPv4Loopback() */

FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* From prvAllowIPPacketIPv4() */

eResult = prvAllowIPPacketIPv4( pxIPPacket, pxNetworkBuffer, uxHeaderLength );
Expand Down Expand Up @@ -196,7 +195,7 @@ void test_prvAllowIPPacketIPv4_UDPCheckSumZero( void )

pxIPHeader->ulSourceIPAddress = 0xC0C00101;

FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* from xBadIPv4Loopback() */

FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* From prvAllowIPPacketIPv4() */

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

FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* from xBadIPv4Loopback() */

FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* From prvAllowIPPacketIPv4() */

eResult = prvAllowIPPacketIPv4( pxIPPacket, pxNetworkBuffer, uxHeaderLength );
Expand Down Expand Up @@ -296,7 +295,7 @@ void test_prvAllowIPPacketIPv4_TCP_HappyPath( void )

pxIPHeader->ulSourceIPAddress = 0xC0C00101;

FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* from xBadIPv4Loopback() */

FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL ); /* From prvAllowIPPacketIPv4() */

eResult = prvAllowIPPacketIPv4( pxIPPacket, pxNetworkBuffer, uxHeaderLength );
Expand Down

0 comments on commit 4471af6

Please sign in to comment.