Overview

High
Severity
CVSS
No
Exploited ITW
Fixed
Fix Status
ImpactInsufficient validation of untrusted input in ANGLE
DescriptionInsufficient validation of untrusted input in ANGLE
ComponentANGLE
Bug ClassLogic Error
Tracker492218546
Fix commitee21230bc878 (angle/angle) +169/-53
CISA KEVNot listed
Creditedanonymous
Disclosed2026-06-30

Files Changed

  • src/libANGLE/Buffer.cpp
  • src/libANGLE/Buffer.h
  • src/libANGLE/TransformFeedback.cpp
  • src/libANGLE/VertexArray.cpp
From ee21230bc87855404b87b97b738091cd04b0d3f3 Mon Sep 17 00:00:00 2001
From: Geoff Lang <geofflang@chromium.org>
Date: Wed, 20 May 2026 11:46:30 -0400
Subject: [PATCH] Validate that TF buffers cannot be modified when TF is unbound.

The buffer transform feedback conflict validation would only track
buffers that are bound to the current transform feedback object. Since
it is possible to pause transform feedback and unbind it, the buffers
could be modified when in this state.

Add additional tracking for when the buffer is attached to an active
transform feedback.

Apply this validation to hardened contexts as well as WebGL since it is
undefined behaviour in the GL spec to use a buffer for transform
feedback and other usages simultaneously.

Fixed: chromium:492218546
Fixed: chromium:513925114
Change-Id: I45b99ce847d74946870ba35fc9a17294e3386523
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/7864196
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Commit-Queue: Geoff Lang <geofflang@chromium.org>
---

diff --git a/src/libANGLE/Buffer.cpp b/src/libANGLE/Buffer.cpp
index 5bb8139..8470826 100644
--- a/src/libANGLE/Buffer.cpp
+++ b/src/libANGLE/Buffer.cpp
@@ -85,6 +85,7 @@
       mBindingCount(0),
       mTransformFeedbackIndexedBindingCount(0),
       mTransformFeedbackGenericBindingCount(0),
+      mActiveTransformFeedbackCount(0),
       mImmutable(GL_FALSE),
       mStorageExtUsageFlags(0),
       mExternal(GL_FALSE),
@@ -465,20 +466,28 @@
 void Buffer::onTFBindingChanged(const Context *context, bool bound, bool indexed)
 {
     ASSERT(bound || mState.mBindingCount > 0);
-    mState.mBindingCount += bound ? 1 : -1;
+    const int delta = bound ? 1 : -1;
+    mState.mBindingCount += delta;
     if (indexed)
     {
         ASSERT(bound || mState.mTransformFeedbackIndexedBindingCount > 0);
-        mState.mTransformFeedbackIndexedBindingCount += bound ? 1 : -1;
+        mState.mTransformFeedbackIndexedBindingCount += delta;
 
         onStateChange(context, angle::SubjectMessage::BindingChanged);
     }
     else
     {
-        mState.mTransformFeedbackGenericBindingCount += bound ? 1 : -1;
+        mState.mTransformFeedbackGenericBindingCount += delta;
     }
 }
 
+void Buffer::onTFActiveChanged(const Context *context, bool active)
+{
+    const int delta = active ? 1 : -1;
+    mState.mActiveTransformFeedbackCount += delta;
+    ASSERT(mState.mActiveTransformFeedbackCount >= 0);
+}
+
 angle::Result Buffer::getSubData(const gl::Context *context,
                                  GLintptr offset,
                                  GLsizeiptr size,
@@ -589,4 +598,5 @@
         onStateChange(context, angle::SubjectMessage::SubjectChanged);
     }
 }
+
 }  // namespace gl
diff --git a/src/libANGLE/Buffer.h b/src/libANGLE/Buffer.h
index 853ec51..057b8d3 100644
--- a/src/libANGLE/Buffer.h
+++ b/src/libANGLE/Buffer.h
@@ -70,7 +70,6 @@
     GLint64 getMapOffset() const { return mMapOffset; }
     GLint64 getMapLength() const { return mMapLength; }
     GLint64 getSize() const { return mSize; }
-    bool isBoundForTransformFeedback() const { return mTransformFeedbackIndexedBindingCount != 0; }
     std::string getLabel() const { return mLabel; }
     WebGLBufferType getWebGLType() const { return mWebGLType; }
 
@@ -90,6 +89,7 @@
     int mBindingCount;
     int mTransformFeedbackIndexedBindingCount;
     int mTransformFeedbackGenericBindingCount;
+    int mActiveTransformFeedbackCount;
     GLboolean mImmutable;
     GLbitfield mStorageExtUsageFlags;
     GLboolean mExternal;
@@ -190,15 +190,8 @@
 
     rx::BufferImpl *getImplementation() const { return mImpl; }
 
-    // Note: we pass "isWebGL" to this function to clarify it's only valid if WebGL is enabled.
-    // We pass the boolean flag instead of the pointer because this header can't read Context.h.
-    ANGLE_INLINE bool hasWebGLXFBBindingConflict(bool isWebGL) const
+    ANGLE_INLINE bool isBoundToTFAndNonTFSimultaneously() const
     {
-        if (!isWebGL)
-        {
-            return false;
-        }
-
         // The transform feedback generic binding point is not an indexed binding point but it also
         // does not count as a non-transform-feedback use of the buffer, so we subtract it from the
         // binding count when checking if the buffer is bound to a non-transform-feedback location.
@@ -208,8 +201,21 @@
                    mState.mBindingCount - mState.mTransformFeedbackGenericBindingCount;
     }
 
+    // If this buffer is bound as a transform feedback output, even if that transform feedback is
+    // paused and not the current transform feedback.
+    ANGLE_INLINE bool isBoundToActiveTransformFeedback() const
+    {
+        return mState.mActiveTransformFeedbackCount > 0;
+    }
+
+    ANGLE_INLINE bool hasTFBBindingConflict() const
+    {
+        return isBoundToTFAndNonTFSimultaneously() || isBoundToActiveTransformFeedback();
+    }
+
     bool isDoubleBoundForTransformFeedback() const;
     void onTFBindingChanged(const Context *context, bool bound, bool indexed);
+    void onTFActiveChanged(const Context *context, bool active);
     void onNonTFBindingChanged(int incr) { mState.mBindingCount += incr; }
     angle::Result getSubData(const gl::Context *context,
                              GLintptr offset,
diff --git a/src/libANGLE/TransformFeedback.cpp b/src/libANGLE/TransformFeedback.cpp
index 8075e2f..136bdf5 100644
--- a/src/libANGLE/TransformFeedback.cpp
+++ b/src/libANGLE/TransformFeedback.cpp
@@ -157,6 +157,14 @@
     bindProgramPipeline(context, programPipeline);
     bindPPOPrograms(programPipeline);
 
+    for (auto &buffer : mState.mIndexedBuffers)
+    {
+        if (buffer.get())
+        {
+            buffer->onTFActiveChanged(context, true);
+        }
+    }
+
     return angle::Result::Continue;
 }
 
@@ -182,6 +190,13 @@
     {
         mState.mPPOPrograms[shaderType].value = 0;
     }
+    for (auto &buffer : mState.mIndexedBuffers)
+    {
+        if (buffer.get())
+        {
+            buffer->onTFActiveChanged(context, false);
+        }
+    }
     return angle::Result::Continue;
 }
 
@@ -402,7 +417,7 @@
 {
     for (auto &buffer : mState.mIndexedBuffers)
     {
-        if (buffer.get() && buffer->hasWebGLXFBBindingConflict(true))
+        if (buffer.get() && buffer->isBoundToTFAndNonTFSimultaneously())
         {
             return true;
         }
diff --git a/src/libANGLE/VertexArray.cpp b/src/libANGLE/VertexArray.cpp
index bc17874..fcc2d72 100644
--- a/src/libANGLE/VertexArray.cpp
+++ b/src/libANGLE/VertexArray.cpp
@@ -520,10 +520,10 @@
             boundBuffer->addRef();
             boundBuffer->onNonTFBindingChanged(1);
             boundBuffer->addVertexArrayBinding(context, bindingIndex);
-            if (context->isWebGL())
+            if (context->isWebGL() || context->isHardenedContext())
             {
                 mCachedBufferPropertyTransformFeedbackConflict.set(
-                    bindingIndex, boundBuffer->hasWebGLXFBBindingConflict(true));
+                    bindingIndex, boundBuffer->hasTFBBindingConflict());
             }
             mBufferBindingMask.set(bindingIndex);
             mState.mClientMemoryAttribsMask &= ~binding->getBoundAttributesMask();
@@ -531,10 +531,7 @@
         }
         else
         {
-            if (context->isWebGL())
-            {
-                mCachedBufferPropertyTransformFeedbackConflict.set(bindingIndex, false);
Loading diff…

Regression Test / PoC

shipped with the fix
diff --git a/src/tests/gl_tests/TransformFeedbackTest.cpp b/src/tests/gl_tests/TransformFeedbackTest.cpp
index 0ab7588..4b4e1ca 100644
--- a/src/tests/gl_tests/TransformFeedbackTest.cpp
+++ b/src/tests/gl_tests/TransformFeedbackTest.cpp
@@ -5002,19 +5002,6 @@
     glDrawArrays(GL_POINTS, 0, verticesToDraw);
     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
     glEndTransformFeedback();
-
-    // Set up the buffer to be the right size but make it smaller after glBeginTransformFeedback
-    glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, bytesNeeded, &tfData, GL_STATIC_DRAW);
-    glBeginTransformFeedback(GL_POINTS);
-    glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, bytesNeeded - 1, &tfData, GL_STATIC_DRAW);
-    EXPECT_GL_ERROR(GL_INVALID_OPERATION);
-    glPauseTransformFeedback();
-    glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, bytesNeeded - 1, &tfData, GL_STATIC_DRAW);
-    EXPECT_GL_NO_ERROR();
-    glResumeTransformFeedback();
-    glDrawArrays(GL_POINTS, 0, verticesToDraw);
-    EXPECT_GL_ERROR(GL_INVALID_OPERATION);
-    glEndTransformFeedback();
 }
 
 // Test validation of buffer bounds checking for transform feedback with multidraw commands
@@ -5074,6 +5061,59 @@
     glEndTransformFeedback();
 }
 
+// Changing the buffer storage while transform feedback is active (but paused) is undefined
+// behaviour. Make sure it generates an error for WebGL.
+TEST_P(WebGLTransformFeedbackTest, ChangeBufferWhilePaused)
+{
+    std::vector<std::string> tfVaryings;
+    tfVaryings.push_back("gl_Position");
+    compileDefaultProgram(tfVaryings, GL_INTERLEAVED_ATTRIBS);
+    GLint positionLocation = glGetAttribLocation(mProgram, essl1_shaders::PositionAttrib());
+
+    glUseProgram(mProgram);
+
+    const GLfloat vertices[] = {
+        -1.0f, 1.0f, 0.5f, -1.0f, -1.0f, 0.5f, 1.0f, -1.0f, 0.5f,
+        -1.0f, 1.0f, 0.5f, 1.0f,  -1.0f, 0.5f, 1.0f, 1.0f,  0.5f,
+    };
+
+    GLBuffer buffer;
+    glBindBuffer(GL_ARRAY_BUFFER, buffer);
+    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
+    glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
+    glEnableVertexAttribArray(positionLocation);
+
+    const GLsizei verticesToDraw = 3;
+    const size_t stride          = sizeof(float) * 4;
+    const GLsizei drawcount      = 2;
+    const size_t bytesNeeded     = stride * verticesToDraw * drawcount;
+
+    glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, mTransformFeedbackBuffer);
+    uint8_t tfData[bytesNeeded] = {0};
+    glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, bytesNeeded, &tfData, GL_STATIC_DRAW);
+
+    glBeginTransformFeedback(GL_POINTS);
+    glDrawArrays(GL_POINTS, 0, verticesToDraw);
+    EXPECT_GL_NO_ERROR();
+
+    glPauseTransformFeedback();
+    EXPECT_GL_NO_ERROR();
+
+    // Try modifying the buffer while it's a transform feedback output
+    glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, bytesNeeded, &tfData, GL_STATIC_DRAW);
+    EXPECT_GL_ERROR(GL_INVALID_OPERATION);
+
+    glBufferSubData(GL_TRANSFORM_FEEDBACK_BUFFER, 0, bytesNeeded, &tfData);
+    EXPECT_GL_ERROR(GL_INVALID_OPERATION);
+
+    glResumeTransformFeedback();
+    glDrawArrays(GL_POINTS, 0, verticesToDraw);
+    EXPECT_GL_NO_ERROR();
+
+    glEndTransformFeedback();
+    EXPECT_GL_NO_ERROR();
+}
+
 // Test validation of buffer bounds checking for transform feedback with multidraw instanced
 // commands
 TEST_P(WebGLTransformFeedbackTest, TooSmallBuffersMultiDrawInstanced)
diff --git a/src/tests/gl_tests/WebGLCompatibilityTest.cpp b/src/tests/gl_tests/WebGLCompatibilityTest.cpp
index 653e8ea..1d89a15 100644
--- a/src/tests/gl_tests/WebGLCompatibilityTest.cpp
+++ b/src/tests/gl_tests/WebGLCompatibilityTest.cpp
@@ -6249,6 +6249,49 @@
     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
 }
 
+// Modifying a buffer that is part of an active transform feedback object (even when that transform
+// feedback is paused and not current) is invalid.
+TEST_P(WebGL2CompatibilityTest, TransformFeedbackBufferModificationWhileNotCurrent)
+{
+    constexpr char kVS[] = R"(attribute float a; varying float b; void main() { b = a; })";
+    constexpr char kFS[] = R"(void main(){})";
+    ANGLE_GL_PROGRAM(program, kVS, kFS);
+    static const char *varyings[] = {"b"};
+    glTransformFeedbackVaryings(program, 1, varyings, GL_SEPARATE_ATTRIBS);
+    glLinkProgram(program);
+    glUseProgram(program);
+    ASSERT_GL_NO_ERROR();
+
+    // Bind the transform feedback varyings to non-overlapping regions of the same buffer.
+    GLTransformFeedback tf1;
+    glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tf1);
+
+    GLBuffer buffer;
+    glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buffer, 0, 4);
+    glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 8, nullptr, GL_STATIC_DRAW);
+    glBeginTransformFeedback(GL_POINTS);
+    ASSERT_GL_NO_ERROR();
+
+    glPauseTransformFeedback();
+
+    GLTransformFeedback tf2;
+    glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tf2);
+    ASSERT_GL_NO_ERROR();
+
+    glBindBuffer(GL_ARRAY_BUFFER, buffer);
+    ASSERT_GL_NO_ERROR();
+
+    glBufferData(GL_ARRAY_BUFFER, 8, nullptr, GL_STATIC_DRAW);
+    EXPECT_GL_ERROR(GL_INVALID_OPERATION);
+
+    constexpr uint8_t data[8] = {0};
+    glBufferSubData(GL_ARRAY_BUFFER, 0, 8, data);
+    EXPECT_GL_ERROR(GL_INVALID_OPERATION);
+
+    glMapBufferRange(GL_ARRAY_BUFFER, 0, 8, GL_MAP_READ_BIT);
+    EXPECT_GL_ERROR(GL_INVALID_OPERATION);
+}
+
 // Check the return type of a given parameter upon getting the active uniforms.
 TEST_P(WebGL2CompatibilityTest, UniformVariablesReturnTypes)
 {
Loading diff…

Original Bug Report

reported by ha...@gmail.com

Wild vulnerability CVE-2025-6558 Bypass

Security Bug

Important: Please do not change the component of this bug manually.

Please READ THIS FAQ before filing a bug: https://chromium.googlesource.com/chromium/src/+/HEAD/docs/security/faq.md

Please see the following link for instructions on filing security bugs: https://www.chromium.org/Home/chromium-security/reporting-security-bugs

Reports may be eligible for reward payments under the Chrome VRP: https://g.co/chrome/vrp

NOTE: Security bugs are normally made public once a fix has been widely deployed.


VULNERABILITY DETAILS

This vulnerability is at https://issues.chromium.org/issues/427162086. The patch doesn’t seem to have fixed it properly; it can be bypassed. My guess is that the patch that fixes PauseTransformFeedback, ResumeTransformFeedback, and bypasses geoff is likely related to this vulnerability.

PoC reproduce environment

chrome stable 146.0.7680.115

Android 16pixel 9 pro XL build/CP1A.260305.018

trigger from pixel 9 use mali.html

03-13 13:03:10.355 28101 28101 F DEBUG   : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
03-13 13:03:10.355 28101 28101 F DEBUG   : Build fingerprint: 'google/komodo/komodo:16/CP1A.260305.018/14887507:user/release-keys'
03-13 13:03:10.355 28101 28101 F DEBUG   : Kernel Release: '6.1.145-android14-11-gfa1d6308d1fe-ab14691759'
03-13 13:03:10.355 28101 28101 F DEBUG   : Revision: 'MP1.0'
03-13 13:03:10.355 28101 28101 F DEBUG   : ABI: 'arm64'
03-13 13:03:10.355 28101 28101 F DEBUG   : Timestamp: 2026-03-13 13:03:10.216034468+0800
03-13 13:03:10.355 28101 28101 F DEBUG   : Process uptime: 11s
03-13 13:03:10.355 28101 28101 F DEBUG   : Executable: /system/bin/app_process64
03-13 13:03:10.355 28101 28101 F DEBUG   : Cmdline: com.android.chrome:privileged_process0
03-13 13:03:10.355 28101 28101 F DEBUG   : pid: 27923, tid: 27939, name: CrGpuMain  >>> com.android.chrome:privileged_process0 <<<
03-13 13:03:10.355 28101 28101 F DEBUG   : uid: 10217
03-13 13:03:10.355 28101 28101 F DEBUG   : tagged_addr_ctrl: 000000000007fff1 (PR_TAGGED_ADDR_ENABLE, mask 0xfffe)
03-13 13:03:10.355 28101 28101 F DEBUG   : pac_enabled_keys: 000000000000000f (PR_PAC_APIAKEY, PR_PAC_APIBKEY, PR_PAC_APDAKEY, PR_PAC_APDBKEY)
03-13 13:03:10.355 28101 28101 F DEBUG   : esr: 000000008a000000 (PC Alignment Exception 0x22)
03-13 13:03:10.355 28101 28101 F DEBUG   : signal 7 (SIGBUS), code 1 (BUS_ADRALN), fault addr 0x002e00640069006f (read)
03-13 13:03:10.355 28101 28101 F DEBUG   :     x0  00000073cf2894f0  x1  0000000000000000  x2  0000000000000000  x3  0b0000738f4234a8
03-13 13:03:10.355 28101 28101 F DEBUG   :     x4  000000760ee6b050  x5  0000000000000001  x6  0000000000000000  x7  00000072d0a704cc
03-13 13:03:10.355 28101 28101 F DEBUG   :     x8  0000000000000000  x9  0000000000000001  x10 0000000000000000  x11 0000000000000002
03-13 13:03:10.355 28101 28101 F DEBUG   :     x12 0040000000000000  x13 0000000000000001  x14 00000000ffffffff  x15 0000000000000000
03-13 13:03:10.355 28101 28101 F DEBUG   :     x16 002e00640069006f  x17 0000007644a9e360  x18 00000072cf1c8000  x19 00000072c93a5200
03-13 13:03:10.355 28101 28101 F DEBUG   :     x20 000000760ee6b050  x21 00000072c93bd7d0  x22 00000072c93bd8f8  x23 000000760ee6b068
03-13 13:03:10.355 28101 28101 F DEBUG   :     x24 0000000000000000  x25 0000000000000001  x26 000000760ee6b070  x27 0000000000000010
03-13 13:03:10.355 28101 28101 F DEBUG   :     x28 0000000000000008  x29 0000000000000001
03-13 13:03:10.355 28101 28101 F DEBUG   :     lr  000000731dc7dc08  sp  00000072d0a703e0  pc  002e00640069006f  pst 0000000060001400
03-13 13:03:10.355 28101 28101 F DEBUG   :     esr 000000008a000000  vg  0000000000000002
03-13 13:03:10.355 28101 28101 F DEBUG   : 31 total frames
03-13 13:03:10.355 28101 28101 F DEBUG   : backtrace:
03-13 13:03:10.355 28101 28101 F DEBUG   :       #00 pc 000000640069006f  <unknown>
03-13 13:03:10.355 28101 28101 F DEBUG   :       #01 pc 0000000000a08c04  /vendor/lib64/egl/libGLES_mali.so (gles_drawp_handle_dependencies(gles_context*, gles_draw_call*, glescore_submission*)+308) (BuildId: 7881438741eeeb5f10dc4d10ccb2f1f88d94c26d)
03-13 13:03:10.355 28101 28101 F DEBUG   :       #02 pc 0000000000a0a678  /vendor/lib64/egl/libGLES_mali.so (gles_drawp_draw_common+1208) (BuildId: 7881438741eeeb5f10dc4d10ccb2f1f88d94c26d)
03-13 13:03:10.355 28101 28101 F DEBUG   :       #03 pc 00000000009a20a4  /vendor/lib64/egl/libGLES_mali.so (glDrawArrays+100) (BuildId: 7881438741eeeb5f10dc4d10ccb2f1f88d94c26d)
03-13 13:03:10.355 28101 28101 F DEBUG   :       #04 pc 0000000008eabd0c  /data/app/~~EkdXpIl488J9cq_XIDSqbQ==/com.google.android.trichromelibrary_768011533-44In0660L55Eqt7SaVvR9w==/base.apk!libmonochrome_64.so (offset 0x930000) (BuildId: 7b80773ca0f2b9243c829f960c001c2e510eea1c)
03-13 13:03:10.355 28101 28101 F DEBUG   :       #05 pc 0000000008ecaf78  /data/app/~~EkdXpIl488J9cq_XIDSqbQ==/com.google.android.trichromelibrary_768011533-44In0660L55Eqt7SaVvR9w==/base.apk!libmonochrome_64.so (offset 0x930000) (BuildId: 7b80773ca0f2b9243c829f960c001c2e510eea1c)
03-13 13:03:10.355 28101 28101 F DEBUG   :       #06 pc 00000000075be358  /data/app/~~EkdXpIl488J9cq_XIDSqbQ==/com.google.android.trichromelibrary_768011533-44In0660L55Eqt7SaVvR9w==/base.apk!libmonochrome_64.so (offset 0x930000) (BuildId: 7b80773ca0f2b9243c829f960c001c2e510eea1c)
03-13 13:03:10.355 28101 28101 F DEBUG   :       #07 pc 00000000075bd864  /data/app/~~EkdXpIl488J9cq_XIDSqbQ==/com.google.android.trichromelibrary_768011533-44In0660L55Eqt7SaVvR9w==/base.apk!libmonochrome_64.so (offset 0x930000) (BuildId: 7b80773ca0f2b9243c829f960c001c2e510eea1c)
03-13 13:03:10.355 28101 28101 F DEBUG   :       #08 pc 00000000075bd590  /data/app/~~EkdXpIl488J9cq_XIDSqbQ==/com.google.android.trichromelibrary_768011533-44In0660L55Eqt7SaVvR9w==/base.apk!libmonochrome_64.so (offset 0x930000) (BuildId: 7b80773ca0f2b9243c829f960c001c2e510eea1c)
03-13 13:03:10.355 28101 28101 F DEBUG   :       #09 pc 00000000075bd438  /data/app/~~EkdXpIl488J9cq_XIDSqbQ==/com.google.android.trichromelibrary_768011533-44In0660L55Eqt7SaVvR9w==/base.apk!libmonochrome_64.so (offset 0x930000) (BuildId: 7b80773ca0f2b9243c829f960c001c2e510eea1c)
03-13 13:03:10.355 28101 28101 F DEBUG   :       #10 pc 00000000075bd3a8  /data/app/~~EkdXpIl488J9cq_XIDSqbQ==/com.google.android.trichromelibrary_768011533-44In0660L55Eqt7SaVvR9w==/base.apk!libmonochrome_64.so (offset 0x930000) (BuildId: 7b80773ca0f2b9243c829f960c001c2e510eea1c)
03-13 13:03:10.355 28101 28101 F DEBUG   :       #11 pc 00000000072bf5a4  /data/app/~~EkdXpIl488J9cq_XIDSqbQ==/com.google.android.trichromelibrary_768011533-44In0660L55Eqt7SaVvR9w==/base.apk!libmonochrome_64.so (offset 0x930000) (BuildId: 7b80773ca0f2b9243c829f960c001c2e510eea1c)
03-13 13:03:10.355 28101 28101 F DEBUG   :       #12 pc 00000000076e38c8  /data/app/~~EkdXpIl488J9cq_XIDSqbQ==/com.google.android.trichromelibrary_768011533-44In0660L55Eqt7SaVvR9w==/base.apk!libmonochrome_64.so (offset 0x930000) (BuildId: 7b80773ca0f2b9243c829f960c001c2e510eea1c)
03-13 13:03:10.355 28101 28101 F DEBUG   :       #13 pc 0000000005c7d130  /data/app/~~EkdXpIl488J9cq_XIDSqbQ==/com.google.android.trichromelibrary_768011533-44In0660L55Eqt7SaVvR9w==/base.apk!libmonochrome_64.so (offset 0x930000) (BuildId: 7b80773ca0f2b9243c829f960c001c2e510eea1c)
03-13 13:03:10.355 28101 28101 F DEBUG   :       #14 pc 0000000005c54730  /data/app/~~EkdXpIl488J9cq_XIDSqbQ==/com.google.android.trichromelibrary_768011533-44In0660L55Eqt7SaVvR9w==/base.apk!libmonochrome_64.so (offset 0x930000) (BuildId: 7b80773ca0f2b9243c829f960c001c2e510eea1c)
03-13 13:03:10.355 28101 28101 F DEBUG   :       #15 pc 0000000005c54298  /data/app/~~EkdXpIl488J9cq_XIDSqbQ==/com.google.android.trichromelibrary_768011533-44In0660L55Eqt7SaVvR9w==/base.apk!libmonochrome_64.so (offset 0x930000) (BuildId: 7b80773ca0f2b9243c829f960c001c2e510eea1c)
03-13 13:03:10.355 28101 28101 F DEBUG   :       #16 pc 00000000075f2148  /data/app/~~EkdXpIl488J9cq_XIDSqbQ==/com.google.android.trichromelibrary_768011533-44In0660L55Eqt7SaVvR9w==/base.apk!libmonochrome_64.so (offset 0x930000) (BuildId: 7b80773ca0f2b9243c829f960c001c2e510eea1c)
03-13 13:03:10.355 28101 28101 F DEBUG   :       #17 pc 0000000005d0e694  /data/app/~~EkdXpIl488J9cq_XIDSqbQ==/com.google.android.trichromelibrary_768011533-44In0660L55Eqt7SaVvR9w==/base.apk!libmonochrome_64.so (offset 0x930000) (BuildId: 7b80773ca0f2b9243c829f960c001c2e510eea1c)
03-13 13:03:10.355 28101 28101 F DEBUG   :       #18 pc 0000000005c2eadc  /data/app/~~EkdXpIl488J9cq_XIDSqbQ==/com.google.android.trichromelibrary_768011533-44In0660L55Eqt7SaVvR9w==/base.apk!libmonochrome_64.so (offset 0x930000) (BuildId: 7b80773ca0f2b9243c829f960c001c2e510eea1c)
03-13 13:03:10.355 28101 28101 F DEBUG   :       #19 pc 0000000005c3d888  /data/app/~~EkdXpIl488J9cq_XIDSqbQ==/com.google.android.trichromelibrary_768011533-44In0660L55Eqt7SaVvR9w==/base.apk!libmonochrome_64.so (offset 0x930000) (BuildId: 7b80773ca0f2b9243c829f960c001c2e510eea1c)
03-13 13:03:10.355 28101 28101 F DEBUG   :       #20 pc 0000000005c3d5f4  /data/app/~~EkdXpIl488J9cq_XIDSqbQ==/com.google.android.trichromelibrary_768011533-44In0660L55Eqt7SaVvR9w==/base.apk!libmonochrome_64.so (offset 0x930000) (BuildId: 7b80773ca0f2b9243c829f960c001c2e510eea1c)
03-13 13:03:10.355 28101 28101 F DEBUG   :       #21 pc 0000000000d54ed0  /data/misc/apexdata/com.android.art/dalvik-cache/arm64/boot.oat (art_jni_trampoline+112)
03-13 13:03:10.355 28101 28101 F DEBUG   :       #22 pc 00000000006683e8  /apex/com.android.art/lib64/libart.so (nterp_helper+152) (BuildId: a1fcb66a9fb3fa9071e8a42dcf9cd5ea)
03-13 13:03:10.355 28101 28101 F DEBUG   :       #23 pc 00000000000dec8c  /data/app/~~rY5l9jUqVFcAUi22_c4ffQ==/com.android.chrome-JS_o-aFnvk0GgsHqVndwdA==/base.apk (offset 0x1fc000) (no3.run+564)
03-13 13:03:10.355 28101 28101 F DEBUG   :       #24 pc 00000000003215f0  /data/misc/apexdata/com.android.art/dalvik-cache/arm64/boot.oat (java.lang.Thread.run+64)
03-13 13:03:10.355 28101 28101 F DEBUG   :       #25 pc 00000000002aaf94  /apex/com.android.art/lib64/libart.so (art_quick_invoke_stub+612) (BuildId: a1fcb66a9fb3fa9071e8a42dcf9cd5ea)
03-13 13:03:10.355 28101 28101 F DEBUG   :       #26 pc 00000000002708ec  /apex/com.android.art/lib64/libart.so (art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*)+220) (BuildId: a1fcb66a9fb3fa9071e8a42dcf9cd5ea)
03-13 13:03:10.355 28101 28101 F DEBUG   :       #27 pc 00000000004bdfe0  /apex/com.android.art/lib64/libart.so (art::Thread::CreateCallback(void*)+1184) (BuildId: a1fcb66a9fb3fa9071e8a42dcf9cd5ea)
03-13 13:03:10.355 28101 28101 F DEBUG   :       #28 pc 00000000004bdb30  /apex/com.android.art/lib64/libart.so (art::Thread::CreateCallbackWithUffdGc(void*)+8) (BuildId: a1fcb66a9fb3fa9071e8a42dcf9cd5ea)
03-13 13:03:10.355 28101 28101 F DEBUG   :       #29 pc 000000000008a714  /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*) (.__uniq.67847048707805468364044055584648682506)+180) (BuildId: 85b03e7fa9ea7fb50d6ced4f441df0ae)
03-13 13:03:10.355 28101 28101 F DEBUG   :       #30 pc 000000000007b3b4  /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+68) (BuildId: 85b03e7fa9ea7fb50d6ced4f441df0ae)

Exploit reproduce environment

1.local test build with mali_exp.ccp

2.adb shell and logcat -s LOG

--------- beginning of main

 LOG     : uid=2000(shell) gid=2000(shell) groups=2000(shell),1004(input),1007(log),1011(adb),1015(sdcard_rw),1028(sdcard_r),1078(ext_data_rw),1079(ext_obb_rw),3001(net_bt_admin),3002(net_bt),3003(inet),3006(net_bw_stats),3009(readproc),3011(uhid),3012(readtracefs) context=u:r:shell:s0

from chromium

chromium version 147.0.7721.0

Oneplus Ace5 coloros 16.0.3

apply code like this https://issues.chromium.org/issues/427162086

build chromium with patch renderer code

run exp_mali.html

adb shell and logcat -s LOG

——— beginning of main

LOG : uid=10396(u0_a396) gid=10396(u0_a396) groups=10396(u0_a396),3002(net_bt),3003(inet),9997(everybody),20396(u0_a396_cache),50396(all_a396) context=u:r:untrusted_app:s0:c140,c257,c512,c768

View on issue tracker