禁用adb调试是防止敏感信息泄露的首要措施,需通过关闭usb/无线调试、清除persist.sys.usb.config属性、禁用service.adb.root服务,并验证adb devices无输出;同时须系统级限制敏感属性读取、剥离log日志、加固selinux策略及binder接口。

禁用系统调试与信息获取接口,是防止敏感权限信息在运行时被恶意应用或调试工具抓取的关键手段。这类接口一旦开放,攻击者可能绕过常规权限检查,直接读取进程内存、日志、系统属性甚至签名证书等高价值信息。实战中不能只靠“关掉开发者选项”这种表面操作,而要从系统层、应用层、配置层三线并进。
关闭ADB调试与USB调试开关(基础但易漏)
这是最常被忽视的第一道门。即使用户没主动开启,某些刷机包、预装应用或OTA升级可能默认激活ADB调试。
- 手动检查:设置 → 系统 → 开发者选项 → 关闭“USB调试”和“无线调试”;若找不到该菜单,先连点7次“关于手机”中版本号激活
- 批量管控(企业场景):通过MDM平台下发策略,强制清除
persist.sys.usb.config系统属性值,并禁用service.adb.root服务 - 验证是否生效:电脑端执行
adb devices应返回空列表;插线后设备不弹出授权对话框即为成功
屏蔽系统敏感属性与调试接口(系统级加固)
Android系统提供大量getprop可读属性,如ro.serialno、ro.boot.verifiedbootstate、sys.usb.config等,部分含设备唯一标识或启动状态,可被ContentProvider或反射调用泄露。
- 定制ROM中,在
init.rc或property_service.cpp中限制非白名单属性的读写权限,例如将ro.serialno设为仅root可读 - 应用侧规避:避免使用
System.getProperty()或android.os.SystemProperties.get()读取未声明用途的系统属性;鸿蒙环境下尤其注意ohos.app.Context.getBundleManager().getAppModuleInfo()等接口是否暴露签名哈希 - 运行时检测:在Application#onCreate中调用
Debug.isDebuggerConnected()和Debug.isJdwpEnabled(),发现异常立即清空本地密钥或触发降级模式
限制Logcat与调试日志输出(防信息侧信道)
Logcat不是“仅供开发”,而是系统级日志总线。攻击者可通过logcat -b events获取广播发送记录,用-b radio捕获SIM卡状态变更,甚至从dalvikvm缓冲区还原Java堆栈中的明文token。
- 发布版APK必须移除所有
Log.d/e/i/v调用,用ProGuard规则-assumenosideeffects class android.util.Log { *; }彻底剥离 - 系统层关闭非必要日志缓冲区:在
build.prop中设置log.tag.ActivityManager=I(仅保留info)、logd.logpersistd=false禁用持久化日志 - 鸿蒙/OpenHarmony设备需额外禁用
hilog的DEBUG级别输出,通过hilog -r清空缓存,并在config.json中将"debugLevel"设为"WARN"
禁用调试相关系统服务与Binder接口(深度防御)
某些高危接口本身不暴露在SDK中,但可通过Binder直接调用,例如IBatteryStats可统计各应用CPU/唤醒时间,IActivityManager可枚举当前运行Service——这些都可能被用于行为画像或权限探测。
- 在SELinux策略中,对
debuggerd、dumpstate、surfaceflinger等服务添加neverallow规则,禁止第三方domain域访问 - 测试阶段用
dumpsys逐项排查:dumpsys activity services、dumpsys batterystats,确认无敏感字段返回;生产固件中应移除对应dumpsys模块 - 对WebView组件,禁用
WebSettings.setJavaScriptEnabled(true)的同时,必须调用setWebContentsDebuggingEnabled(false),否则Chrome DevTools仍可远程注入调试器











