電池の残量はなぜ見えなくなったのか
いま確かめています
| 確かめた式 | 結果 |
|---|---|
| "getBattery" in navigatorいまの窓口。電池の情報を頼むための入り口 | — いま確かめています |
| "battery" in navigator昔の窓口。2015年の研究が調べたころの名前 | — いま確かめています |
| "BatteryManager" in window返ってくる物の設計図。残量や残り時間の入れ物 | — いま確かめています |
いま、あなたのブラウザに窓口があるかを確かめます。確かめるのはこの機器の中だけで、どこにも送りません。
この欄がしているのは、名前があるかどうかを聞くことだけです。 電池の情報を頼む getBattery() は一度も呼んでいないので、残量も、充電中かどうかも、このページは読み取っていません。 お使いのブラウザの名前を見なくても、窓口があるかは直接聞けば分かります。
よくある質問
ブラウザで電池の残量を見ることはできますか?
多くの人はできません。Safari は macOS でも iPhone でも一度も実装しておらず、Firefox は43で入れたものを52で消しました。いま残っているのは Chrome と、Edge や Opera のような同じ土台のブラウザだけです。ですから「残量を%で出します」という道具は、読者の半分くらいには「対応していません」としか出ません。このページが残量を出す道具になっていないのは、そのためです。
なぜ電池の残量が「指紋」になるのですか?
残量が0.00から1.00までの細かい数で、しかも少しずつ減っていくからです。2015年の研究は、残量と残り時間の組み合わせがおよそ359万通りあり、その組み合わせがおよそ30秒のあいだ変わらないと数えました。つまり短いあいだ、その値はあなたの機器だけの番号のようにはたらきます。名前も住所も要らず、別々のサイトに置かれた同じスクリプトが、同じ人だと見分けられてしまいます。
Cookie を消せば関係なくなりますか?
短い時間のあいだは関係なくなりません。Cookie を消しても、プライベートな表示に切り替えても、電池の残量はそのままだからです。2015年の研究も2016年の調査も、この点をはっきり書いています。消したはずの目印を、電池の値から結び直せてしまう、というのがこの機能でいちばん危ないところでした。
Safari はこれから対応しますか?
分かりません。WebKit は「指紋やセキュリティなどの懸念から、いまのところ実装しないと決めた機能」の例としてこの API を挙げ、「その懸念を解く道筋がまだ見えていない」と書いています。将来を約束も否定もしていないので、このページでもそれ以上のことは書きません。
Chrome では今も使えるのですか?
使えます。Chrome は38から入れていて、いまも残しています。ただし仕様では、この窓口は安全な文脈、つまり暗号化された通信のページでだけ使えることになっています。同じ機能について、ブラウザによって「ある」「消した」「はじめから置かない」と判断が割れたまま10年たっている、という珍しい例です。
このページは私の電池の情報を読み取っていますか?
読み取っていません。上の欄がしているのは、窓口の名前があるかどうかを聞くことだけです。電池の情報を頼む getBattery() は一度も呼んでいないので、残量も、充電中かどうかも、残り時間も、このページは知りません。お使いのブラウザの名前も見ていません。
ウェブページが電池の残量を読み取れた時期がありました。 いまは多くのブラウザで読み取れません。 消えたのは、便利さより危なさが勝ったからです。 このページは残量を出しません。 あなたのブラウザに窓口があるかどうかだけを確かめます。
「無い」のが普通です。壊れているわけではありません
上の欄で「ありません」と出た人が多いはずです。 それが普通の状態で、 設定を直せば出てくるというものでもありません。あなたのブラウザを作っている人たちが、置かないと決めたのです。
| ブラウザ | いま | 経緯 |
|---|---|---|
| Chrome入った版 38 | ✓ つかえる | 2014年に入り、いまも残っている |
| Edge・Opera・Samsung Internet などの Chromium 系入った版 Chrome に追随 | ✓ つかえる | 対応表では Chrome の値をそのまま写す指定になっている |
| Firefox入った版 43/消した版 52 | ✕ 消された | 版はいまの窓口 getBattery のもの。それ以前は別の名前で読めた |
| Safari(macOS)入った版はない | ✕ 一度も無い | WebKit が「実装しないと決めた機能」の一覧に載せている |
| Safari(iPhone・iPad)入った版はない | ✕ 一度も無い | 同じ WebKit なので、こちらも一度も無い |
版の数字はMDN の対応表(browser-compat-data)(新しいタブで開きます)の getBattery の項から取っています。 Chromium 系のブラウザは、この表で「Chrome の値をそのまま写す」と指定されているので、ここでは版を書いていません。確かめていない数字は書かないためです。
Firefox の「43」には、少しだけ注釈が要ります。 この数字はnavigator.getBattery() といういまの形が入った版です。 それより前の Firefox にはnavigator.battery という別の名前の窓口があり、そちらでも同じ情報が読めていました。 実際、後で出てくる 2015年の研究は、脚注で「Firefox は getBattery() を実装しておらず、かわりに navigator.battery を公開している」と書いています。 上の欄が昔の名前も一緒に確かめているのは、これが理由です。
仕様書には「影響はごくわずか」と書いてありました
この機能を決めた文書は、W3C の Battery Status API です。 2014年12月9日の版には、安全とプライバシーについての節に、こう書かれていました。
The information disclosed has minimal impact on privacy or fingerprinting, and therefore is exposed without permission grants.「開示される情報がプライバシーや指紋採取に与える影響はごくわずかである。だから、許可を求めずに公開する」。 つまりページが黙って読めるようにする、と決めた一文です。 カメラやマイクや位置情報のように「許可しますか?」と聞かれることは、ありませんでした。
2015年の研究が、その一文をひっくり返しました
2015年、4人の研究者が「The leaking battery(漏れる電池)」という報告を出します。 書いたのはフランスの INRIA の2人とベルギーの KU Leuven の2人です。要旨にはこうあります。
The capacity of the battery, as well as its level, expose a fingerprintable surface that can be used to track web users in short time intervals.「電池の容量も残量も、指紋として使える面をさらしている。短い時間のあいだ、ウェブの利用者を追いかけるのに使える」。 同じ要旨は「古い電池や使い込んだ電池ほど危ない」とも書いています。 電池は使ううちに容量が減り、その減り方が1台ずつ違うからです。
とくに強かったのが Linux 上の Firefox でした。 研究が観測した残量の値は0.9301929625425652。 小数点以下が16桁もあります。 ほかの環境では0.32 のように2桁だったので、同じ機能でも、環境によって細かさが違っていたわけです。
なぜ残量が「指紋」になるのか
ここがこのページの持ち帰りです。 残量は0.00から1.00までの細かい数で、 放電中は少しずつ減っていきます。 残り時間も一緒に読めます。 だから「いま0.47、あと3時間12分」という組み合わせは、短いあいだ、その機械だけの番号のようにはたらきます。(47パーセント、という意味です。)
研究は、その組み合わせが何通りあるかを数えています。
- 残量は 90通り(0.11から1.00まで。0.10を切ったらたいてい充電器につなぐので、そこは外している)
- 残り時間は およそ39,922通り(観測されたのは355秒から40,277秒まで。5分から11時間11分)
- かけ合わせて 3,592,980通り。 しかもこれは放電中だけの数で、充電中の残り時間まで足せば倍になる
そしてこの値は、およそ30秒のあいだ変わりません。 研究は、電池の状態が変わる間隔を実際に測ってそう書いています。30秒あれば、別々のサイトに置かれた同じスクリプトが「これは同じ機械だ」と見分けるには十分です。
Cookie を消しても、消えません
いちばん怖いのはここです。研究はこう書いています ── 新しい身元でサイトに入り直そうとする人は、プライベートな表示にするか、Cookie などの目印を消す。ところが短い間に入り直すと、サイトは電池の残量と充電・放電の時間から、新しい身元と古い身元を結びつけられる。 消したはずの目印をまた作り直すことまでできてしまいます。
電池は、ブラウザの外にあるものです。Cookie も履歴もブラウザの中にあるので消せますが、電池の減り具合は消せません。 別のブラウザを開いても、同じ電池です。 「便利そうな数字」が、消せない目印になっていたわけです。
ただし、研究はここで言いすぎていません。 残り時間は使い方しだいで すぐ変わるので、長い期間の追跡に使える危険は小さいかもしれない、 と自分で書き添えています。 危ないのは短いあいだ── ちょうど、Cookie を消して入り直すのにかかるくらいの時間です。出どころが断定していないことを、こちらで断定に書き換えないのは このサイトの決まりなので、そのまま書いておきます。
実際に使っているスクリプトが、2つ見つかりました
2016年、プリンストン大学の2人が上位100万サイトを機械で巡回して、 追跡のしかたを片っ端から数えるという調査をしました。 その報告には「Battery API による指紋採取」という節があり、こう書かれています。
We discovered two fingerprinting scripts utilizing the API during our manual analysis of other fingerprinting techniques.「ほかの指紋採取のしかたを手で調べている途中で、この API を使っているスクリプトを2つ見つけた」。 片方は残量を、絵を描かせて作る指紋やその機械が家の中でだけ使っている住所と一緒にまとめていました。 もう片方は充電中かどうか・残量・残り時間の全部を読み出していました。 危ないと言われていたことが、実際に行われていたのです。
同じ報告は、なぜそれが効くのかも1行で書いています ── その読み出しは、利用者が Cookie を消しても、プライベートな表示に切り替えても、別のブラウザを開いて入り直しても、同じ値のままでありうる。
Firefox は「使い道が思いつかない」と言って消しました
2016年10月26日、Mozilla の開発者が公開の場に投げかけます。「この API の使い道は何か。消すか、拡張機能だけに限れないか」。 続けて、 本来の使い道(電池が切れる前に文章を保存する、重い計算を控える)を挙げたうえで、こう書きました。
The real world use cases, however, seem to be fingerprinting users「ところが現実の使われ方は、利用者の指紋採取に見える」。 そして「まっとうな目的でこの API を使っている実在のサイトを、誰か挙げられますか」と問いかけています。
この投稿には、Firefox 49 の集計として2億回を超える呼び出しとページの6パーセントがこの API に触れているという数字も出てきます。 ただし本人が「使い道の少なさに比べて多すぎる。ただ navigator の中身を並べただけでも 数えてしまっているのでは」と但し書きを付けているので、ここでは「多かったらしい」以上には読みません。
結論は速かったです。修正はその月のうちに入り、2017年3月7日の Firefox 52 のリリースノートに、この1行が載りました。
Removed Battery Status API to reduce fingerprinting of users by trackers「追跡者による利用者の指紋採取を減らすため、Battery Status API を削除した」。 あの問いかけから4か月あまりでした。 いちど公開したものを取り下げるのは、足すよりずっと重い決定のはずですが、理由がリリースノートに1行だけ、はっきり書かれています。
Safari は、はじめから置かないと決めていました
Safari の中身である WebKit は、追跡を防ぐための考え方を文章にして公開しています。 そこにはこう書かれています。
Finally, if we find that features and web APIs increase fingerprintability and offer no safe way to protect our users, we will not implement them until we or others have found a good way to reduce that fingerprintability.「機能やウェブ API が指紋の取られやすさを増やし、利用者を守る安全な方法が無いと分かったなら、私たちなり誰かなりがその取られやすさを減らすうまい方法を見つけるまでは、実装しない」。 そしてその例として名指しされている一覧に、Battery Status API が入っています。
つまり Safari で残量が読めないのは、作り忘れでも、遅れているのでもありません。置かないと決めた結果です。一覧に並んでいるのは全部で16件で、ほかにもこんな名前があります。
- Web Bluetooth
- Web MIDI API
- Magnetometer API
- Web NFC API
- Device Memory API
- Network Information API
- Web Bluetooth Scanning
- Ambient Light Sensor
- HDCP Policy Check extension for EME
- Proximity Sensor
- WebHID
- Serial API
- Web USB
- Geolocation Sensor (background geolocation)
- User Idle Detection
近づけると分かるセンサー、明るさのセンサー、方位磁石、電池、通信の速さ ──どれも「あれば便利そう」なものばかりです。 便利そうであることは、入れる理由として足りなかった、ということになります。
まとめ ── 便利そうな機能が消えるまで
この機能が消えるまでにあったことを並べると、ひとつの筋になります。誰かが悪者だった話ではありません。「影響はごくわずか」と本気で書かれ、そのあとで測ってみたら違った、という話です。
| いつ | 何があったか |
|---|---|
| 2014年12月W3C 勧告候補 2014年12月9日版 | W3C の仕様書が「開示される情報はプライバシーや指紋にほとんど影響しない。だから許可を求めずに公開する」と書いていた |
| 2015年6月The leaking battery(ePrint 2015/616) | 4人の研究者が、残量の値そのものが短い時間の目印になることを示した |
| 2016年プリンストン大学の1,000,000サイト調査(ACM CCS 2016) | 100万サイトを機械で回った調査が、実際にこの窓口を使って人を見分けているスクリプトを2つ見つけた |
| 2016年10月26日mozilla.dev.platform の投稿 | Mozilla が公開の場で「この窓口の使い道は何か。消せないか」と問いかけた |
| 2017年3月7日Firefox 52.0 リリースノート | Firefox 52 が「追跡者による指紋を減らすため」に削除した |
| いまW3C Battery Status API(現行) | 仕様書の文言が「高精度な読み出しを公開すべきでない。新しい指紋の材料になるから」に書き換わっている |
いまの仕様書は、2014年の一文を書き直しています ── 「ユーザーエージェントは、電池の状態を高い精度で読み出せるようにすべきではない。それが新しい指紋の手がかりになりうるからである」。 同じ文書の同じ節が、正反対のことを言うようになったわけです。
持ち帰ってほしいのは、「便利そう」と「危なくない」は別のことだ、という一点です。 電池の残量は、誰かの秘密でもなければ、隠したい情報でもありません。 それでも細かい数が少しずつ変わるというだけで、人を見分ける番号になりました。 あなたのブラウザで「ありません」と出たあの1行は、誰かがそれに気づいて、測って、話し合って、消した結果です。
引用と数値の出どころ: 仕様書の2つの文言はW3C Battery Status API(2014年12月9日の勧告候補)(新しいタブで開きます)と現行の Battery Status API(新しいタブで開きます)、指紋の研究はThe leaking battery(Olejnik・Acar・Castelluccia・Diaz、2015年)(新しいタブで開きます)、実際に使っていたスクリプトはOnline Tracking: A 1-million-site Measurement and Analysis(Englehardt・Narayanan、ACM CCS 2016)(新しいタブで開きます)、Firefox が消した経緯はmozilla.dev.platform の投稿(新しいタブで開きます)とFirefox 52.0 のリリースノート(新しいタブで開きます)、実装しない判断はWebKit の Tracking Prevention(新しいタブで開きます)から取っています。 日本語は、原文の意味を変えないように訳したものです。