Record parser boundary, rollback and sanitizer audit evidence

This commit is contained in:
evgeny committed 2026-10-26 09:08:24 +01:00
1 parent 7ea1fa9954
commit d681d5abf0
1 file changed
+53
+53
View File
@@ -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.