[tbb-commits] [tor-browser/tor-browser-68.4.1esr-9.5-1] Bug 461204 - Improve the random number generator for the boundaries in multipart/form-data r=smaug

boklm at torproject.org boklm at torproject.org
Thu Jan 23 12:58:50 UTC 2020


commit 3b2165b8be4f7fd7889c17cbb39a4348f7666bc8
Author: Alex Catarineu <acat at torproject.org>
Date:   Mon Jan 13 20:41:14 2020 +0000

    Bug 461204 - Improve the random number generator for the boundaries in multipart/form-data r=smaug
    
    Using a weak RNG for the form boundary allows a website operator to perform several
    attacks on users (as outlined in https://trac.torproject.org/projects/tor/ticket/22919)
    
    These include:
     - Identifying Windows users based on the unseeded RNG
     - Identify the number of form submissions that have occurred cross-origin between same-origin submissions
    
    Additionally, a predictable boundary makes it possible to forge a boundary in the middle
    of a file upload.
    
    Differential Revision: https://phabricator.services.mozilla.com/D56056
    
    --HG--
    extra : moz-landing-system : lando
---
 dom/html/HTMLFormSubmission.cpp | 7 ++++---
 mfbt/RandomNum.cpp              | 8 ++++++++
 mfbt/RandomNum.h                | 6 ++++++
 3 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/dom/html/HTMLFormSubmission.cpp b/dom/html/HTMLFormSubmission.cpp
index baaed020ec3f..384ca3661426 100644
--- a/dom/html/HTMLFormSubmission.cpp
+++ b/dom/html/HTMLFormSubmission.cpp
@@ -37,6 +37,7 @@
 #include "mozilla/dom/Directory.h"
 #include "mozilla/dom/File.h"
 #include "mozilla/StaticPrefs.h"
+#include "mozilla/RandomNum.h"
 
 namespace mozilla {
 namespace dom {
@@ -367,9 +368,9 @@ FSMultipartFormData::FSMultipartFormData(nsIURI* aActionURL,
   mTotalLength = 0;
 
   mBoundary.AssignLiteral("---------------------------");
-  mBoundary.AppendInt(rand());
-  mBoundary.AppendInt(rand());
-  mBoundary.AppendInt(rand());
+  mBoundary.AppendInt(static_cast<uint32_t>(mozilla::RandomUint64OrDie()));
+  mBoundary.AppendInt(static_cast<uint32_t>(mozilla::RandomUint64OrDie()));
+  mBoundary.AppendInt(static_cast<uint32_t>(mozilla::RandomUint64OrDie()));
 }
 
 FSMultipartFormData::~FSMultipartFormData() {
diff --git a/mfbt/RandomNum.cpp b/mfbt/RandomNum.cpp
index 69f19e9d01fa..c3bb9ecef444 100644
--- a/mfbt/RandomNum.cpp
+++ b/mfbt/RandomNum.cpp
@@ -150,4 +150,12 @@ MFBT_API Maybe<uint64_t> RandomUint64() {
 #endif
 }
 
+MFBT_API uint64_t RandomUint64OrDie() {
+  Maybe<uint64_t> maybeRandomNum = RandomUint64();
+
+  MOZ_RELEASE_ASSERT(maybeRandomNum.isSome());
+
+  return maybeRandomNum.value();
+}
+
 }  // namespace mozilla
diff --git a/mfbt/RandomNum.h b/mfbt/RandomNum.h
index 5af510d621a6..5d392c9a6819 100644
--- a/mfbt/RandomNum.h
+++ b/mfbt/RandomNum.h
@@ -30,6 +30,12 @@ namespace mozilla {
  */
 MFBT_API Maybe<uint64_t> RandomUint64();
 
+/**
+ *  Like RandomUint64, but always returns a uint64_t or crashes with an assert
+ *  if the underlying RandomUint64 call failed.
+ */
+MFBT_API uint64_t RandomUint64OrDie();
+
 }  // namespace mozilla
 
 #endif  // mozilla_RandomNum_h_



More information about the tbb-commits mailing list