Компания Mozilla заблокирует доступ к одной из функций браузера Firefox, известной как Battery Status API. С ее помощью веб-сайты могли узнавать об уровне заряда батареи ноутбука, планшета или смартфона пользователя. Решение было принято с целью обезопасить право пользователей на приватность. Хронология событий такова, что история началась с подозрений экспертов, за ними последовала реализация и реальное использование. На данный момент не ясно, что будут делать с этой функцией остальные браузеры.

Причиной резких изменений стало то, что приватность данных оказалась под угрозой. Дополнительные обстоятельства — это злоупотребление возможностями и множество ошибок при внедрении. Решение по удалению функции из-за соображений конфиденциальности является беспрецендентным после известных очевидных случаев незаконного использования.

Цель функции — предлагать пользователям разные версии сайта в зависимости от остатка заряда устройства. Если устройство разряжается, пользователю можно предложить версию сайта, которая не так сильно «ест» батарейку. За разными версиями стоит большая работа владельцев и авторов сайтов, разработчиков и прочих. Battery Status API получала статус зарядки от сети или работы от батарей и том, сколько времени осталось до отключения устройства. А также, какой процент батареи остался неизрасходованным. Конкретное применение функции выглядело так: социальные сети отключали автоматическое воспроизведение видео, а сервисы с картами отображали меньше деталей, без которых можно было обойтись.


Потенциальная угроза стала реальностью, когда два исследователя безопасности из Принстонского Университета обнаружили скрипты слежения, которые использовались в реальном мире для функции fingerprint с конкретного устройства с целью дальнейшего слежения за ним в разных ситуациях. Это открытие мотивировало разработчиков компании Mozilla на удаление «нехорошей» возможности из своего браузера. Окончательно функция была убрана 27 октября 2016-го года. С момента обнаружения проблемы прошло 17 месяцев.

Кроме Firefox еще два браузера поддерживали функцию: Opera и Google Chrome. Пусть Battery Status API является частью спецификации HTML5, браузеры IE, Edge никогда не реализовывали ее. В WebKit поддержка Battery Status API была, но в браузере Safari она никогда не появлялась. Существует лишь несколько общевозможных применений в реальности за рамками задачи идентификации пользователя.



О самой функции


Battery Status API была задокументирована в 2012-м году. Mozilla Firefox первый браузер, в котором она была реализована. Battery status API добавляет в window.navigator метод navigator.getBattery(). В примере ниже видно, как изменяется статус зарядки (подключение к сети) и уровень заряда в батарее, и оставшееся время. Это возможно с применением функции listen для событий: chargingchange, levelchange, chargingtimechange, dischargingtimechange.

navigator.getBattery().then(function(battery) {
  function updateAllBatteryInfo(){
    updateChargeInfo();
    updateLevelInfo();
    updateChargingInfo();
    updateDischargingInfo();
  }
  updateAllBatteryInfo();

  battery.addEventListener('chargingchange', function(){
    updateChargeInfo();
  });
  function updateChargeInfo(){
    console.log("Battery charging? "
                + (battery.charging ? "Yes" : "No"));
  }

  battery.addEventListener('levelchange', function(){
    updateLevelInfo();
  });
  function updateLevelInfo(){
    console.log("Battery level: "
                + battery.level * 100 + "%");
  }

  battery.addEventListener('chargingtimechange', function(){
    updateChargingInfo();
  });
  function updateChargingInfo(){
    console.log("Battery charging time: "
                 + battery.chargingTime + " seconds");
  }

  battery.addEventListener('dischargingtimechange', function(){
    updateDischargingInfo();
  });
  function updateDischargingInfo(){
    console.log("Battery discharging time: "
                 + battery.dischargingTime + " seconds");
  }

});

У сайта не должно быть возможности связать личность пользователя в режиме инкогнито с разным IP с VPN и без него. В случае быстрого отключения VPN, уровень заряда аккумулятора будет примерно одинаковым. Считав эту информацию, браузер передаст ее сайту. Два набора данных будут сопоставлены и можно будет сделать вывод, что пользователь один и тот же.


Guardian приводит слова Лукаша Олейника, консультанта по безопасности и исследователя в UCL, по поводу происходящего с Firefox. Он был одним из четырех людей, первыми обнаруживших потенциальную угрозу Battery Status API. Конечно, он был рад, увидеть как его работа принесла плоды. Специалист не ожидал, что компания-разработчик полностью откажется от использования API. «Это и правда беспрецендентно. Я не знаю о подобном развитии событий за всю историю разработки. Насчет отсрочки в процессе удаления: это не так уж критично, потому что мы предлагали внести изменения в работу функции в прошлом году, а в итоге получили полное удаление. Факт, что это происходит для соблюдения конфиденциальности, подчеркивает важность принятого решения». В своем заявлении представители Mozilla сказали, что для веб-контента функция теперь недоступна, но ее все еще можно найти в расширениях. Battery Status API удалят в 52-й версии Firefox.

Пока что функцию собралась удалять только Mozilla. Разработчики движка Webkit, который лежит в основе Safari от Apple, также предложили удалить код API. Издание The Guardian обратилось к компаниям Google и Opera за комментариями. Apple от комментариев отказались. Подтверждение о том, что функция удалена из доступа размещено на официальном сайте Mozilla.
Поделиться с друзьями
-->

Комментарии (32)


  1. Magister7
    05.11.2016 00:32
    +22

    Хм, а не лучше ли было бы отдавать просто некие «усредненные» данные? Например, округлять уровень заряда до 20%. Ну и со временем что-то похожее сделать.
    Тогда бы функция приносила пользу, но использовать её для слежения было бы невозможно.


    1. lgorSL
      05.11.2016 02:06
      +12

      В идеале, там достаточно 2 положений: "экономить энергию" и "не экономить" — а пользователь сам решит, когда и что нужно.


    1. Zibx
      05.11.2016 02:11
      +2

      Проще — отдавать рэндом в режиме инкогнито! Причём это касается и данных гироскопа\геопозиционирования\может существует вайфай апи с именем точки\хттп агент\скринв\х — всё это рэндомить, это же очевидное решение.


      1. Fedcomp
        05.11.2016 11:05
        +3

        Ну и сайты у вас тогда будут рандомить, которые используют эту функцию для полезных действий.


    1. evehicks
      05.11.2016 13:17
      -3

      Сомневаюсь что усреднение как-то добавит анонимности в описанном примере с быстрым отключением VPN.


      1. MnogoBukv
        06.11.2016 09:07

        В данном примере — анонимность не является примером анонимности.


  1. dom1n1k
    05.11.2016 02:28

    Склоняюсь ко мнению, что они поступили правильно.
    Хотя, как вариант, можно было бы спрятать за флагом.


  1. mcflys
    05.11.2016 03:20
    +6

    Была же история, по моему про Uber. Они просили больше денег за проезд когда у пользователя разрежался телефон.


    1. ArjLover
      05.11.2016 03:37
      +8

      Это была злобная фантазия тех же журналистов на данную тему, и вот реально как в анекдоте — ложечки нашлись, а осадок остался — уберу уже досталось на орехи.


    1. MnogoBukv
      05.11.2016 13:17
      +12

      Т.е. давление внутри телефона было ниже атмосферного?


  1. JeStoneDev
    05.11.2016 05:11
    +4

    У сайта не должно быть возможности связать личность пользователя в режиме инкогнито с разным IP с VPN и без него. В случае быстрого отключения VPN, уровень заряда аккумулятора будет примерно одинаковым. Считав эту информацию, браузер передаст ее сайту. Два набора данных будут сопоставлены и можно будет сделать вывод, что пользователь один и тот же.

    Странное решение. Мне кажется было бы разумнее запрашивать у пользователя разрешение на использование Battery Status API, а не удалять его полностью. А то следуя этой логике они должны вообще никогда не реализовывать ни одну из спецификаций сенсоров:
    Gyroscope Sensor
    Proximity Sensor
    Ambient Light Sensor
    Magnetometer Sensor
    Generic Sensor API
    и кучу других спецификаций, дающих хоть какую-то информацию об устройстве, geolocation, mediastream, bluetooth (это я уже утрирую).
    По ним ведь тоже в совокупности (да и по отдельности) можно делать определенные выводы о личности пользователя при отключении/смене VPN. Только вот в большинстве случаев (или во всех?), когда нужен доступ к каким-то дополнительным устройствам, то запрашивается (и скорее всего будет запрашиваться для нереализованных спецификаций) разрешение пользователя.
    Так чем же Battery Status API отличается от обычного «сенсора уровня батареи»?


  1. Ivan_83
    05.11.2016 06:09
    -1

    Это далеко не всё.

    1. Коммитеров мозиллы скорее всего приватность вообще не беспокоит, поскольку для фигнерпритнта при включённой жаве данных предостаточно.
    Вот тут это всё подробно показывают: https://panopticlick.eff.org
    АПИ батарейки это сущие мелочи.
    Для начала нужно выпиливать джаву, потом рандомизировать оставшиеся заголовки или их тоже выпиливать.
    Всё это приведёт нас обратно лет на 15 назад.
    NoScript и регвестполиси сильно помогают против таких всевидящих скриптов, но полностью проблемы не решают и сложны в пользовании для обычных людей.
    Те решения проблемы приватности для обычных людей нет.

    2. Скорее всего коммитеры таки пострадали от убера и прочих которые при низком заряде поднимают ценник в разы на такси и потому начали шевелится, оправдывая мстю заботой о приватности. Либо пеар.

    Я вообще стал сильно сомневаться в их стремлении к лучшему для пользователя и аполитичности, после того как увидел что патч к NSS (это их самодельная криптолиба для браузера и пр их софта) для поддержки российской крипты висит у них в багтрекере уже года 3+.


    1. FForth
      06.11.2016 00:09

      По тесту https://panopticlick.eff.org В FireFox только установленный AdBlock отработал (из четырёх)

      В NetSurf ещё и тест «Is your browser blocking invisible trackers?»
      В Chromium четыре теста провалились (но там даже не установлен и AdBloks)


    1. Randl
      06.11.2016 13:40

      Java уже выпилена в 52


  1. Barafu
    05.11.2016 09:19
    +3

    Это бред какой-то. Ну оставили бы 2 значения "экономить надо" и "экономить ненадо" — даже не показывает, а есть ли вообще батарея. И всё работает.
    Нет, вместо этого им надо вырезать API целиком (а кто из сайтов не обновится — вообще работать не будет что ли?). Кто обновится — тот, понятно, будет жать на всю, а не в эконом-режиме.
    Mozilla как она есть — так о нас заботится, что не знаешь, куда спрятаться. Думаю, этот экстремизм не в последнюю очередь обеспечил победу Хрома.


    1. A-Stahl
      05.11.2016 11:27
      +5

      Во-первых хром не победил.
      Во-вторых… блин, какого чёрта браузер вообще что-то знает о батарее? Может ещё и количество свободного места на винтах пусть докладывает? Или рутовый пароль сообщает чтобы сайтам было легче… ну легче чтобы было… сайтам.


      1. Murmurianez
        05.11.2016 13:17
        -1

        Хром не победил? Были времена, хоть и не долго, когда Firefox занимал лидирующие позиции и, насколько я помню, из-за прихода Хрома всё это и обрушилось.

        По-поводу батареи — в статье расписали реальный кейс — соц сети отключают автовоспроизведение и всякие рюшечки. И пусть все сайты так не делают, но когда главные игроки занимаются такой оптимизацией — это даёт результаты для многих пользователей.


        1. A-Stahl
          05.11.2016 13:29
          +4

          >соц сети отключают автовоспроизведение и всякие рюшечки
          Это должно делаться где-то в настройках. Сайта(убрать свистелки) или браузера (бессвистелочный режим).


          1. Murmurianez
            05.11.2016 17:31

            Только для случая «принудительно включить» — не заставляйте пользователя думать — он ждёт готового оптимального решения.


            1. daggert
              05.11.2016 17:57
              +1

              Именно так подумали китайские погромисты и влепили принудительный заход на ru.aliexpress для всех кто на русском айпи…


        1. MnogoBukv
          06.11.2016 00:29

          Кого там хром победил? И чем? Тем что нельзя выбрать никаких настроек при установке? Тем что он свои иконки распихивает во все дыры? Или тем что ему нельзя указать на прокси сервер, кроме как прописав его в интернет експлорере? Кривая поделка.


          1. Murmurianez
            06.11.2016 21:29

            Настройки при установке нужны 0.001% пользователей. А победил он массовостью. Каким бы Firefox или другие браузеры хорошими бы не были — это факт. Мне вот Yandex.Browser больше всего нравится.


            1. MnogoBukv
              08.11.2016 22:32

              Мурашки по спине, когда слова «яндекс» и «браузер» стоят так близко друг к другу. Осталось написать что яндекс выиграл у гугла в поисковом движке, и можно занавес опускать.


              1. Murmurianez
                08.11.2016 22:53

                А Вы пробовали? Он очень хорошо проработан по юзабилити.


                1. MnogoBukv
                  08.11.2016 23:34
                  +1

                  Скачал 500кб, запустил, не пашет, но хоть дал нормальную ссылку на полный инсталлер, скачал ещё 60 метров, установил (кстати, когда снимаешь галочки «сделать по умолчанию» он пытается достучаться до некоего clck.yandex.ru, не может, и подвисает секунд на 5), в общем, запустил, та же самая проблема, что и с хромом. Он не видит инета, т.к. некуда прокси прописать. Придётся сносить.


                  1. MnogoBukv
                    08.11.2016 23:40
                    +1

                    Госпаде, он ещё и иконку в квикланч налепил через отдельную программу «yandex taskbar button», которую надо отдельно сносить. О чём мы говорим вообще?


    1. Shatun
      05.11.2016 13:17

      Mozilla как она есть — так о нас заботится, что не знаешь, куда спрятаться. Думаю, этот экстремизм не в последнюю очередь обеспечил победу Хрома.


      Противопаставлять «экстремиму фаерфокса» хром, который со своей «заботой» отключил не так давно NPAPI котрое существовало лет до 20 хрома, было во всех браузерах и через которое работало огромная куча дполнений?


  1. RybinDen
    05.11.2016 13:17
    +2

    Сделали бы чтобы в приватном режиме отключалось, а в обычном работало. Решили просто удалить проблему, а не решать ее.


  1. FAN2tom
    05.11.2016 13:17
    -3

    Решение есть! Садится батарея — пользуйся Opera и Google Chrome, не садится — Firefox. Так убиваются 2 зайца сразу — решается проблема с прожорливостью сайтов и повышается анонимность.


  1. zooks
    05.11.2016 14:39

    Сомневаюсь, что данная функция была полезна. Существуют популярные сайты, которые своими скриптами вызывают зависание даже на ПК, чего уж говорить про оптимизацию для меньшего разсхода батареи.


  1. Mercury13
    06.11.2016 10:29

    Оставьте в плагинах!


  1. tundrawolf_kiba
    09.11.2016 16:33

    Кстати, вчера в блоге Яндекс.Браузера тоже подсуетились, и напомнили, что у них эту опцию сделали отключаемой и по-умолчанию отключенной(видимо в одном из последних обновлений, т.к. раньше этого переключателя не видел).