From d681d5abf05e1b78ef81b78791967ca2fcd4c04d Mon Sep 17 00:00:00 2001 From: evgeny Date: Mon, 26 Oct 2026 00:56:07 +0100 Subject: [PATCH] Record parser boundary, rollback and sanitizer audit evidence --- doc/config_parser_audit_findings.txt | 53 ++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 doc/config_parser_audit_findings.txt diff --git a/doc/config_parser_audit_findings.txt b/doc/config_parser_audit_findings.txt new file mode 100644 index 00000000..d46069f1 --- /dev/null +++ b/doc/config_parser_audit_findings.txt @@ -0,0 +1,53 @@ +Аудит config_parser — 26.10.2026 + +Полностью прочитаны config_parser.c/.h, config_parser_doc.md и общий config_ini.h. +Для согласования строгого разбора также повторно сверены config_updater.c/.h/_doc.md. +Разбор сохраняет модель и владение free_config; запуск ресурсов остаётся у instance. + +Исправления +- IPv6 /32 больше не подменяется /128; префиксы проверяются до сужения к uint8_t. + Control allow=/0 задаёт нулевую маску без сдвига на 32; IPv6 control allow отклоняется. +- Ошибки известных обработчиков и выделения памяти отклоняют всю модель. + Все частичные списки освобождаются, включая client links и не завершённую секцию. +- Числа проверяются целиком до преобразования: знаки, хвост, диапазон и overflow. + Keepalive interval помещается в uint16_t; таймеры ограничены до умножения. + Bool унифицирован: 0/1, no/yes, false/true. Версия — ровно три десятичных октета. +- Адресные порты проверяются как decimal 0..65535, SOCKS — 1..65535. + Control ip/port даёт одинаковый результат в обоих порядках; ошибки getaddrinfo не теряются. +- Storage sizes проверяют UINT64_MAX, множитель M/G и полный хвост; -1 не становится безлимитом, + переполнение не становится нулевым лимитом. Слишком длинные строковые настройки отклоняются. +- Network ID ограничен 56 битами; требуются оба 32-byte HEX ключа. + Предоставленные ключи идентичности/пиров проверяются целиком; пустые необязательные остаются незаданными. +- CFG_CLIENT_LINK сохраняет имя local_srv. Повторный обычный addr сбрасывает режим dynamic IPv6. +- Флаг tcp_proxy_client enabled=no не включается снова следующей опцией той же секции. + Наличие service-секции задаёт её default enable и при отсутствии опций. +- Print_config не печатает private/signing keys; Networks выведены за пределы firewall-цикла. + Устаревший append ключей проверяет вход, запись и fclose; не объявляется атомарным updater. +- Updater выбирает итоговую идентичность/REALITY по последнему вхождению, но исправляет также + синтаксически плохие ранние дубли выбранными значениями. Из-за такого дубля ключи не генерируются заново. + Это нужно, поскольку строгий парсер проверяет каждое вхождение. Булевы REALITY enabled согласованы. + +Контракты и ограничения +Обновлены заголовок и документ: порядок списков, необъединяемые named-секции, remote-only links, +синхронный DNS и первый getaddrinfo-адрес, Windows socket init, default-значения и границы, +повторные опции, поведение неизвестных секций/debug/gui и независимость parser/updater/start. +Bootstrap invite printer использует конфигурационные адреса и нулевые channel_id/join_key; +это не снимок фактических bind/NAT-адресов и не invite конкретного канала. +Нативные сборки/runtime Windows и FreeBSD в этом этапе не выполнялись. + +Проверки +- Профиль 6/6 PASS: config_parser, config_updater, config_debug, reality_config, ncd_config, services. +- Test_config_parser: 53 ошибочных конфигурации отвергнуты одинаково из файла/буфера; + 10 отказов аллокаций с полным rollback, IPv4/IPv6 CIDR и control order, предельные размеры/порты, + скрытие секретов и /dev/full при append; баланс памяти сохранён. +- ASAN/UBSan/LSan: те же 6/6 PASS с detect_leaks=1/ halt_on_error=1. + Все встроенные lib/src/Opus инструментированы согласованно в отдельной копии + /tmp/utun-config-instance-asan-20261026; рабочие объекты не смешивались с sanitizer-объектами. + Первый updater sanitizer-прогон обнаружил обход test mock через glibc __fread_chk; + checked wrapper добавлен, повторный прогон всех файловых и allocation faults PASS. +- Логи: /tmp/config-parser-audit-contract.log, /tmp/config-parser-audit-updater.log, + /tmp/config-parser-audit-debug.log, /tmp/config-parser-audit-reality.log, + /tmp/config-parser-audit-ncd.log, /tmp/config-parser-audit-services.log. + Санитайзеры: соответствующие /tmp/config-parser-audit-asan-*.log, + сборка /tmp/config-parser-audit-asan-build.log и /tmp/config-parser-audit-asan-tests-build.log. + Общая сборка: /tmp/config-instance-audit-full-build.log.