Repository navigation
v2.1.0-security — аудит безопасности A+B+C+D
Безопасность
Закрыто 22 из 27 findings аудита: 5 Critical, 4 High, 7 Medium, 6 Low. Остались 2 в w2a (C-5 V2 signer, M-5 keystore pw).
Закрыто
A — Shizuku, auth, install
- Shizuku удалён → «без ПК / без root» теперь правда
- Fail-closed auth (без
MTAPI_TOKENсервер не стартует) - Constant-time token compare (
crypto/subtle) /restartтребует Bearer tokenbridge.Reset()— typed error вместо nil (не роняет сервер)- Токен не логируется в logcat
- Install APK через
Intent.ACTION_VIEW+ FileProvider (без Shizuku)
B — path traversal, logcat, SMS, timeouts
filesSave,cameraPhoto,microphoneRecord— canonical path check- Per-method bridge timeouts (camera 35s, mic 65s, ping 35s, default 5s)
- Убраны утечки clipboard/sensor/location в logcat
- SMS: rate-limit 30s, лимит 1000 символов, E.164-ish
C — location leak, WebView, SSRF, sensors
locationWatchStart/Stop—removeUpdates+Looper.quitSafely()(нет thread leak, нет battery drain)setWebContentsDebuggingEnabledтолько вBuildConfig.DEBUGnetFetch— SSRF-блоклист (RFC1918 + localhost)sensorStreamStop— нормализация ключа черезSensor.getStringType()saveFileToDownloads— sanitize + canonical check
D — Low/Medium
MIXED_CONTENT_NEVER_ALLOW- TTS кэширован (было: новый
TextToSpeechна каждый вызов) notifyid черезAtomicInteger(было: коллизии каждые 65с)bad JSONлогирует только длину (было: полный payload)wifiInfo→<hidden>вместо<unknown ssid>torch— понятное сообщение про отсутствие flash- Dead code (
_atoi32, неиспользуемые импорты) убран
Тесты
go build— PASSgo vet— PASSgo test ./...— PASS- JS tests — PASS
gofmt— чисто
Открыто
- C-5 (w2a): свой V2 APK signer — код написан, но не вызывается. Сейчас используется
apksignerиз Android SDK. - M-5 (w2a): keystore password виден в
psприapksigner. Закроется после C-5.
Установка
APK к релизу не приложен. Сборка через w2a требует Android SDK build-tools. См. README.
Лицензия
MIT — see LICENSE.