DXR is a code search and navigation tool aimed at making sense of large projects. It supports full-text and regex searches as well as structural queries.

Implementation

Mercurial (c68fe15a81fc)

VCS Links

Line Code
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 */