feat(checker): детектирование эмулятора и изоляции песочницы#75
Merged
Conversation
Приложение определяет, что запущено в эмуляторе или изолированном/ клонированном контексте (вторичный пользователь, рабочий профиль, 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.
|
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.




Что и зачем
Приложение теперь определяет, что запущено в эмуляторе или в изолированном/клонированном контексте (вторичный пользователь Android, рабочий профиль, dual-app/клон-приложение), и поднимает вердикт
NEEDS_REVIEW.Мотивация: сетевые детекторы видят только текущий контекст приложения. VPN, скрытый в другом пользователе/профиле, для них невидим без root. Поэтому сам факт запуска в изолированной или эмулированной среде — повод для ручного ревью, а не для автоматического
DETECTED.Что изменено
native_signs_probe.cppnativeDetectEmulator(QEMU-свойства, goldfish/ranchu, pipe-устройства Genymotion, TTY-драйвер, артефакты BlueStacks) + хелперfileContains, регистрация вkMethodsNativeSignsBridge.ktdetectEmulator()+ тест-override + external-объявлениеNativeInterfaceProbe.ktNativeEmulatorFinding+parseEmulatorFindings+collectEmulatorFindingsNativeSignsChecker.ktevaluateEmulator(native-маркеры HIGH, Build-эвристика MEDIUM),evaluateIsolation(вторичный пользователь / клон / рабочий профиль), вшито вcheck()CheckResult.ktEvidenceSource:NATIVE_EMULATOR,SANDBOX_ISOLATIONVerdictEngine.ktNATIVE_REVIEW_SOURCES(путь R6)values{,-ru,-fa,-zh-rCN}/strings.xmlVerdictEngineTestКонтракт безопасности
Эмуляция/клонирование — это подозрение, не доказательство. Поэтому:
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, покрытие тестами) выявила и зафиксировала два дефекта:
MANUFACTURER == "unknown"— убрана: некоторые легитимные AOSP/бюджетные устройства репортятunknownи получали бы беспричинныйNEEDS_REVIEW. Оставлен только конкретный вендорGenymotion.userIdуже выводится из того же пути тем же regex черезextractUserId, фоллбэк недостижим. ПараметрdataDirPathубран из сигнатуры.Проверка
→ BUILD SUCCESSFUL. Все JVM-тесты зелёные, native-либы собраны для
arm64-v8a/armeabi-v7a/x86_64с зарегистрированнымnativeDetectEmulator, безMissingTranslation.Заметки для ревьюера
nativeDetectEmulator) исполняется только на устройстве/в инструментальных тестах; offline JVM-тесты используют bridge-override, поэтому покрытие через unit-тесты косвенное (через парсер и эвалуатор)..gitignoreигнорирует*.md, обновление матрицы детекторов в README — на усмотрение мейнтейнера.