1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
|
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef mozilla_Fuzzyfox_h
#define mozilla_Fuzzyfox_h
#include "nsIObserver.h"
#include "nsIObserverService.h"
#include "nsISupportsPrimitives.h"
#include "nsThreadUtils.h"
#include "mozilla/TimeStamp.h"
/*
* This topic publishes the new canonical time according to Fuzzyfox,
* in microseconds since the epoch. If code needs to know the current time,
* it should listen for this topic and keep track of the 'current' time,
* so as to respect Fuzzyfox and be in sync with the rest of the browser's
* timekeeping.
*/
#define FUZZYFOX_UPDATECLOCK_OBSERVER_TOPIC "fuzzyfox-update-clocks"
/*
* For Fuzzyfox's security guarentees to hold, the browser must not execute
* actions while it should be paused. We currently only pause the main thread,
* so actions that occur on other threads should be queued until the browser
* unpaused (and moreso than unpauses: until it reaches a downtick.)
* This topic indicates when any queued outbound events should be delivered.
* TODO: Bug 1484300 and 1484299 would apply this to other communication
* channels
*/
#define FUZZYFOX_FIREOUTBOUND_OBSERVER_TOPIC "fuzzyfox-fire-outbound"
namespace mozilla {
/*
* Fuzzyfox is an implementation of the Fermata concept presented in
* Trusted Browsers for Uncertain Times.
*
* Web Browsers expose explicit (performance.now()) and implicit
* (WebVTT, Video Frames) timers that, when combined with algorithmic
* improvements such as edge thresholding, produce extremely high
* resolution clocks.
*
* High Resolution clocks can be used to time network accesses, browser
* cache reads, web page rendering, access to the CPU cache, and other
* operations - and the time these operations take to perform can yield
* detailed information about user information we want to keep private.
*
* Fuzzyfox limits the information disclosure by limiting an attacker's
* ability to create a high resolution clock. It does this by introducing
* a concept called 'fuzzy time' that degrades all clocks (explicit and
* implicit). This is done through a combination of holding time constant
* during program execution and pausing program execution.
*
* @InProceedings{KS16,
* author = {David Kohlbrenner and Hovav Shacham},
* title = {Trusted Browsers for Uncertain Times},
* booktitle = {Proceedings of USENIX Security 2016},
* pages = {463-80},
* year = 2016,
* editor = {Thorsten Holz and Stefan Savage},
* month = aug,
* organization = {USENIX}
* }
* https://www.usenix.org/system/files/conference/usenixsecurity16/sec16_paper_kohlbrenner.pdf
*
* Fuzzyfox is an adaptation of
* W.-M. Hu, “Reducing timing channels with fuzzy time,” in
* Proceedings of IEEE Security and Privacy (“Oakland”)
* 1991, T. F. Lunt and J. McLean, Eds. IEEE Computer
* Society, May 1991, pp. 8–20.
*/
class Fuzzyfox final : public Runnable, public nsIObserver {
public:
NS_DECL_ISUPPORTS_INHERITED
NS_DECL_NSIOBSERVER
static void Start();
NS_IMETHOD
Run() override;
private:
Fuzzyfox();
~Fuzzyfox();
uint64_t ActualTime();
uint64_t PickDuration();
void UpdateClocks(uint64_t aNewTime, TimeStamp aNewTimeStamp);
uint64_t FloorToGrain(uint64_t aValue);
TimeStamp FloorToGrain(TimeStamp aValue);
uint64_t CeilToGrain(uint64_t aValue);
TimeStamp CeilToGrain(TimeStamp aValue);
bool mSanityCheck;
uint64_t mStartTime;
uint32_t mDuration;
enum Tick {
eUptick,
eDowntick,
};
Tick mTickType;
nsCOMPtr<nsIObserverService> mObs = nullptr;
nsCOMPtr<nsISupportsPRInt64> mTimeUpdateWrapper = nullptr;
static Atomic<bool, Relaxed> sFuzzyfoxEnabledPrefMapped;
};
} // namespace mozilla
#endif /* mozilla_Fuzzyfox_h */
|