Skip to content

Commit 42297a2

Browse files
author
Raphael Kubo da Costa
committed
Editorial: Drop own powerful feature, require active local video source.
Fixes #79. The idea is that, based on the research on potential attacks on the Ambient Light Sensor API, it is important to prompt users before allowing access to illuminance readouts. This was already mandated by the main Generic Sensors spec, as `Sensor.start()` runs the "Request sensor access" abstract operation. The challenge with the Ambient Light Sensor API is prompting users in a way that they understand what they are being prompted for; the assumption is that most users are not familiar with what an Ambient Light sensor is. We have chosen to solve this issue by dropping our "ambient-light-sensor" powerful feature name altogether and integrating with the Media Capture and Streams specification instead: we consider an Ambient Light Sensor to be a 1x1 camera and require there to be at least one local video source that is not muted or stopped in order for illuminance readouts to be provided. Per the Media Capture and Streams specification, this is only possible if script has called `MediaDevices.getUserMedia()` and granted the "camera" permission. This also means the User Agent has at least indicated to the user that a local video source has started being used. In other words, an Ambient Light Sensor only provides readings if a local video source (such as a camera) is currently active and being used in the same window as the AmbientLightSensor instance, and when all local video sources stop we also stop providing readouts and fire an "error" with a NotReadableError exception.
1 parent 2f4a4e2 commit 42297a2

File tree

1 file changed

+111
-9
lines changed

1 file changed

+111
-9
lines changed

index.bs

Lines changed: 111 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,12 @@ urlPrefix: https://w3c.github.io/sensors/; spec: GENERIC-SENSOR
5555
urlPrefix: https://tc39.es/ecma262/; spec: ECMA-262
5656
type: abstract-op
5757
text: abs; url: eqn-abs
58+
urlPrefix: https://w3c.github.io/mediacapture-main/; spec: MEDIACAPTURE-STREAMS
59+
type: dfn
60+
text: stopped; url: source-stopped
61+
</pre>
62+
<pre class=link-defaults>
63+
spec: mediacapture-streams; type:dfn; text:source
5864
</pre>
5965

6066
<pre class=biblio>
@@ -237,9 +243,13 @@ Works such as [[ALSPRIVACYANALYSIS]], [[PINSKIMMINGVIASENSOR]],
237243
[[STEALINGSENSITIVEDATA]], and [[VIDEORECOGNITIONAMBIENTLIGHT]] delve further
238244
into these issues.
239245

240-
To mitigate these threats specific to Ambient Light Sensor, user agents must
241-
<a>reduce accuracy</a> of sensor readings. User agents may also <a>limit
242-
maximum sampling frequency</a>.
246+
To mitigate these threats specific to Ambient Light Sensor, user agents must:
247+
- [=Reduce accuracy=] of sensor readings. See [[#reduce-sensor-accuracy]].
248+
- Obtain user consent before providing sensor readings. This is done by
249+
integrating with the [[MEDIACAPTURE-STREAMS]] specification. See
250+
[[#local-video-source-requirement]].
251+
252+
User agents may also <a>limit maximum sampling frequency</a>.
243253

244254
These mitigation strategies complement the [=mitigation strategies|generic mitigations=]
245255
defined in the Generic Sensor API [[!GENERIC-SENSOR]].
@@ -283,6 +293,39 @@ experience. <a href="https://crbug.com/1332536">Chromium bug 1332536</a> and <a
283293
href="https://crrev.com/c/3666917">Chromium review 3666917</a> contain more
284294
information about this.
285295

296+
Active local video source requirement {#local-video-source-requirement}
297+
-----
298+
299+
Many of the attacks on Ambient Light sensors referenced above rely on being
300+
able to access illuminance readouts for a certain amount of time without a user
301+
being aware that the data is being read.
302+
303+
[[STEALINGSENSITIVEDATA]] and [[ALSPRIVACYANALYSIS]] specifically recommend
304+
requesting user permission before allowing access to illuminance readouts as a
305+
privacy measure. On the other hand, it can be argued that conveying to users
306+
what an Ambient Light Sensor is so that they can make an informed choice to
307+
grant or deny access to it can be difficult.
308+
309+
What this specification does instead is consider an Ambient Light Sensor to be
310+
a 1x1 grayscale camera, integrate with the [[MEDIACAPTURE-STREAMS]]
311+
specification and require there to be at least one local video [=source=] that
312+
is not [=muted=] or [=stopped=] in order for illuminance readouts to be
313+
provided. In other words, an Ambient Light Sensor only provides readings if a
314+
local video source (such as a camera) is currently active and being used in the
315+
same window as the {{AmbientLightSensor}} instance.
316+
317+
Per the [[MEDIACAPTURE-STREAMS]] specification, this is only possible if script
318+
has called {{MediaDevices/getUserMedia()}} and granted the <a
319+
permission>"camera"</a> permission. This also means the User Agent has at least
320+
indicated to the user that a local video source has started being used as per
321+
[[MEDIACAPTURE-STREAMS#privacy-indicator-requirements]].
322+
323+
The goal of this model is to treat an Ambient Light Sensor as potentially as
324+
invasive as an actual camera device and subject it to the same strict privacy
325+
requirements together with the Generic Sensor mitigations described in
326+
[[GENERIC-SENSOR#security-and-privacy]] and the other Ambient Light
327+
Sensor-specific measures described in this section.
328+
286329
Model {#model}
287330
=====
288331

@@ -292,12 +335,12 @@ subclass is the {{AmbientLightSensor}} class.
292335
The <a>Ambient Light Sensor</a> has a <a>default sensor</a>,
293336
which is the device's main light detector.
294337

295-
The <a>Ambient Light Sensor</a> is a [=powerful feature=] that is identified by
296-
the [=powerful feature/name=] "<dfn permission export>ambient-light-sensor</dfn>",
297-
which is also its associated [=sensor permission name=]. Its
298-
[=powerful feature/permission revocation algorithm=] is the result of calling
299-
the [=generic sensor permission revocation algorithm=] with
300-
"ambient-light-sensor".
338+
The <a>Ambient Light Sensor</a>'s [=sensor permission names=] is an
339+
[=set/empty=] [=ordered set|set=].
340+
341+
Note: See [[#local-video-source-requirement]]. This specification relies on the
342+
permission model specified in the [[MEDIACAPTURE-STREAMS]] specification
343+
instead.
301344

302345
The <a>Ambient Light Sensor</a> is a [=policy-controlled feature=] identified by the string "ambient-light-sensor". Its [=default allowlist=] is `'self'`.
303346

@@ -345,6 +388,35 @@ The {{AmbientLightSensor/illuminance}} getter steps are:
345388
reading=] with [=this=] and "illuminance" as arguments.
346389
1. Return |illuminance|.
347390

391+
### Media Capture and Streams integration ### {#media-capture-and-streams-integration}
392+
393+
As discussed in [[#local-video-source-requirement]], illuminance readouts are
394+
provided only if the same {{Window}} with an {{AmbientLightSensor}} object has
395+
at least one local video [=source=] that is not [=muted=] or [=stopped=].
396+
397+
The [=ambient light pre-activation checks algorithm=] is invoked by
398+
{{Sensor/start()}} as specified in [[GENERIC-SENSOR]].
399+
400+
Furthermore, whenever an item is added to the {{Window}}.\[[devicesLiveMap]]
401+
internal slot, or one of its items has its value changed, implementations MUST
402+
run the following steps:
403+
404+
<div algorithm="deactivate sensors if necessary">
405+
1. Let |global| be the {{Window}} object of the affected \[[devicesLiveMap]]
406+
internal slot.
407+
1. Let |result| be the result of invoking [=check for active local video sources=] with |global|.
408+
1. If |result| is true, return.
409+
1. For each {{AmbientLightSensor}} object |sensor| whose [=relevant global
410+
object=] is |global|:
411+
1. If |sensor|.{{[[state]]}} is "idle", then [=continue=].
412+
1. Invoke [=deactivate a sensor object=] with |sensor|.
413+
1. Let |e| be the result of [=created|creating=]
414+
a "{{NotReadableError}}" {{DOMException}}.
415+
1. [=Queue a global task=] on the [=sensor task source=] with |global| to
416+
run [=notify error=] with |sensor| and |e| as
417+
arguments.
418+
</div>
419+
348420
Abstract Operations {#abstract-operations}
349421
===================
350422

@@ -418,6 +490,36 @@ quantization algorithm=]:
418490
1. Return |quantizedReading|.
419491
</div>
420492

493+
<h3 dfn>Ambient light pre-activation checks algorithm</h3>
494+
495+
The [=Ambient Light Sensor=] [=sensor type=] defines the following
496+
[=pre-activation checks algorithm=]:
497+
498+
<div algorithm="check active local video source">
499+
: input
500+
:: |sensor|, an {{AmbientLightSensor}} object
501+
: output
502+
:: A [=boolean=] indicating whether the checks have passed and sensor activation may proceed.
503+
504+
1. Let |global| be |sensor|'s [=relevant global object=].
505+
1. Return the result of invoking [=check for active local video sources=] with |global|.
506+
</div>
507+
508+
<h3 dfn>Check for active local video source</h3>
509+
510+
<div algorithm="check for active local video sources">
511+
: input
512+
:: |global|, an {{Window}} object
513+
: output
514+
:: A [=boolean=] indicating whether there are active local video sources.
515+
516+
1. If |global| does not have a \[[mediaStreamTrackSources]] internal slot, return false.
517+
1. For each |source| in |global|'s \[[mediaStreamTrackSources]] internal slot:
518+
1. If |source| is not a video input device, then [=continue=].
519+
1. If |source| is not [=stopped=] or [=muted=], then return true.
520+
1. Return false.
521+
</div>
522+
421523
Automation {#automation}
422524
==========
423525
This section extends the [=automation=] section defined in the Generic Sensor API [[GENERIC-SENSOR]]

0 commit comments

Comments
 (0)