摘要

“摇一摇”开屏广告是指用户打开某App时,通过摇动手机触发广告跳转的一种广告形式,由芒果TV发明并申请了相关专利,随着“摇一摇”功能的日益普遍,在各类App中均能找到其身影,在给用户展示广告的同时,也因App内“摇一摇”广告的高灵敏度,导致用户在走路、乘车、拾起放下手机等日常生活中,经常出现用户未主动操作,而触发跳转广告的现象,侵害了用户的合法权益,引起了监管部门的高度关注。本文针对Android端App内的“摇一摇”广告进行分析,旨在从技术角度探讨“摇一摇”功能的实现机制,验证其实现时相关标准参数的一致性和可测试性。

01 概述

2023年2月武汉某学生以美图秀秀App “摇一摇”广告存在高灵敏度跳转,多次在非主观自愿情形下被迫跳转至第三方App和链接页面为由向厦门市思明区人民法院提出民事诉讼,法院最终认定“摇一摇”高灵敏度跳转行为侵犯了用户自主选择权,并要求美图秀秀进行整改。同在今年2月,工信部发布《工业和信息化部关于进一步提升移动互联网应用服务能力的通知》,明确要求移动互联网应用不得利用高灵敏度“摇一摇”等易造成误触发的方式诱导用户操作。

2023年4月,小米MIUI 14版本也提供用户关闭“获取设备动作与方向”的权限管理,用户可自主选择是否授予App收集传感器信息。大部分个人信息处理者也对“摇一摇”广告进行了规范化,确保用户在知情同意的情况下使用“摇一摇”。

02 “摇一摇”广告功能实现机制分析

“摇一摇”广告功能通常通过调用手机中的加速度、重力、陀螺仪等一种或多种传感器实现,当用户摇动手机触发相应的传感器阈值后可实现广告交互。根据电信终端产业协会发布的(T/TAF078.7-2022)《APP用户权益保障测评规范 第7部分:欺骗误导强迫行为》,明确要求手机设备加速度不小于15m/s2,转动角度不小于 35°,操作时间不少于 3s,或同时考虑加速度值与方向、转动角度的方式,或与前述单一触发条件等效的其他参数设置,确保用户在走路、乘车、拾起放下移动智能终端等日常生活中,非用户主动触发跳转的情况下,不会出现误导、强迫跳转。

Android提供的android.hardware软件开发包中包含了一系列类和接口实现传感器的调用与操作,例如SensorManager类提供了各种方法注册、注销传感器事件监听器,sensor类提供了确定传感器特性的方法,SensorEvent类来创建传感器事件对象等。

Android终端传感器调用通常由获取传感器服务、获取目标传感器、注册传感器监听器、注销传感器监听器等四个环节组成。具体如下:

获取传感器服务

使用 SensorManager 类中的方法 Context.getSystemService(String) 获取传感器服务。

SensorManager sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);

获取目标传感器

获取目标传感器的方式有以下两种:

1、使用getSensorList()方法中传入TYPE_ALL来获取设备上的所有传感器,在日常测试过程中能看到许多App采用此类方法,但这种方式涉及到对于传感器信息的过度收集的问题。

ListdeviceSensors = sensorManager.getSensorList(Sensor.TYPE_ALL);

2、使用sensorManager.getDefaultSensor()指定 type 参数获取到指定的传感器,如果不存在指定的默认传感器,则会返回null。

Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

注册传感器监听器

注册监听器使用SensorManager.registerListener()方法,需要重写onSensorChanged(SensorEvent event)和onAccuracyChanged(Sensor sensor, int accuracy)。

onSensorChanged(SensorEvent event)当传感器数值发生变化时回调,参数event可以获取传感器的类型以及传感器的数据,event.values[i] 获取传感器的数据,以加速度传感器为例,values[0]表示x轴上的加速度,values[1]表示y轴上的加速度,values[2]表示z轴上的加速度。

onAccuracyChanged(Sensor sensor, int accuracy)当传感器精度发生变化时回调。

注销传感器监听器

注销传感器监听器使用SensorManager.unregisterListener()方法。

03 “摇一摇”广告隐私合规测评实践

本文选择一款具有“摇一摇”广告的Android App,通过逆向分析、动态调试等方法,测评分析其是否符合标准《T/TAF078.7-2022 APP用户权益保障测评规范 第7部分:欺骗误导强迫行为》中“ 设备加速度不小于15m/s2 ”的阈值要求。下面对本次测评实践进行展开论述:

定位关键函数

此款App使用加速度传感器实现“摇一摇”广告功能,由前面的实现原理分析可知,App注册传感器监听器之后,需要传递一个监听器对象,这个对象包含了onSensorChanged和onAccuracyChanged两个方法,对安装包进行反编译查找onSensorChanged相关代码如下所示:

@Override //android.hardware.SensorEventListener

public void onSensorChanged(SensorEvent sensorEvent) {

try {

com.xxx.library.appcia.trace.q.l(171014);

r rVar =this.f19729d;

if (rVar !=null)

rVar.b(sensorEvent);

}finally {

com.xxx.library.appcia.trace.q.b(171014);

}

}

继续追踪可发现“摇一摇”判断逻辑在com.xxx.business.ads.core.utils.e0类中实现,如下所示:

private boolean b(SensorEvent sensorEvent) {

try {

com.xxx.library.appcia.trace.q.l(171043);

float[] fArr = sensorEvent.values;

float f11 = fArr[0];

float f12 = fArr[1];

float f13 = fArr[2];

if (this.f19734b <=0) {

this.f19734b =1;

}

double d11 = (f11 * f11) + (f12 * f12) + ((f13 * f13) /this.f19734b);

int i11 =this.f19733a;

boolean z11 = d11 >= ((double) (i11 * i11));

if (z11) {

if (f19732e) {

pd.p.b("ShakeDetector","isAcc yes x: " + f11 +" ,y: " + f12 +" ,z: " + f13 +",acc user=" + Math.sqrt(d11) +",acc thr=" +this.f19733a);

}

}else if (f19732e) {

pd.p.b("ShakeDetector","isAcc no x: " + f11 +" ,y: " + f12 +" ,z: " + f13 +",zRatio:" +this.f19734b +",minWindowSize:" +this.f19735c.g());

}

return z11;

}finally {

com.xxx.library.appcia.trace.q.b(171043);

}

}

上方函数传入了一个监听器对象参数sensorEvent,读取了此对象中的values数组的前三个值f11、f12、f13,并计算f11、f12、f13的平方和得到d11,并将d11与参数i11的平方进行比较(i11数值为15)。

/* renamed from: a reason: collision with root package name */

private int f19733a =15;

/* renamed from: b reason: collision with root package name */

private int f19734b =1;

根据上述函数逻辑判断此监听器对象为加速度传感器,读取values数组中的前三个参数分别为x,y,z三轴加速度,其合加速度平方根为15m/s2,满足T/TAF078.7-2022标准要求。

获取触发阈值

通过打印调用栈发现该App在使用“摇一摇”时,onSensorChanged、com.xxx.business.ads.core.utils.e0.b方法被高频调用。

(agent)[344388] Argumentscom.xxx.business.ads.core.utils.e0.b(android.hardware.SensorEvent@d98b95a)

(agent)[344388] Return Value:(none)

(agent)[344388] Calledcom.xxx.business.ads.core.utils.e0.b(android.hardware.SensorEvent)

(agent)[344388] Backtrace:

com.xxx.business.ads.core.utils.e0.b(Native Method)

com.xxx.business.ads.core.utils.e0.c(SourceFile:1)

com.xxx.business.ads.core.utils.a0.b(SourceFile:1)

com.xxx.business.ads.core.utils.d0.onSensorChanged(SourceFile:2)

android.haraware.SystemSensorManager$SensorEventQueue.dispatchSensorEvent(SystemSensorManager.java:856)

android.os.MessageQueue.nativePollOnce(Native Method)

android.os.MessageQueue.next(MessageQueue.java:335)

android.os.Looper.loop(Looper.java:193)

android.app.ActivityThread.main(ActivityThread,java:8060)

java.lang.reflect.Method.invoke(Native Method)

com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:656)

com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967)

打印com.xxx.business.ads.core.utils.e0.b方法返回值,发现其返回值为“ture”时,“摇一摇”广告进行跳转,为“false”时,“摇一摇”广告不进行跳转。

将该App的com.xxx.business.ads.core.utils.e0.b方法返回值修改为“ture”且保持不变,发现App无需摇晃即可直接触发“摇一摇”广告,具体如下图所示:

打印d11的平方根的返回值,若其大于15m/s2,则返回true,并跳转至广告内容,因此可确定该App的加速度传感器触发阈值为15m/s2,与代码分析结果一致。

04 “摇一摇”广告隐私合规的几点建议

根据本文第三章测评实践,发现App“摇一摇”广告功能会收集用户的传感器数据,根据《工业和信息化部关于进一步提升移动互联网应用服务能力的通知》、(T/TAF078.7-2022)《APP用户权益保障测评规范 第7部分:欺骗误导强迫行为》要求,App在收集传感器数据前,应明确告知用户收集的目的、方式等,并获得用户的授权同意,应提供用户撤回同意的方式,保障用户的主体权利。

目前大部分App未就“摇一摇”广告功能收集传感器数据向用户进行明示同意,为进一步规范App摇一摇”广告隐私合规,从个人信息处理和智能移动终端厂商两个方面,提出几点建议,仅供参考:

个人信息处理者

1、隐私政策中应明确告知用户收集传感器的类型、方式和目的等规则。

参考示例

2、提供清晰的“摇一摇”广告交互界面,确保用户能够区分“摇一摇”广告功能。

3、在App内提供供用户开启/关闭“摇一摇”或传感器的选项,并在隐私政策中声明其关闭路径。

参考示例

4、设定符合T/TAF078.7-2022标准要求的传感器触发阈值,避免因高灵敏度造成误触发情况。

移动智能终端厂商

1、提供传感器管理机制,可供用户选择是否授权某App读取传感器数据;

2、对传感器资源调用进行监控,可供用户对App调用传感器的行为进行查看。

05 结束语

本文以现实中发生的App“摇一摇”广告功能侵害用户主体权利案例为切入点,结合监管及相关标准要求,对某款具有“摇一摇”广告功能的Android App进行测评实践,分析验证了Android App“摇一摇”广告功能的实现机制,可为相关测评人员开展“摇一摇”广告功能隐私合规测评提供方法借鉴。

由于笔者认识能力有限,文中不妥和错漏之处在所难免,恳请读者提出宝贵意见。

参考文献

作者:肖婷婷 陈冬 刘倩雯

编辑:林青

审核:吴冬宇 隋忻

声明:本文来自极客安全,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。