Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/static-analysis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ name: Статический анализ

# Два независимых анализатора: встроенный в MSVC /analyze и CodeQL.
# /analyze запускается с /WX, поэтому любая новая находка в коде CHEBURNET
# останавливает задание. Подавлено ровно одно предупреждение — дефект
# SAL-аннотации в заголовке Windows SDK, обоснование в CMakeLists.txt.
# останавливает задание. Исключения для дефектов заголовков Windows SDK
# обоснованы в CMakeLists.txt и у подключения ws2tcpip.h в Diagnostics.cpp.

on:
push:
Expand Down
8 changes: 6 additions & 2 deletions .github/workflows/upstream-check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,7 @@ jobs:
}
"validation=$validation" | Out-File -FilePath $env:GITHUB_OUTPUT -Append -Encoding utf8
"detail=$detail" | Out-File -FilePath $env:GITHUB_OUTPUT -Append -Encoding utf8
git diff --stat -- resources | Out-File -FilePath upstream\payload-diff.txt -Encoding utf8
git status --porcelain -- resources | Out-File -FilePath upstream\payload-status.txt -Encoding utf8
scripts\write-upstream-diff.ps1 -Root $PWD -OutDir upstream
scripts\upstream-report.ps1 -ImportedRoot $PWD -Validation $validation `
-ValidationDetail $detail `
-RunUrl '${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}' `
Expand All @@ -103,6 +102,11 @@ jobs:
issues: write
steps:
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: upstream-detect
path: upstream
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
continue-on-error: true
with:
name: upstream-candidate
path: upstream
Expand Down
23 changes: 23 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,28 @@
# История изменений

## Не выпущено — исправления ревью 18–19 октября 2026 (МСК)

- Точный состав runtime и обязательная проверка существующих ACL; лишняя DLL
отменяет запуск. Дочерний процесс предпочитает системные DLL из System32.
- Восстановление останавливает проверенный процесс неисправной версии до фиксации
fallback. Очистка отказывается удалять версии при ошибке доверенного состояния.
- Команда --verify-install проверяет установку без UI, сети и запуска движка.
E2E использует реальные пути и схему, различает тайм-аут, отказ и успех,
возвращает ошибку при пропуске обязательного сценария.
- Исправлены upstream-отчёт, повторное подключение после завершения процесса,
показ обновлений на основных экранах и независимость пропуска движка от launcher.
- Ручная проверка обновлений выполняется в фоне; WinHTTP использует отменяемые
асинхронные операции и общий deadline без ослабления TLS.
- Экспорт проверяет активную embedded/installed среду и скрывает сокращённые IPv6.
- Добавлены регрессионные проверки файловой системы, восстановления, состояния UI,
уведомлений, диагностики, настоящего зависшего TLS-запроса и команд E2E.
- Подготовка E2E упаковывает одного кандидата для чистых Windows 10/11, проверяет
SHA-256 файлов в госте и требует четыре отчёта двух ролей токена. Исправлены
перенос файлов на подготовительный VHDX и путь лончера внутри гостя.
- Добавлен E2E без VM: отдельная сборка с фиксированным тестовым каталогом,
проверкой идентичности до изменений, снимком рабочей установки и очисткой.
Драйвер проверяется с фильтром false; чужая служба WinDivert не принимается.

## 1.0.0-rc.4 — 2026-09-11

### Исправлено
Expand Down
23 changes: 20 additions & 3 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,16 @@ include("${CMAKE_CURRENT_LIST_DIR}/cmake/Version.cmake")

project(CHEBURNET VERSION "${CHEBURNET_VERSION_PE}" LANGUAGES CXX)

# Separate build only: a fixed namespace for destructive host E2E fixtures.
# Never a runtime CLI/config/environment override of the production root.
set(CHEBURNET_E2E_INSTANCE "" CACHE STRING "Isolated host E2E instance (16 lowercase hex digits)")
if(NOT CHEBURNET_E2E_INSTANCE STREQUAL "")
string(LENGTH "${CHEBURNET_E2E_INSTANCE}" _e2e_length)
if(NOT _e2e_length EQUAL 16 OR NOT CHEBURNET_E2E_INSTANCE MATCHES "^[0-9a-f]+$")
message(FATAL_ERROR "CHEBURNET_E2E_INSTANCE must contain exactly 16 lowercase hex digits")
endif()
endif()

message(STATUS "CHEBURNET: версия ${CHEBURNET_VERSION_SEMANTIC} "
"(PE ${CHEBURNET_VERSION_PE}, канал ${CHEBURNET_RELEASE_CHANNEL})")

Expand Down Expand Up @@ -155,7 +165,10 @@ target_include_directories(cheburnet_lib PUBLIC
"${GEN_DIR}")
target_compile_definitions(cheburnet_lib PUBLIC
UNICODE _UNICODE WIN32_LEAN_AND_MEAN NOMINMAX _CRT_SECURE_NO_WARNINGS)
target_link_libraries(cheburnet_lib PUBLIC bcrypt crypt32 winhttp advapi32 shell32 ole32 user32 wintrust)
if(NOT CHEBURNET_E2E_INSTANCE STREQUAL "")
target_compile_definitions(cheburnet_lib PUBLIC CHEBURNET_E2E_INSTANCE="${CHEBURNET_E2E_INSTANCE}")
endif()
target_link_libraries(cheburnet_lib PUBLIC bcrypt crypt32 winhttp advapi32 shell32 ole32 user32 ws2_32 wintrust)

# Warnings / hardening for our own code.
set(CHEBURNET_WARN /W4 /WX /permissive- /utf-8)
Expand All @@ -176,8 +189,9 @@ if(CHEBURNET_ENABLE_ANALYZE)
# CryptStringToBinaryA в самом wincrypt.h Windows SDK 10.0.26100.0
# ("синтаксическая ошибка _Param_(1)"). Он относится к чужому заголовку,
# исправить его на нашей стороне невозможно, и он не указывает ни на какое
# свойство кода CHEBURNET. Никакие другие предупреждения анализа не
# подавляются: все находки в нашем коде разобраны и исправлены.
# свойство кода CHEBURNET. Дополнительно Diagnostics.cpp ограничивает
# C6101 только подключением ws2tcpip.h (WSAGetIPUserMtu, SDK 10.0.26100).
# Предупреждения анализа собственного кода не подавляются.
list(APPEND CHEBURNET_WARN /analyze /analyze:external- /wd28285)
message(STATUS "CHEBURNET: статический анализ MSVC включён")
endif()
Expand All @@ -193,6 +207,9 @@ add_executable(CHEBURNET
resources/cheburnet.rc
resources/generated/cheburnet_payload.rc)
set_target_properties(CHEBURNET PROPERTIES OUTPUT_NAME "CHEBURNET")
if(NOT CHEBURNET_E2E_INSTANCE STREQUAL "")
set_target_properties(CHEBURNET PROPERTIES OUTPUT_NAME "CHEBURNET-E2E")
endif()
target_link_libraries(CHEBURNET PRIVATE cheburnet_lib)
target_compile_options(CHEBURNET PRIVATE ${CHEBURNET_WARN})

Expand Down
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
[![Windows](https://img.shields.io/badge/Windows-10%20%7C%2011-00a4ef?style=for-the-badge&logo=windows11&logoColor=white)](#системные-требования)
[![Лицензия](https://img.shields.io/github/license/Jacksony100/CHEBURNET?style=for-the-badge&label=%D0%BB%D0%B8%D1%86%D0%B5%D0%BD%D0%B7%D0%B8%D1%8F&color=2ea043)](LICENSE)

[Скачать RC](https://github.com/Jacksony100/CHEBURNET/releases/tag/v1.0.0-rc.3) · [Как запустить](#быстрый-старт) · [Безопасность](SECURITY.md) · [Документация обновлений](docs/UPDATE_SECURITY.md)
[Скачать RC](https://github.com/Jacksony100/CHEBURNET/releases/tag/v1.0.0-rc.4) · [Как запустить](#быстрый-старт) · [Безопасность](SECURITY.md) · [Документация обновлений](docs/UPDATE_SECURITY.md)

</div>

Expand Down Expand Up @@ -41,7 +41,7 @@ CHEBURNET упаковывает проверенный движок из
## Быстрый старт

1. Скачайте `CHEBURNET.exe` и `CHEBURNET.exe.sha256` только со страницы
[официального релиза](https://github.com/Jacksony100/CHEBURNET/releases/tag/v1.0.0-rc.3).
[официального релиза](https://github.com/Jacksony100/CHEBURNET/releases/tag/v1.0.0-rc.4).
2. Проверьте файл в PowerShell:

```powershell
Expand Down Expand Up @@ -123,8 +123,8 @@ scripts\run-tests.ps1 -BuildDir build
scripts\package.ps1 -BuildDir build -OutDir dist -SkipBuild
```

Публичный RC проходит чистую сборку с `/W4 /WX`, **33 CTest-теста** и
**84 проверки точности** стратегии/режима. Сценарий ручной проверки описан в
Публичный RC проходит чистую сборку с `/W4 /WX`, **55 CTest-проверок** (одна требует повышенного токена) и
**88 проверок точности** стратегии/режима. Сценарий ручной проверки описан в
[docs/SMOKE_TEST.md](docs/SMOKE_TEST.md), модель доверия — в
[docs/UPDATE_SECURITY.md](docs/UPDATE_SECURITY.md).

Expand Down
67 changes: 67 additions & 0 deletions docs/REVIEW_FIXES.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
# Исправления 11 находок ревью

Дата: **18–19 октября 2026, МСК**. База: 6a371e5 (1.0.0-rc.4).
Ветка: **codex/fix-review-findings**.

| Находка | Изменение | Регрессионная проверка |
|---|---|---|
| R1 · P1 | Существующие каталоги runtime проверяются без присвоения им доверия заменой ACL. Новые каталоги создаются сразу с окончательной защитой. Полный обход состава отклоняет лишние файлы, каталоги, reparse points и hard links при извлечении, перед запуском и при принятии работающей сессии. Дочернему процессу задано предпочтение System32. | review_inventory; review_elevated |
| R2 · P1 | Исправлены пути и семь полей состояния pending. Проверяются код выхода и маркер завершения. Тайм-аут, неожиданная ошибка bootstrap и падение не считаются ожидаемым отказом. Пропущенный обязательный сценарий возвращает ошибку шлюза. | review_contracts; e2e_harness |
| R3 · P1 | Добавлена команда --verify-install. Она выполняет bootstrap, восстановление, проверку и подготовку установки без App::Run, UI, сетевой проверки или запуска движка. E2E использует эту команду и проверяет отсутствие нового winws. | review_contracts; отдельные VM-сценарии |
| R4 · P1 | Перед фиксацией fallback останавливается проверенная идентичность неисправного current; неизвестный процесс либо неуспех остановки запрещают фиксацию. Нормальное подключение затем запускает проверенный fallback. | review_recovery; review_elevated с безвредным дочерним процессом |
| R5 | Запись diff сама создаёт выходной каталог. Job задачи сначала получает отчёт detect и сохраняет его как резервный при отсутствии candidate. | review_contracts запускает настоящий write-upstream-diff.ps1 в одноразовом Git-репозитории |
| R6 | Ошибка или отсутствие доверенного состояния отменяют все удаления. Защищены current, previous, pending, embedded, версия paths и проверенного живого процесса. Возвращаются структурированные ошибки очистки. | review_cleanup; review_elevated |
| R7 | Общее обслуживание кадров сверяет покоящееся состояние с процессом. Перед подключением состояние также согласуется; переход не может затереть выполняющуюся операцию. Опрос не берёт блокировку ProcessManager, пока идёт запуск. | review_processstate |
| R8 | Ручная проверка выполняется фоновым сервисом. Асинхронный WinHTTP закрывает запрос при отмене/deadline, сохраняет контекст и буфер до последнего HANDLE_CLOSING. TLS-проверка не ослаблена. | review_httpcancel на настоящем незавершённом TLS к loopback; updatecheckservice |
| R9 | Единый read-only VerifyRuntime различает embedded и installed. Экспорт получает каталог и ожидаемые хеши фактически проверенной активной среды. | review_elevated проверяет настоящие ресурсы и summary; diagnostics |
| R10 | IPv6 валидируется InetPtonW вместо счётчика групп; поддержаны сокращение, скобки, zone ID и IPv4-mapped формы. | review_privacy; diagnostics |
| R11 | Фоновый результат обрабатывается в общем кадре, уведомление отображается в заголовке основных экранов. Пропуск payload не скрывает upgrade launcher. | review_notifications |

## Проверки

- Release-сборка x64 с **/W4 /WX**, **MSVC /analyze** и штатным усилением защиты.
- **55 проверок CTest** (включая защиту режима без VM); полный журнал сохраняется
вместе с результатом проверки на хосте от 19 октября 2026, МСК.
В первом проходе: 54 PASS и сбой обработки ожидаемого stderr в новом тесте;
исправленный тест прошёл отдельным повышенным запуском. Неустранённых ошибок нет.
- **88/88** независимых проверок соответствия стратегий BAT.
- Отдельная проверка нового транспорта через настоящий HTTPS: **HTTP 200**, 10 884 байта.
- Проверены отсутствие ошибок whitespace и корректность скриптовых контрактов.

Команды воспроизведения:

1. scripts/build-release.ps1 -BuildDir build-review-final
2. scripts/run-tests.ps1 -BuildDir build-review-final

Статический анализ включён через CHEBURNET_ENABLE_ANALYZE=ON в CMakeCache этого
каталога. Для новой сборки установите эту опцию при конфигурации.

Тест review_elevated возвращает SKIP (77) без повышенного токена. С повышением
он использует уникальный временный корень, настоящие встроенные ресурсы и копию
самого тестового EXE под именем winws для проверки остановки. Пакетный движок и
драйвер WinDivert этот тест не запускает.

Полная матрица чистых Windows 10/11 **не выполнялась**. Это остаётся требованием
стабильного выпуска. На текущей Windows 11 Pro 26200 19 октября 2026 (МСК)
выполнены 6/6 сценариев отдельной host E2E сборки и реальная загрузка WinDivert
с фильтром false. Служба и тестовый каталог удалены; содержимое и ACL исходной
установки не изменились. Подробности: docs/production/HOST_E2E.md. Отчёты E2E
обычного и повышенного токена должны собираться отдельно; all выбирает сценарии
текущей роли, а required_scenarios и token_role сохраняются в отчёте.

Переносимая [сводка доказательств](production/evidence/2026-10-19-host-e2e.json)
включает результаты обеих ролей, SHA-256 EXE, проверку драйвера и очистки,
отпечатки исходной установки, полный и повторный прогоны тестов и ограничения.

Подготовлены New-CheburnetE2EBundle.ps1, Run-InGuest.ps1 и валидатор четырёх
отчётов Test-CheburnetE2EMatrix.ps1. Исправлены копирование на VHDX и путь
к лончеру в New-CheburnetTestVm.ps1. Проверка e2e_preparation выполняет
настоящую упаковку и перенос в макет гостевого тома и отклоняет повреждённый
пакет, неполную матрицу, пропуски, дубликаты, другую сборку и Windows Server.
Отчёты привязаны к SHA-256 EXE. Подготовка VM сохранена как дополнительная
возможность. Изолированный review_elevated отдельно прошёл с
повышенным токеном, затем повторно прошёл в составе полного набора.

Подробности времени жизни асинхронного запроса соответствуют
[правилам конкурентности WinHTTP](https://learn.microsoft.com/en-us/windows/win32/winhttp/concurrency-in-winhttp)
и [последнему callback при закрытии](https://learn.microsoft.com/en-us/windows/win32/api/winhttp/nf-winhttp-winhttpclosehandle).
Loading
Loading