Skip to content

feat(checker): детектирование эмулятора и изоляции песочницы#75

Merged
xtclovver merged 1 commit into
mainfrom
claude/nostalgic-newton-73e89d
Jun 11, 2026
Merged

feat(checker): детектирование эмулятора и изоляции песочницы#75
xtclovver merged 1 commit into
mainfrom
claude/nostalgic-newton-73e89d

Conversation

@xtclovver

Copy link
Copy Markdown
Owner

Что и зачем

Приложение теперь определяет, что запущено в эмуляторе или в изолированном/клонированном контексте (вторичный пользователь Android, рабочий профиль, dual-app/клон-приложение), и поднимает вердикт NEEDS_REVIEW.

Мотивация: сетевые детекторы видят только текущий контекст приложения. VPN, скрытый в другом пользователе/профиле, для них невидим без root. Поэтому сам факт запуска в изолированной или эмулированной среде — повод для ручного ревью, а не для автоматического DETECTED.

Что изменено

Слой Файл Изменение
Native C++ native_signs_probe.cpp JNI-проба nativeDetectEmulator (QEMU-свойства, goldfish/ranchu, pipe-устройства Genymotion, TTY-драйвер, артефакты BlueStacks) + хелпер fileContains, регистрация в kMethods
Bridge NativeSignsBridge.kt detectEmulator() + тест-override + external-объявление
Probe NativeInterfaceProbe.kt NativeEmulatorFinding + parseEmulatorFindings + collectEmulatorFindings
Checker NativeSignsChecker.kt evaluateEmulator (native-маркеры HIGH, Build-эвристика MEDIUM), evaluateIsolation (вторичный пользователь / клон / рабочий профиль), вшито в check()
Model CheckResult.kt EvidenceSource: NATIVE_EMULATOR, SANDBOX_ISOLATION
Verdict VerdictEngine.kt оба источника добавлены в NATIVE_REVIEW_SOURCES (путь R6)
i18n values{,-ru,-fa,-zh-rCN}/strings.xml 5 новых строк × 4 локали
Тесты 3 новых файла + 2 кейса в VerdictEngineTest парсер, оба эвалуатора, R6-вердикт

Контракт безопасности

Эмуляция/клонирование — это подозрение, не доказательство. Поэтому:

  • блоки никогда не ставят CategoryResult.detected = true, только needsReview;
  • NATIVE_EMULATOR / SANDBOX_ISOLATION заведены только в NATIVE_REVIEW_SOURCES (R6), не входят в HARD_DETECT_BYPASS (R1) и не в матрицу R5;
  • максимальный вклад в вердикт — NEEDS_REVIEW, DETECTED недостижим.

Это подтверждено отдельным тест-кейсом и адверсариальной проверкой.

Контроль качества

Адверсариальная мульти-агентная проверка по 5 измерениям (потолок вердикта, C++ memory-safety, логика Kotlin, полнота i18n, покрытие тестами) выявила и зафиксировала два дефекта:

  1. Ложноположительная эвристика MANUFACTURER == "unknown" — убрана: некоторые легитимные AOSP/бюджетные устройства репортят unknown и получали бы беспричинный NEEDS_REVIEW. Оставлен только конкретный вендор Genymotion.
  2. Мёртвый код в clone-детекции — удалён path-фоллбэк: userId уже выводится из того же пути тем же regex через extractUserId, фоллбэк недостижим. Параметр dataDirPath убран из сигнатуры.

Проверка

./gradlew :app:testDebugUnitTest :app:lintDebug :app:assembleDebug

BUILD SUCCESSFUL. Все JVM-тесты зелёные, native-либы собраны для arm64-v8a / armeabi-v7a / x86_64 с зарегистрированным nativeDetectEmulator, без MissingTranslation.

Заметки для ревьюера

  • Native-код (nativeDetectEmulator) исполняется только на устройстве/в инструментальных тестах; offline JVM-тесты используют bridge-override, поэтому покрытие через unit-тесты косвенное (через парсер и эвалуатор).
  • README не трогался: .gitignore игнорирует *.md, обновление матрицы детекторов в README — на усмотрение мейнтейнера.

Приложение определяет, что запущено в эмуляторе или изолированном/
клонированном контексте (вторичный пользователь, рабочий профиль,
dual-app), и поднимает NEEDS_REVIEW. Сетевые детекторы слепы к VPN,
скрытому в другом контексте, поэтому собственная изолированная/
эмулированная среда сама по себе является поводом для ревью.

Что добавлено:
- Native JNI-проба nativeDetectEmulator (QEMU/goldfish/Genymotion/
  BlueStacks) в native_signs_probe.cpp + регистрация в kMethods.
- Bridge NativeSignsBridge.detectEmulator с тест-override.
- Парсер NativeEmulatorFinding в NativeInterfaceProbe.
- Блоки evaluateEmulator (native HIGH + Build-эвристика MEDIUM) и
  evaluateIsolation (вторичный пользователь / клон / рабочий профиль)
  в NativeSignsChecker, вшитые в check().
- Источники NATIVE_EMULATOR и SANDBOX_ISOLATION в EvidenceSource,
  заведены только в NATIVE_REVIEW_SOURCES VerdictEngine (R6): вклад
  строго NEEDS_REVIEW, никогда DETECTED.
- Локализация 5 строк (en/ru/fa/zh-rCN).
- Тесты: парсер, оба эвалуатора, два кейса R6 в VerdictEngineTest.

Контроль качества (адверсариальная проверка): убрана ложноположительная
эвристика MANUFACTURER=="unknown" (легитимные AOSP/бюджетные устройства),
удалён мёртвый path-фоллбэк в clone-детекции (userId уже выводится из
того же пути тем же regex через extractUserId).

Проверено: ./gradlew :app:testDebugUnitTest :app:lintDebug
:app:assembleDebug — BUILD SUCCESSFUL, native-либы для arm64-v8a/
armeabi-v7a/x86_64, без MissingTranslation.
@sonarqubecloud

Copy link
Copy Markdown

@xtclovver xtclovver self-assigned this Jun 11, 2026
@xtclovver xtclovver added the enhancement New feature or request label Jun 11, 2026

@xtclovver xtclovver left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@xtclovver xtclovver merged commit 3e1a9cf into main Jun 11, 2026
3 checks passed
xtclovver added a commit that referenced this pull request Jun 11, 2026
Подготовка релиза v2.9.0 (versionCode 20900).

- Добавлены fastlane changelog 20900.txt для en-US/ru-RU/fa/zh-CN,
  охватывающие коммиты #73/#74/#75 (6 детекторов VPN/прокси,
  детектор эмулятора/изоляции, профили маркетплейса, Ed25519-подпись
  каталога, фиксы).
- README (все 4 локали) синхронизированы с новыми детекторами:
  дерево архитектуры, паттерны интерфейсов (4.2), BypassChecker
  (Clash API + SOCKS5-auth, 6.4), NativeSignsChecker (TUN/TAP по типу,
  host-route /32, эмулятор, изоляция, 12.1-12.4), тип VPN-транспорта (3.1).
- build.gradle.kts: versionCode 20802 -> 20900, versionName 2.8.2 -> 2.9.0.
@w3struk

w3struk commented Jun 12, 2026

Copy link
Copy Markdown
Screenshot_2026-06-12-12-09-53-258_com notcvnt rknhardering False positive

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants