summaryrefslogtreecommitdiffstats
path: root/toolkit/components/fuzzyfox/Fuzzyfox.h
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/fuzzyfox/Fuzzyfox.h')
-rw-r--r--toolkit/components/fuzzyfox/Fuzzyfox.h123
1 files changed, 123 insertions, 0 deletions
diff --git a/toolkit/components/fuzzyfox/Fuzzyfox.h b/toolkit/components/fuzzyfox/Fuzzyfox.h
new file mode 100644
index 0000000000..9c2919e861
--- /dev/null
+++ b/toolkit/components/fuzzyfox/Fuzzyfox.h
@@ -0,0 +1,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 */