Document unsafe packet dump reads found during audit
This commit is contained in:
1 parent
e035f53ab6
commit
9fb939ff24
3 files changed
+24
-7
No files matched your search
@@ -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 квитанциях
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in new issue
Block a user