Document unsafe packet dump reads found during audit

This commit is contained in:
evgeny committed 2026-10-25 22:32:22 +01:00
1 parent e035f53ab6
commit 9fb939ff24
3 files changed
+24 -7

No files matched your search

+14
View File
@@ -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 квитанциях
+3 -1
View File
@@ -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
+7 -6
View File
@@ -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)