From a8d32bbcef1b2fa94893c030df416b2b96ee12c6 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Wed, 1 Jul 2026 12:13:27 +0300 Subject: [PATCH] fix(rx): guard sub-minimum packSize before crcCheck (B1 OOB read) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit packSize==1 давало crcCheck(1-crcBytes) → uint8 len=255 → crc8 читает dataBuffer[0..256] при массиве 38 (OOB-чтение ~217 байт). Триггер — лок преамбулы + первый байт с младшими 5 битами=1 (~1/32 ложных локов). Двойная защита: (1) ранний reject packSize 1..2 (< msg+crc) как битого; (2) конец кадра требует packSize>crcBytes, поэтому crcCheck(packSize-crcBytes) не уходит в underflow. Валидные кадры (packSize>=5) и будущие компактные (>=3) не затронуты. Co-Authored-By: Claude Opus 4.8 (1M context) --- IR_DecoderRaw.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/IR_DecoderRaw.cpp b/IR_DecoderRaw.cpp index 2671bfc..2be0582 100644 --- a/IR_DecoderRaw.cpp +++ b/IR_DecoderRaw.cpp @@ -862,6 +862,11 @@ void IR_DecoderRaw::writeToBuffer(bool bit, bool packTraceInvertFix) if (i_dataBuffer == 8 * msgBytes) { // Ппервый байт packSize = dataBuffer[0] & IR_MASK_MSG_INFO; + // B1: под-минимальная длина (1..2) физически не несёт CRC (min кадр = msg+crc = 3 байта) → шум/битьё. + // Без отсева packSize==1 даёт crcCheck(1-2) → len=255 → OOB-чтение dataBuffer[0..256] (массив 38). + // packSize>=3 (в т.ч. будущие компактные кадры) обрабатываются как обычно. + if (packSize != 0 && packSize < msgBytes + crcBytes) + isWrongPack = true; } // Тип приёма (для isReceive): выставляем сразу после первого байта, ДО проверки «Конец». @@ -872,8 +877,8 @@ void IR_DecoderRaw::writeToBuffer(bool bit, bool packTraceInvertFix) msgTypeReceive = (dataBuffer[0] >> 5) | 0b11111000; } - if (packSize && (i_dataBuffer == packSize * bitPerByte)) - { // Конец + if (packSize > crcBytes && (i_dataBuffer == packSize * bitPerByte)) + { // Конец (B1: packSize>crcBytes → crcCheck(packSize-crcBytes) не уходит в underflow/OOB) packInfo.buffer = dataBuffer; packInfo.crc = crcValue; packInfo.err = errors;