Skip to content

Commit 25e1f9c

Browse files
authored
Add validation for SomeIpSdOption to prevent Heap-buffer-overflow (#2215)
1 parent d1f74b1 commit 25e1f9c

3 files changed

Lines changed: 53 additions & 8 deletions

File tree

‎Packet++/header/SomeIpSdLayer.h‎

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,13 @@ namespace pcpp
155155
/// @return SomeIpSdProtocolType
156156
SomeIpSdProtocolType getProtocol() const;
157157

158+
/// Checks whether data is valid or not
159+
/// @return True if data is valid
160+
static bool isDataValid(const IDataContainer* data, size_t dataLen)
161+
{
162+
return data && dataLen >= sizeof(someipsdhdroptionsipv4);
163+
}
164+
158165
private:
159166
/// @struct someipsdhdroptionsipv4
160167
/// Represents the IPv4 option types for the SOME/IP-SD header
@@ -217,6 +224,13 @@ namespace pcpp
217224
/// @return SomeIpSdProtocolType
218225
SomeIpSdProtocolType getProtocol() const;
219226

227+
/// Checks whether data is valid or not
228+
/// @return True if data is valid
229+
static bool isDataValid(const IDataContainer* data, size_t dataLen)
230+
{
231+
return data && dataLen >= sizeof(someipsdhdroptionsipv6);
232+
}
233+
220234
private:
221235
/// @struct someipsdhdroptionsipv6
222236
/// Represents the IPv6 option types for the SOME/IP-SD header
@@ -256,6 +270,13 @@ namespace pcpp
256270
/// Get the configuration string
257271
/// @return std::string
258272
std::string getConfigurationString() const;
273+
274+
/// Checks whether data is valid or not
275+
/// @return True if data is valid
276+
static bool isDataValid(const IDataContainer* data, size_t dataLen)
277+
{
278+
return data && dataLen >= (sizeof(someipsdhdroptionsbase) - 1);
279+
}
259280
};
260281

261282
/// @class SomeIpSdLoadBalancingOption
@@ -283,6 +304,13 @@ namespace pcpp
283304
/// @return uint16_t
284305
uint16_t getWeight() const;
285306

307+
/// Checks whether data is valid or not
308+
/// @return True if data is valid
309+
static bool isDataValid(const IDataContainer* data, size_t dataLen)
310+
{
311+
return data && dataLen >= sizeof(someipsdhdroptionsload);
312+
}
313+
286314
private:
287315
/// @struct someipsdhdroptionsload
288316
/// Represents the Load Balancing option header for SOME/IP-SD
@@ -621,7 +649,7 @@ namespace pcpp
621649
uint32_t findOption(const SomeIpSdOption& option);
622650
void addOption(const SomeIpSdOption& option);
623651
bool addOptionIndex(uint32_t indexEntry, uint32_t indexOffset);
624-
OptionPtr parseOption(SomeIpSdOption::OptionType type, size_t offset) const;
652+
OptionPtr parseOption(SomeIpSdOption::OptionType type, size_t offset, size_t remainingLength) const;
625653

626654
static size_t getLenEntries(const uint8_t* data);
627655
size_t getLenEntries() const;

‎Packet++/src/SomeIpSdLayer.cpp‎

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -517,7 +517,7 @@ namespace pcpp
517517
SomeIpSdOption::someipsdhdroptionsbase* hdr = (SomeIpSdOption::someipsdhdroptionsbase*)(m_Data + offset);
518518
SomeIpSdOption::OptionType optionType = static_cast<SomeIpSdOption::OptionType>(hdr->type);
519519

520-
option = parseOption(optionType, offset);
520+
option = parseOption(optionType, offset, remainingLen);
521521

522522
if (option != nullptr)
523523
{
@@ -562,7 +562,7 @@ namespace pcpp
562562
{
563563
SomeIpSdOption::OptionType optionType = static_cast<SomeIpSdOption::OptionType>(hdrOption->type);
564564

565-
option = parseOption(optionType, offset);
565+
option = parseOption(optionType, offset, remainingLen);
566566

567567
if (option != nullptr)
568568
{
@@ -754,29 +754,46 @@ namespace pcpp
754754
return false;
755755
}
756756

757-
SomeIpSdLayer::OptionPtr SomeIpSdLayer::parseOption(SomeIpSdOption::OptionType type, size_t offset) const
757+
SomeIpSdLayer::OptionPtr SomeIpSdLayer::parseOption(SomeIpSdOption::OptionType type, size_t offset,
758+
size_t remainingLength) const
758759
{
759760
switch (type)
760761
{
761762
case SomeIpSdOption::OptionType::IPv4Endpoint:
762763
case SomeIpSdOption::OptionType::IPv4Multicast:
763764
case SomeIpSdOption::OptionType::IPv4SdEndpoint:
764765
{
765-
return new SomeIpSdIPv4Option(this, offset);
766+
if (SomeIpSdIPv4Option::isDataValid(this, remainingLength))
767+
{
768+
return new SomeIpSdIPv4Option(this, offset);
769+
}
770+
return nullptr;
766771
}
767772
case SomeIpSdOption::OptionType::IPv6Endpoint:
768773
case SomeIpSdOption::OptionType::IPv6Multicast:
769774
case SomeIpSdOption::OptionType::IPv6SdEndpoint:
770775
{
771-
return new SomeIpSdIPv6Option(this, offset);
776+
if (SomeIpSdIPv6Option::isDataValid(this, remainingLength))
777+
{
778+
return new SomeIpSdIPv6Option(this, offset);
779+
}
780+
return nullptr;
772781
}
773782
case SomeIpSdOption::OptionType::ConfigurationString:
774783
{
775-
return new SomeIpSdConfigurationOption(this, offset);
784+
if (SomeIpSdConfigurationOption::isDataValid(this, remainingLength))
785+
{
786+
return new SomeIpSdConfigurationOption(this, offset);
787+
}
788+
return nullptr;
776789
}
777790
case SomeIpSdOption::OptionType::LoadBalancing:
778791
{
779-
return new SomeIpSdLoadBalancingOption(this, offset);
792+
if (SomeIpSdLoadBalancingOption::isDataValid(this, remainingLength))
793+
{
794+
return new SomeIpSdLoadBalancingOption(this, offset);
795+
}
796+
return nullptr;
780797
}
781798
default:
782799
break;
Binary file not shown.

0 commit comments

Comments
 (0)