Skip to content
AutoST by Zyberum GmbH
Menu
IVIAndroid

Android IVI security checks every head unit should pass

Hardening checks for an Android head unit: build type, debug flags, ADB exposure, SELinux, exported components, app flags and secrets, and what each means.

Tom Zaubermann · Published · 7 min read

An Android infotainment unit is a phone-class device wired to a car, and most of its security comes down to configuration: the build type, the debug switches, what ADB exposes, whether SELinux enforces, and which app components are open to other apps. These checks are quick, they need no exploit, and they find a large share of what we report on head units: ADB enabled on builds that should not have it, debuggable apps, components exported without a permission and system properties readable by everyone. This guide lists the checks, the value you want to see and what a deviation means.

Build and platform flags

Start with the system properties. They tell you in seconds what kind of build is on the unit.

PropertyExpected on a production buildFinding if
ro.build.typeuseruserdebug or eng
ro.build.tagsrelease-keystest-keys (platform signed with public test keys)
ro.debuggable01 (every app debuggable, root shell possible)
ro.secure10
ro.adb.secure10 (ADB without host key confirmation)
ro.build.version.security_patchrecent datefar behind the platform’s current patch level

A query looks like this:

$ getprop ro.build.type
user
$ getprop ro.debuggable
0

A test-keys build deserves special attention: the platform signing keys of the AOSP test set are public, so anything signed with them is trusted as system code.

ADB exposure

ADB is the transport for the checks themselves, which is fine on a bench unit. The question is how it is reachable on the product. Check whether ADB listens on the network (service.adb.tcp.port set, or a listener on TCP port 5555), whether a USB port in the cabin allows a device-mode connection, and whether the developer options can be enabled from the user interface. A finding here means that physical or network proximity is enough for a shell, which changes the attack feasibility rating in the TARA considerably.

SELinux

getenforce should answer Enforcing. Permissive on a production unit means the mandatory access control logs violations but does not stop them, so one weak service is enough to reach the rest of the system. Also look at the domains: vendor services running in an unconfined or overly broad domain are a softer version of the same problem.

Apps and their components

Most head units ship dozens of vendor apps. For each one, check the manifest flags and the exposed components:

  • android:debuggable="true" in a production APK: lets a debugger attach and read the app’s memory.
  • android:allowBackup="true": app data may be extracted through backup.
  • Activities, services, receivers and providers with android:exported="true" and no permission: any app on the unit can start or query them. On an IVI that can mean vehicle settings, diagnostics menus or data from a paired phone.
  • usesCleartextTraffic="true": the app may talk HTTP to its backend.
  • Dangerous permissions granted to apps that do not need them, and permissions granted to the shell user.

Static analysis of the APKs adds the secrets check: API keys, backend credentials, private keys and hardcoded URLs to internal endpoints in resources or code. A secret in an APK is a secret on every unit in the fleet.

Files and properties

List what an unprivileged shell can read: world-readable files under /data, /sdcard, vendor partitions and logs. Look for VINs, phone contacts, tokens and configuration with credentials. System properties are readable by every app, so a property that carries a token or a URL with credentials is effectively public. Logcat is the third place: debug logging of personal data or keys is common in development builds and sometimes survives into production.

Reading the results

Not every deviation weighs the same. A useful ranking for the report:

  1. Platform level: test-keys, ro.debuggable=1, SELinux permissive, ADB reachable without confirmation. These undermine everything else.
  2. Exposure: exported components without permissions, network-reachable ADB, secrets in APKs.
  3. Hygiene: allowBackup, cleartext traffic, outdated patch level, verbose logging.

For each finding, record the build fingerprint (ro.build.fingerprint), the package version and the exact output. The fingerprint is how a developer knows whether the next build still has the issue.

How AutoST runs these checks

AutoST connects to the head unit or an emulator over ADB and runs the recon automatically: packages, permissions, exported components, pullable files and the SELinux posture, plus static analysis of the APKs for manifest flags and secrets. It can also run functional tests with screenshots and live logcat. Each finding comes with a remediation and lands in the same Fix Plan as the UDS and DoIP findings. The deeper IVI work, such as vendor IPC interfaces, the update path or the bridge to the vehicle bus, remains penetration testing.

FAQ

Frequently asked questions

Is ADB on an infotainment unit always a finding?

Not on a development unit on the bench. It is a finding when ADB is reachable on a production build, over the network or over a USB port the driver can reach, or when it is enabled without the host key confirmation.

What is the difference between a user and a userdebug build?

A user build is the production variant: no root shell, debugging restricted. A userdebug build adds root access and debug features for development. A head unit that ships with userdebug or test-keys gives anyone with a shell far more than intended.

Do these checks replace an IVI penetration test?

No. They establish the hardening baseline quickly and repeatably. A penetration test goes further into the vendor services, the IPC interfaces, the update path and the link to the vehicle network.

Call usBook a demo

Pick a time that suits you

Open in a new tab