Verlintas/NOIR
Security & PrivacyAudits Android phones over adb for permissions, network endpoints and manifest risks, then suggests reversible fixes.
What it does
NOIR is a desktop CLI/TUI that connects to an Android phone over adb and turns "what could this phone leak" into a reproducible report. It inventories apps holding both network and sensitive permissions, extracts URLs from APK dex files on the device, classifies vendors (Xiaomi, Google, Tencent, Amap, etc.) and domains into categories such as telemetry, ads, location or keyboards, and combines permissions with endpoints into a risk score. It also maps permission sets to data types (location, contacts, SMS, calls, microphone, camera, screen, app list, device IDs, files, calendar, accounts) and pairs them with reporting domains to show which data may flow where. Shared UIDs such as android.uid.system are merged back into each package, and AndroidManifest.xml is parsed for exported components without permission protection, cleartext traffic, backups, debuggable flags and targetSdk.
Recommendations are split into safe automatic appops actions, items needing manual review, and things to leave alone; every action gets a rollback command. An optional deep/deepscan path pulls a single APK, decompiles it with jadx, and greps for risky calls like Runtime.exec, DexClassLoader, setApplicationEnabledSetting, MediaProjection, WebView bridges, accessibility/notification listeners and device-admin usage README lines 25–35.
It targets people auditing their own device or an authorized one. It does not run in the cloud, needs no account, does not modify system partitions or require root, and only uninstalls when --aggressive or --purge is explicitly used README lines 36–43.
Quick start
Install in one of two ways:
- Download the portable package for your platform from Releases (
noir-v0.1.1-macOS-portable.zip,noir-v0.1.1-Windows-portable.zip,noir-v0.1.1-Linux-portable.zip, plusSHA256SUMS.txt). Unzip and double-clickStart NOIR.commandon macOS,Start NOIR.baton Windows, or runStart-NOIR.shon Linux afterchmod +x. The launcher bundles its own runtime, so no Java install is required. macOS may block the command file (right-click → Open, or clear quarantine), and Windows SmartScreen may prompt.adbandjadxare not bundled; the first run asks whether to download them into~/.noir/toolsREADME lines 136–169. - Build from source, which needs JDK 17+, Android platform-tools, and
jadxonly fordeep:
git clone https://github.com/Verlintas/NOIR
cd NOIR
./gradlew :cli:installDist
./cli/build/install/noir/bin/noir --about
Then connect a phone with USB debugging enabled and run:
noir doctor # shows platform, java, adb, device and jadx paths
noir # guided wizard: checks adb, waits for a device, scans, renders dashboard
The wizard asks two or three yes/no questions and finishes with a dashboard. To scan without prompts or to inspect actions first, use noir scan, noir ui, noir auto (dry-run plan), noir auto --apply (safe appops only), or noir deepscan README lines 206–233. Output lands in noir-out/ as report.json, report.md, domains.txt and rollback.txt README lines 257–266. domains.txt can be imported into Pi-hole, AdGuard or a router; NOIR does not change DNS itself.
Constraints
- Supported hosts: macOS (Intel and Apple Silicon), Windows 10/11, and Debian/Ubuntu. iOS is not supported, because the audit depends on Android
dumpsysand the APK format. - Requires JDK 17+ and Android platform-tools (
adb);jadxis needed only fordeep/deepscan. Paths can be overridden with--adb/--jadx. - Without root, everything runs through
adbshell permissions. Uninstalls are--user 0only, so the APK stays in the system partition and can return after OTA or factory reset. System apps are usually flagged for manual review rather than true removal. - Default behavior is fully read-only.
--applychanges appops, and can be reverted withdefault;rollback.txtrecords the commands. Uninstalling vianoir blockprints thepm install-existingrecovery command first. - NOIR does not make network requests itself; no telemetry, version check or crash reporting. External downloads happen only in
noir setup(adb/jadx) andjadxruns locally. Reports may contain package names and endpoints from your device, so review before sharing README lines 267–273. - Results are static evidence — an app has a capability and code contains an endpoint — and do not prove that a specific transmission occurred README lines 344–349.
- Results are cached in
~/.noir/endpoints.tsvkeyed by package name plus APK path; when an app updates and the path changes it is re-analyzed. - Licensed MIT README lines 350–352.
HotRepo's take
NOIR appeared on the HotRepo new-project list on 2026-11-02, gaining 416 stars in about 22 hours (from 113 to 529 in the sampled curve), with forks up by 30. The growth is concentrated in the final hours of that window, and no GitHub all-language daily rank is recorded for it, so the recorded data supports a single strong burst rather than a sustained trend. What stands out technically is the choice to do endpoint extraction on the device side with adb shell unzip | strings | grep so hundreds of APKs are not pulled back to the desktop, plus explicit handling of shared UIDs such as android.uid.system README lines 299–305. Those choices fit the stated scope — a local, read-only-first audit tool — rather than a general-purpose security scanner.
Written by AI from the project's README, updated . The project's own docs are the source of truth.