研究人员找出Teams造成Android手机打不出紧急电话的原因

日前发生Android手机上的Teams造成用户无法打911紧急求助电话情形。Google和微软都未说明原因,不过一名研究人员本周说明他的见解。

Pixel 3用户11月底以手机拨911,电话响了一声后,手机就卡住没有回应。Google研究后,仅指出这是Teams App和底层Android系统发生“不小心交互”的结果。Google认为仅Android 10版本以上手机安装了微软Teams App,却又没有登录时会发生这情形。

前XDA总编,现任Esper资深技术编辑的Mishaal Rahman和其友人合作找出原因出在Android程序代码和Teams一连串错误造成的结果。根本原因在Android要求第三方打电话的App要注册PhoneAccount加入Android的TelecomManager服务,不论是打普通电话或是紧急电话。Teams可以打普通电话,但不能打紧急电话。有趣的是,一旦用户拨紧急电话时,Android紧急电话服务却加载所有打普通电话的App PhoneAccount清单。

由于Teams不能打紧急电话,此时Android紧急电话服务的判断逻辑会按多种条件,找出下一个递补名单。通常也不难,因为注册PhoneAccount的App也不多。但这时又碰上另一个Teams的问题:若用户手机上的Teams App未登录,Teams App每次宕掉或重启(称为冷启动)时,就会创建新的UUID(Universally Unique Identifier)来产生PhoneAccount instance。多次之后形成重复的PhoneAccount instance。于是当Android紧急电话服务在寻找递补名单时,碰到冲突的Instance而引发整数溢出或下溢错误(integer overflow/underflow),造成紧急电话宕掉。

Rahman团队发现,Teams是在2021年10月底的版本出现这行为,刚好是在Pixel 3用户事件发生前一个月。

至于为什么会在Android 10才发生。Rahman认为,Teams是在API level 28 (Android 9 Pie以后)才开始注册PhoneAccount,但Google方面则是Android 10才导入这项变更,因此只有这个版本以后的手机才会出现问题。

微软昨日发布Teams 1416/1.0.0.2021194504,解决这只bug。不过这只解决Teams的问题,其他App可能也有类似状况,导致Android手机无法呼出911紧急电话。Google上周表示会在明年1月4日将新版Android发布给合作伙伴,包括硬件制造商。