Commit Graph

6 Commits

Author SHA1 Message Date
zuevav fdf0ddd498 Первичная настройка, часть 1: префикс торгового счёта DEPO — настройка с подсказкой по учёту (был зашит «ВТНКЦ» в 7 запросах); шаг 8 — адрес ИШ вместо ONYX, профили prod-gost/prod-rsa (пункт prod уводил bj в имитацию), без неиспользуемого контейнера, перезапуск bj после смены контура; реквизиты НРД на шаге 4; точная проверка процедур bj2depo и таблиц Fancy M2M; QUIK — объекты M2M и справочник получателей, без зашитого IP; сертификаты из справочника ИШ (FindCertificates — заглушка), уведомления о сроке за 30/14/7/3/1 день; тексты мастера, нумерация, режим разработки; уникальные id оповещений с русскими заголовками
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
2026-10-05 16:04:43 +03:00
zuevav e16d4454ce Безопасность: код установки ретранслятора (M1), zip-slip 7z (M3), L1/L5/L2
Продолжение исправлений по security-аудиту.

M1 (MEDIUM) — установщик PHP-ретранслятора был открыт без входа: до создания
админа атакующий из интернета мог завести админа кабинета или подменить адрес
ядра/ключ. Добавлен «код установки»: генерируется в файл install.lock рядом с
данными (вне веб-корня), прочитать его можно только с доступом к файловой
системе (FTP/файловый менеджер) — то есть владельцу сервера. Шаги connect и
admin (включая «пропустить») требуют верный код. Регексп loopback заякорен
(`http://127.0.0.1.attacker.com` больше не проходит как loopback). Код удаляется
по завершении установки. Проверено встроенным php-сервером.

M3 (MEDIUM) — распаковка 7z в мастере ключа (ExtractISO) сохраняла пути из
архива → запись «../…» вышла бы за каталог. Перед распаковкой архив
просматривается (7z l -slt, без записи); при абсолютном пути или выходе за
корень распаковка отклоняется. Тест TestUnsafeArchivePath.

L1 — target_device не проверялся перед root mount: значение не из списка
съёмных теперь отклоняется (иначе root смонтировал бы произвольный девайс).
L5 — likeEscape в ручном поиске DEPO (manualDepoSearch): метасимволы LIKE от
пользователя больше не «расползаются» по базе.
L2a — кука сессии ядра получает Secure и за TLS-терминирующим прокси на loopback
(reqIsHTTPS учитывает X-Forwarded-Proto только от loopback).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 21:35:38 +03:00
zuevav 7ce4c2c79f Защита рецептов: SQL DEPO/SPECTRE/QUIK вынесен в пакет fsql под garble
Реализация варианта B из аудита защиты знаний. Прямой garble всего bj-server
ломает html/template (он обращается к полям структур по имени, garble их
переименовывает). Решение — селективная обфускация: GOGARBLE обфусцирует ТОЛЬКО
пакет с секретами, шаблоны и обработчики не затрагиваются.

95 SQL-запросов к DEPO/SPECTRE/QUIK и трансферным таблицам FTV_M2M вынесены из
lkgateway в отдельный пакет internal/lkgateway/fsql как переменные (именно var,
не const: const компилятор вставил бы обратно в необфусцируемый пакет, и
шифрование бы не сработало — проверено). Сами обработчики, типы и параметры
sql.Named остались на месте; пакет держит только строки запросов.

build-release.sh собирает bj-server с `GOGARBLE=.../fsql garble -literals`
(нужен отдельный SDK go1.26 — модуль-кэшный тулчейн garble не подходит); если
garble/go1.26 не найдены — обычная сборка с предупреждением.

Проверено на реальном garble-бинаре (запускается, /admin и страницы на
структурах работают): рецепт чтения чужих систем из бинаря исчез —
OD_RESTS 13→0, OD_WIRING 5→0, OD_TURNS 1→0, OD_BALANCES 3→0, D_B_CONTRACTS 1→0,
OD_CLIENTS_PORTS 10→0, DepoLimits/MoneyLimits →0. Остаток FTV_M2M — упоминания
имён таблиц в операторских embed-шаблонах и логах, не сам рецепт.

Стенд собран обычной сборкой (без garble) — трассировки остаются читаемыми.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 20:29:47 +03:00
zuevav d2024b44ca Ручной ввод: без обязательных галок, удаление черновика, запрет количества больше остатка; отказ НРД по поручению — красным
- ручных отметок перед отправкой нет: автор виден по учётной записи, клиент/счёт/остаток/
  бумага проверены сверкой с DEPO при сохранении; блокировка в QUIK — необязательно,
  по умолчанию не требуется (модуль неторговых поручений сейчас не используется)
- «Удалить черновик» в карточке (POST /admin/manual/{id}/delete), только для черновиков
- количество не больше остатка на торговом разделе: проверка в форме (по выбранной бумаге)
  и на сервере при сохранении (по счёту DEPO) — поручение с превышением не сохраняется
- отчёт MS010 с отказом: orderResponse.Rejected, OutgoingDeal.Rejected; шаг «Операция
  завершена отказом» и бейдж — красные в карточках исходящего и входящего; онлайн-статус
  «поручение 16 завершено отказом НРД»

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 14:39:24 +03:00
zuevav 634244ee28 DEPO: версионная карточка лица — счета по SELF_ID (поиск в ручном вводе и сверка)
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 19:59:08 +03:00
zuevav 1d0f904010 Своя организация в настройках (справочник НРД или вручную) вместо зашитого ИНН; ручной ввод: поиск клиента и бумаг в DEPO, одна бумага на поручение
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 19:51:04 +03:00