Fix Out-of-Bounds Read issue in modbus_reply #839
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Fixes #837
The root cause of the stack-buffer-overflow is that
modbus_reply()unconditionally reads two bytes after the function code to compute theaddressvariable. However, for some function codes (likeMODBUS_FC_REPORT_SLAVE_IDorMODBUS_FC_READ_EXCEPTION_STATUS) or malformed short packets, these bytes may not exist in the request buffer, leading to an out-of-bounds read.To fix this, we must ensure that the request buffer contains enough data before attempting to read the address. Since most Modbus functions require an address, we will initialize
addressto 0 and only perform the 16-bit decoding if thereq_lengthis sufficient. Additionally, we should add a check for function codes that require an address but were sent in a packet too short to contain one. This prevents the logic from proceeding with a default address of 0 when the packet is truncated.Verification Before Fix
Running the PoC triggers AddressSanitizer error:
Verification After Fix
Running the PoC: