Android系统凭借开发生态成熟、硬件成本低的优势,正越来越多地被集成到ATM取款机、自助缴费终端等金融设备中。这类设备虽然外观仍是封闭式机柜,但内部运行的是带有触摸屏的Android主板,一旦安全设计缺失,攻击者便可通过物理接触或近场通信达成提权、数据窃取甚至直接吐钞。因此面向Android ATM的安全测试,不能套用普通App渗透的思路,而要把系统层、应用层与硬件层作为一个整体来看待。

系统层加固与攻击面收敛测试
在Android ATM交付部署前,最先要确认系统本身暴露了多少可被利用的入口。很多厂商为了现场维护方便,会保留ro.debuggable=1并开启USB调试,这等于把adb shell权限直接送给任何能插线的人员。测试时应使用getprop命令核查调试标志,并尝试在设备开机状态下通过adb devices能否直接获得授权。若无需点击确认即可连接,就属于高危配置,应当要求厂商在量产固件中关闭调试并锁死fastboot引导锁。
除了软件开关,SELinux策略与kiosk模式也是系统层测试重点。ATM通常只允许运行单一银行应用,但不少定制ROM仍保留了下拉状态栏、返回桌面等系统功能,用户或攻击者可通过连续点击角落调出设置页。我们通过编写自动化脚本模拟滑屏与按键注入,验证设备是否真正限制在锁屏应用内。若发现可逃逸,应检查是否缺少lock_task_mode调用或SELinux域配置过宽。下面是一段检测调试属性与引导状态的简单shell测试代码:
# 检查Android ATM调试与锁状态 adb shell getprop ro.debuggable adb shell getprop ro.secure adb shell getprop sys.oem_unlock_allowed # 尝试读取fastboot锁状态(需重启bootloader) fastboot oem device-info
针对系统层,还应审查预装的后台服务。某些主板厂商会内置远程控制Apk,使用低权限守护进程监听本地端口。我们用netstat -an与ps -Z列出所有监听套接字和SELinux标签,确认没有未知进程绑定在0.0.0.0上。对于发现的可疑服务,进一步用strace跟踪其文件与网络行为,防止隐蔽通道泄露交易日志。
应用通信与交易报文完整性验证
ATM核心应用与后台服务器之间的通信是资金安全的生命线。我们在测试环境中布置透明代理,将设备流量导向Burp Suite,观察登录、查余额、出钞指令等报文是否采用TLS双向认证。部分旧版终端仅做单向证书校验,甚至把敏感字段用明文或弱Base64编码传输,攻击者在同网段即可实施中间人篡改账户余额。测试时要重点替换响应包,看客户端是否校验签名或交易流水号。
除了传输层,应用自身组件暴露也常被忽视。Android的Activity、Service、ContentProvider若声明了exported=true且未做权限控制,远程或本地恶意App就能直接调起出钞界面。我们使用drozer执行run app.activity.info -a 包名枚举导出组件,并构造Intent尝试跨越边界。下面的Python片段演示如何用drozer API批量导出组件信息:
from drozer import Module
class EnumExport(Module):
def execute(self, arguments):
# 列举目标包的导出组件
pkg = arguments['package']
self.stdout.write(self.Device(
).app_activity_info(pkg, exported_only=True))
在报文层面,还要验证客户端对异常返回的处理逻辑。我们模拟后台返回超长金额字符串、负数钞箱计数等边界数据,检查应用是否会崩溃或错误吐钞。完整的安全测试应覆盖正常、重放、篡改、重排序四类报文,确保每笔交易都有不可伪造的令牌与硬件加密机参与校验,而不是仅靠应用层if判断。
硬件接口与物理接触式攻击测评
ATM与普通手机的最大区别是长期置于公共空间,机柜虽锁但维修孔、USB口、串口常暴露。我们实测一类设备,其主板留有未点胶的UART四针,用万用表找出TX/RX后接上USB转串口,开机即进入root shell。这类硬件后门在测试报告中必须明确标注,并要求厂商覆胶或熔断测试点。对读卡器与密码键盘也应做侧信道评估,检查是否存在可被外接逻辑分析仪嗅探的明文总线。
另一类风险是外设固件被替换。部分Android ATM的钞箱驱动以普通.ko模块加载,攻击者取得临时root后可用恶意模块拦截吐钞电机指令。测试时我们提取原厂模块做哈希比对,并尝试加载自签名模块观察系统是否拒绝。若设备未开启模块签名强制,就应在方案中补充CONFIG_MODULE_SIG_FORCE内核编译选项。以下代码展示如何计算模块指纹并比对白名单:
# 计算驱动模块sha256并与白名单比对 sha256sum /vendor/lib/modules/cashbox.ko > cur.txt diff cur.txt whitelist.txt && echo "模块完整" || echo "模块被篡改"
最后,物理按键与触摸屏的注入防御也归入此类。我们在密闭机柜外放置电磁干扰源,观察触摸屏是否误触触发管理员菜单;同时用蓝牙HID设备尝试向系统注入按键,验证kiosk模式是否屏蔽了外部输入源。只有软硬件协同限制,才能让Android ATM在无人值守场景下承受住现实攻击。
AndroidATM_Securitypenetration_testing修改时间:2026-08-16 11:44:33