backport_1142331.patch 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
  2. From: Andrey Belenko <[email protected]>
  3. Date: Thu, 10 Dec 2020 18:03:59 +0100
  4. Subject: Chromium backport: crbug.com/1142331
  5. M87-1
  6. Clipboard: Fix UaP in ClipboardWriter/FileReaderLoader
  7. https://chromium-review.googlesource.com/c/chromium/src/+/2536946
  8. CVE-2020-16037
  9. diff --git a/third_party/blink/renderer/modules/clipboard/clipboard_promise.cc b/third_party/blink/renderer/modules/clipboard/clipboard_promise.cc
  10. index 47bd085c92ff97e30b82f48b99bece2d3f8ffbd7..5b9d059291a8c60e33c15f5d981cea06045f4044 100644
  11. --- a/third_party/blink/renderer/modules/clipboard/clipboard_promise.cc
  12. +++ b/third_party/blink/renderer/modules/clipboard/clipboard_promise.cc
  13. @@ -101,7 +101,7 @@ ScriptPromise ClipboardPromise::CreateForWriteText(ExecutionContext* context,
  14. ClipboardPromise::ClipboardPromise(ExecutionContext* context,
  15. ScriptState* script_state)
  16. - : ExecutionContextClient(context),
  17. + : ExecutionContextLifecycleObserver(context),
  18. script_state_(script_state),
  19. script_promise_resolver_(
  20. MakeGarbageCollected<ScriptPromiseResolver>(script_state)),
  21. @@ -396,12 +396,19 @@ scoped_refptr<base::SingleThreadTaskRunner> ClipboardPromise::GetTaskRunner() {
  22. return GetExecutionContext()->GetTaskRunner(TaskType::kUserInteraction);
  23. }
  24. +// ExecutionContextLifecycleObserver implementation.
  25. +void ClipboardPromise::ContextDestroyed() {
  26. + script_promise_resolver_->Reject(MakeGarbageCollected<DOMException>(
  27. + DOMExceptionCode::kNotAllowedError, "Document detached."));
  28. + clipboard_writer_.Clear();
  29. +}
  30. +
  31. void ClipboardPromise::Trace(Visitor* visitor) {
  32. visitor->Trace(script_state_);
  33. visitor->Trace(script_promise_resolver_);
  34. visitor->Trace(clipboard_writer_);
  35. visitor->Trace(clipboard_item_data_);
  36. - ExecutionContextClient::Trace(visitor);
  37. + ExecutionContextLifecycleObserver::Trace(visitor);
  38. }
  39. } // namespace blink
  40. diff --git a/third_party/blink/renderer/modules/clipboard/clipboard_promise.h b/third_party/blink/renderer/modules/clipboard/clipboard_promise.h
  41. index c2c7286149238db914087af743cc4c0042da95ba..65f4797b2e3eb45dd4c6f1ba8fda608d1488edef 100644
  42. --- a/third_party/blink/renderer/modules/clipboard/clipboard_promise.h
  43. +++ b/third_party/blink/renderer/modules/clipboard/clipboard_promise.h
  44. @@ -24,7 +24,7 @@ class LocalFrame;
  45. class ExecutionContext;
  46. class ClipboardPromise final : public GarbageCollected<ClipboardPromise>,
  47. - public ExecutionContextClient {
  48. + public ExecutionContextLifecycleObserver {
  49. USING_GARBAGE_COLLECTED_MIXIN(ClipboardPromise);
  50. public:
  51. @@ -74,6 +74,9 @@ class ClipboardPromise final : public GarbageCollected<ClipboardPromise>,
  52. LocalFrame* GetLocalFrame() const;
  53. scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner();
  54. + // ExecutionContextLifecycleObserver
  55. + void ContextDestroyed() override;
  56. +
  57. Member<ScriptState> script_state_;
  58. Member<ScriptPromiseResolver> script_promise_resolver_;
  59. diff --git a/third_party/blink/renderer/modules/clipboard/clipboard_writer.cc b/third_party/blink/renderer/modules/clipboard/clipboard_writer.cc
  60. index 625934d39c613f2fce0f6a55b15f8e4a8ca604b6..7ae1f48e9dd9dac609b263462eeb15d30452ac2b 100644
  61. --- a/third_party/blink/renderer/modules/clipboard/clipboard_writer.cc
  62. +++ b/third_party/blink/renderer/modules/clipboard/clipboard_writer.cc
  63. @@ -181,9 +181,12 @@ ClipboardWriter::ClipboardWriter(SystemClipboard* system_clipboard,
  64. file_reading_task_runner_(promise->GetExecutionContext()->GetTaskRunner(
  65. TaskType::kFileReading)),
  66. system_clipboard_(system_clipboard),
  67. - raw_system_clipboard_(raw_system_clipboard) {}
  68. + raw_system_clipboard_(raw_system_clipboard),
  69. + self_keep_alive_(PERSISTENT_FROM_HERE, this) {}
  70. -ClipboardWriter::~ClipboardWriter() = default;
  71. +ClipboardWriter::~ClipboardWriter() {
  72. + DCHECK(!file_reader_);
  73. +}
  74. // static
  75. bool ClipboardWriter::IsValidType(const String& type) {
  76. @@ -209,7 +212,9 @@ void ClipboardWriter::DidFinishLoading() {
  77. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  78. DOMArrayBuffer* array_buffer = file_reader_->ArrayBufferResult();
  79. DCHECK(array_buffer);
  80. +
  81. file_reader_.reset();
  82. + self_keep_alive_.Clear();
  83. worker_pool::PostTask(
  84. FROM_HERE, CrossThreadBindOnce(&ClipboardWriter::DecodeOnBackgroundThread,
  85. @@ -219,6 +224,8 @@ void ClipboardWriter::DidFinishLoading() {
  86. }
  87. void ClipboardWriter::DidFail(FileErrorCode error_code) {
  88. + file_reader_.reset();
  89. + self_keep_alive_.Clear();
  90. promise_->RejectFromReadOrDecodeFailure();
  91. }
  92. diff --git a/third_party/blink/renderer/modules/clipboard/clipboard_writer.h b/third_party/blink/renderer/modules/clipboard/clipboard_writer.h
  93. index 45eb4bd91c0b7db4fc3648518e62f4071945a9e7..5241032714512405aaa0135ffa081ea4fa702851 100644
  94. --- a/third_party/blink/renderer/modules/clipboard/clipboard_writer.h
  95. +++ b/third_party/blink/renderer/modules/clipboard/clipboard_writer.h
  96. @@ -10,6 +10,7 @@
  97. #include "third_party/blink/renderer/core/fileapi/blob.h"
  98. #include "third_party/blink/renderer/core/fileapi/file_reader_loader_client.h"
  99. #include "third_party/blink/renderer/platform/heap/heap.h"
  100. +#include "third_party/blink/renderer/platform/heap/self_keep_alive.h"
  101. #include "third_party/skia/include/core/SkImage.h"
  102. namespace blink {
  103. @@ -27,6 +28,11 @@ class RawSystemClipboard;
  104. // (2) Decoding the blob's contents to avoid RCE in native applications that may
  105. // take advantage of vulnerabilities in their decoders.
  106. // (3) Writing the blob's decoded contents to the system clipboard.
  107. +//
  108. +// ClipboardWriter is owned only by itself and ClipboardPromise. It keeps
  109. +// itself alive for the duration of FileReaderLoader's async operations using
  110. +// SelfKeepAlive, and keeps itself alive afterwards during cross-thread
  111. +// operations by using WrapCrossThreadPersistent.
  112. class ClipboardWriter : public GarbageCollected<ClipboardWriter>,
  113. public FileReaderLoaderClient {
  114. public:
  115. @@ -80,6 +86,10 @@ class ClipboardWriter : public GarbageCollected<ClipboardWriter>,
  116. Member<SystemClipboard> system_clipboard_;
  117. // Access to the global unsanitized system clipboard.
  118. Member<RawSystemClipboard> raw_system_clipboard_;
  119. +
  120. + // Oilpan: ClipboardWriter must remain alive until Member<T>::Clear() is
  121. + // called, to keep the FileReaderLoader alive and avoid unexpected UaPs.
  122. + SelfKeepAlive<ClipboardWriter> self_keep_alive_;
  123. };
  124. } // namespace blink