diff --git a/doc/tasks.md b/doc/tasks.md index 2b7c72452..7afd4d7ef 100644 --- a/doc/tasks.md +++ b/doc/tasks.md @@ -4,6 +4,20 @@ ## Текущие задачи +[ ] **packet_dump: ограничить чтение входного IPv4-пакета** — найдено статической сверкой 25.10.2026. + В `src/transport_layer/packet_dump.c` все три ветки hex-дампа читают 32 байта после IHL, + не учитывая остаток len. Это затрагивает также распознанные TCP/UDP/ICMP-пакеты; + ограничение snprintf относится только к выходу и не защищает входные чтения. + Вызовы: `tun_if.c` (категория tun/debug), `routing_layer/routing.c` (traffic/debug). + Документ ошибочно представлял выход за границу как допустимый компромисс для неизвестных протоколов; + это описание исправлено, предупреждение добавлено в .h. Код пока не менялся. + Предлагаемое исправление: единый ограниченный hex-цикл по доступным байтам, проверка NULL, + IHL >=20 и IPv4 total length; адреса читать побайтно без невыравненных uint32_t-приведений. + При разборе учитывать смещение IP-фрагмента, чтобы не выдавать его данные за транспортный заголовок. + Проверить короткие/усечённые пакеты и корректные TCP/UDP/ICMP/прочие протоколы под ASAN/UBSan; + затем согласовать окончательный контракт .h/документа. Runtime-воспроизведение не выполнялось. + Аудит остановлен по AGENTS.md:10; packet_dump.h и packet_dump_doc.md проверены частично. + [+] **member_files: сверить контракты и исправить ошибки владения/повторов** — завершено 24.10.2026. Прочитаны все6 реализаций и6 заголовков C-модуля. Исправлены удаление чужого temp, повторный запуск после раннего cancel с UAF, обрыв массовых мутаций при64 квитанциях diff --git a/src/transport_layer/packet_dump.h b/src/transport_layer/packet_dump.h index a3b4eb9dd..51c275489 100644 --- a/src/transport_layer/packet_dump.h +++ b/src/transport_layer/packet_dump.h @@ -1,6 +1,8 @@ /* packet_dump — текстовая сводка IPv4-пакета: адреса, транспортные поля и короткий hex-фрагмент. * Принимает IP-пакет без ETCP-заголовка. Результат в общем static-буфере перезаписывается каждым вызовом; - * его не освобождать, для хранения скопировать. Модуль не потокобезопасен и сам в лог не пишет. */ + * его не освобождать, для хранения скопировать. Модуль не потокобезопасен и сам в лог не пишет. + * Известный дефект: hex-дамп читает 32 байта после IHL без проверки остатка len; + * текущая реализация небезопасна для коротких пакетов (см. doc/tasks.md). */ #ifndef PACKET_DUMP_H #define PACKET_DUMP_H diff --git a/src/transport_layer/packet_dump_doc.md b/src/transport_layer/packet_dump_doc.md index d136340cd..ebee75d98 100644 --- a/src/transport_layer/packet_dump_doc.md +++ b/src/transport_layer/packet_dump_doc.md @@ -1,7 +1,9 @@ # Packet Dump (декодирование IP-пакетов) ## 1. Назначение -Вспомогательный модуль для диагностики: парсит сырой IPv4-пакет и формирует человекочитаемую строку с IP-адресами, протоколом, портами, флагами и hex-дампом первых 32 байт payload. Используется только в отладочных логах (категории `TUN`, `ROUTING`) для трассировки проходящих через TUN пакетов. +Вспомогательный модуль для диагностики: парсит сырой IPv4-пакет и формирует человекочитаемую строку с IP-адресами, протоколом, портами, флагами и hex-дампом 32 байт после IP-заголовка, включая транспортный заголовок. Вызывается из отладочных логов категорий `tun` и `traffic`. + +**Незавершённый аудит 25.10.2026:** hex-дамп во всех трёх ветках читает фиксированные 32 байта без проверки остатка входного пакета. Это дефект, затрагивающий также распознанные TCP/UDP/ICMP-пакеты. Ограничение длины выходного буфера не защищает входные чтения. Исправление и оставшиеся проверки описаны в `doc/tasks.md`; runtime-проверка в этом продолжении не выполнялась. ## 2. Как пользоваться @@ -43,16 +45,15 @@ IPv4 ICMP 8.8.8.8 -> 10.0.0.1 (84 bytes) echo_reply seq=1 id=1234 data: 0000552c - **UDP (17):** порты, длина - **ICMP (1):** тип/code, echo_request/echo_reply с seq и id -Для нераспознанных протоколов выводит `src_ip:0 -> dst_ip:0` и 32 байта payload (может выйти за границы пакета — диагностический код, безопасностью жертвует в пользу информативности). +Для нераспознанных протоколов выводит `src_ip:0 -> dst_ip:0` и пытается прочитать 32 байта после IP-заголовка. При коротком остатке это чтение выходит за границы входа; допустимым контрактом API такое поведение не является. -Hex-дамп: 32 байта транспортного payload (начиная с `data[ihl]`), 4 группы по 8 байт. +Hex-дамп: 32 байта начиная с `data[ihl]`, включая транспортный заголовок, 4 группы по 8 байт. Корректное ограничение фактически доступной длиной пока отсутствует. **`tcp_flags_to_str(flags)`** (static) — преобразует байт TCP-флагов в строку вида `SYN,ACK` или `none`. ### Где используется -- `tun_if.c` — логирование пакетов из/в TUN-интерфейс (категория `TUN`, уровень `DEBUG`) -- `tun_windows.c` — то же для Windows -- `routing.c` — логирование маршрутизируемых пакетов (категория `ROUTING`, уровень `DEBUG`) +- `tun_if.c` — логирование пакетов из/в TUN-интерфейс (категория `tun`, уровень `debug`, общий код платформ) +- `routing_layer/routing.c` — логирование пакетов перед передачей в локальный TUN (категория `traffic`, уровень `debug`) ### Зависимости - `platform_compat.h` — порядок байт (не используется в текущей реализации, IP-адреса читаются напрямую как LE)