Title: [140575] trunk/Source/WebCore
Revision
140575
Author
tse...@chromium.org
Date
2013-01-23 12:51:48 -0800 (Wed, 23 Jan 2013)

Log Message

[chromium] harden ScriptWrappable::m_wrapper against tampering
https://bugs.webkit.org/show_bug.cgi?id=107318

Reviewed by Adam Barth.

Patch is correct if existing tests past without crashing.

* bindings/v8/ScriptWrappable.h:
(WebCore::ScriptWrappable::ScriptWrappable):
(WebCore::ScriptWrappable::wrapper):
(WebCore::ScriptWrappable::setWrapper):
(WebCore::ScriptWrappable::clearWrapper):
(WebCore::ScriptWrappable::disposeWrapper):
(WebCore::ScriptWrappable::reportMemoryUsage):
(ScriptWrappable):
(WebCore::ScriptWrappable::maskOrUnmaskPointer):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (140574 => 140575)


--- trunk/Source/WebCore/ChangeLog	2013-01-23 20:42:41 UTC (rev 140574)
+++ trunk/Source/WebCore/ChangeLog	2013-01-23 20:51:48 UTC (rev 140575)
@@ -1,3 +1,22 @@
+2013-01-23  Tom Sepez  <tse...@chromium.org>
+
+        [chromium] harden ScriptWrappable::m_wrapper against tampering
+        https://bugs.webkit.org/show_bug.cgi?id=107318
+
+        Reviewed by Adam Barth.
+
+        Patch is correct if existing tests past without crashing.
+
+        * bindings/v8/ScriptWrappable.h:
+        (WebCore::ScriptWrappable::ScriptWrappable):
+        (WebCore::ScriptWrappable::wrapper):
+        (WebCore::ScriptWrappable::setWrapper):
+        (WebCore::ScriptWrappable::clearWrapper):
+        (WebCore::ScriptWrappable::disposeWrapper):
+        (WebCore::ScriptWrappable::reportMemoryUsage):
+        (ScriptWrappable):
+        (WebCore::ScriptWrappable::maskOrUnmaskPointer):
+
 2013-01-22  Roger Fong  <roger_f...@apple.com>
 
         WebCore property sheets, modified build scripts, and project files for compiling in VS2010.

Modified: trunk/Source/WebCore/bindings/v8/ScriptWrappable.h (140574 => 140575)


--- trunk/Source/WebCore/bindings/v8/ScriptWrappable.h	2013-01-23 20:42:41 UTC (rev 140574)
+++ trunk/Source/WebCore/bindings/v8/ScriptWrappable.h	2013-01-23 20:51:48 UTC (rev 140575)
@@ -38,42 +38,47 @@
 
 class ScriptWrappable {
 public:
-    ScriptWrappable()
-    {
-    }
+    ScriptWrappable() { }
 
     v8::Persistent<v8::Object> wrapper() const
     {
-        return m_wrapper;
+        return v8::Persistent<v8::Object>(maskOrUnmaskPointer(*m_maskedWrapper));
     }
 
     void setWrapper(v8::Persistent<v8::Object> wrapper)
     {
-        ASSERT(!wrapper.IsEmpty());
-        m_wrapper = wrapper;
+        m_maskedWrapper = maskOrUnmaskPointer(*wrapper);
     }
 
     void clearWrapper()
     {
-        ASSERT(!m_wrapper.IsEmpty());
-        m_wrapper.Clear();
+        ASSERT(!m_maskedWrapper.IsEmpty());
+        m_maskedWrapper.Clear();
     }
 
     void disposeWrapper()
     {
-        ASSERT(!m_wrapper.IsEmpty());
-        m_wrapper.Dispose();
-        m_wrapper.Clear();
+        ASSERT(!m_maskedWrapper.IsEmpty());
+        m_maskedWrapper = wrapper();
+        m_maskedWrapper.Dispose();
+        m_maskedWrapper.Clear();
     }
 
     void reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const
     {
         MemoryClassInfo info(memoryObjectInfo, this, WebCoreMemoryTypes::DOM);
-        info.ignoreMember(m_wrapper);
+        info.ignoreMember(m_maskedWrapper);
     }
 
 private:
-    v8::Persistent<v8::Object> m_wrapper;
+    v8::Persistent<v8::Object> m_maskedWrapper;
+
+    static inline v8::Object* maskOrUnmaskPointer(const v8::Object* object)
+    {
+        const uintptr_t objectPointer = reinterpret_cast<uintptr_t>(object);
+        const uintptr_t randomMask = ~(reinterpret_cast<uintptr_t>(&WebCoreMemoryTypes::DOM) >> 13); // Entropy via ASLR.
+        return reinterpret_cast<v8::Object*>((objectPointer ^ randomMask) & (!objectPointer - 1)); // Preserve null without branching.
+    }
 };
 
 } // namespace WebCore
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to