CVE-2026-14382
Overview
Files Changed
src/libANGLE/Buffer.cppsrc/libANGLE/Buffer.hsrc/libANGLE/TransformFeedback.cppsrc/libANGLE/VertexArray.cpp
Patch
From ee21230bc87855404b87b97b738091cd04b0d3f3 Mon Sep 17 00:00:00 2001 From: Geoff Lang <[email protected]> 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 <[email protected]> Commit-Queue: Geoff Lang <[email protected]> --- 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);
Regression Test / PoC
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)
{
Original Bug Report
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