[15] ANGLE Metal: zero-init return for functions missing return statements
Severity: Medium | Component: ANGLE MSL translator | e539895
Medium으로 평가된 이유는 commit 메시지에 명시된 대로 garbage memory ... written to the framebuffer 현상이 WebGL2와 readPixels를 통해 임의의 웹 origin에서 도달 가능하기 때문입니다. 다만 이 leak은 수동적 성격으로, 공격자가 내용을 선택하는 것이 아니라 관찰하는 데 그치며, 실제로는 Metal 컴파일러가 return slot에 남기는 내용에 의해 범위가 제한됩니다.
Source/ThirdParty/ANGLE/src/compiler/translator/msl/TranslatorMSL.cpp
+#include "compiler/translator/tree_ops/AddDefaultReturnStatements.h"
...
+ if (!sh::AddDefaultReturnStatements(this, root))
+ return false;
+
if (!WrapMain(*this, idGen, *root))
return false;
Patch Details
AddDefaultReturnStatements tree-op pass는 기존에 HLSL 전용이었으나, 이번 패치로 tree_ops/hlsl/에서 공통 tree_ops/ 폴더로 이동되었습니다. 이후 TranslatorMSL::translateImpl()에서 WrapMain 이전에 첫 번째 변환 단계로 호출됩니다. 두 개의 WebGL2 regression test가 추가되어, GLSL 함수가 명시적 return 없이 끝에 도달하는 경우 vector 및 struct 반환 타입에 대한 zero-init 동작을 검증합니다.
GLSL의 관대한 end-of-function 의미를 MSL의 엄격한 규칙에 맞게 정규화하지 않아, 초기화되지 않은 GPU thread 메모리가 노출되는 backend 고유의 undefined behavior 경로가 남겨진 패턴.
Background
ANGLE는 WebGL의 GLSL ES 소스를 플랫폼 native 셰이딩 언어인 HLSL, MSL, SPIR-V로 변환합니다. GLSL ES는 non-void 함수에서 모든 control-flow 경로에 return이 보장되지 않아도 허용하며, 함수 끝에 도달하더라도 unspecified value를 반환하는 것으로 처리됩니다. 반면 MSL에서는 non-void 함수의 끝에 도달하는 것이 undefined behavior로 취급됩니다. 이 경우 Metal 컴파일러는 return register나 stack slot에 남아 있는 값을 반환하는 코드를 생성할 가능성이 있습니다. AddDefaultReturnStatements는 AST를 순회하면서, 마지막 구문이 return이 아닌 함수 본문에 zero-initialized return을 추가합니다.
Analysis
Fragment shader의 helper function이 no-return 경로를 실행하고, 호출 측이 그 결과를 gl_FragColor에 쓰면, framebuffer 픽셀에는 GPU thread의 잔여 stack/register 내용이 그대로 담기게 됩니다.
Aaaaaaaa Aaa Aaaaa Aaaa Aaaaa Aaaaaa Aa Aaaaaaaaa Aaaaaaaaaaaa Aaa Aaa Aaaaaaaaaa Aaaaaaa Aa Aaaaaaaa Aaaaaaa Aaaaaa Aa Aa Aaaaa Aaaaaaaaa Aa a Aa Aa a Aaaa Aaaaaa Aaaaaaaaaa Aa Aaaaaa Aaaaaaaa Aaaaaaaaa Aaa Aaa Aa Aaaaaa Aaa Aaaaaaaaaaaaaaa Aa Aaaaa Aaaa Aaaaaaaaaaaaaaaa Aaaaaa Aa Aa Aaa Aaaaaaaaaa Aaaa Aaaaaaa Aaaaa Aaaaa Aaaaaa Aaaaa Aa Aa Aaa Aaaaaa
Aaaaaa Aaaaaaaa Aaaaaaaaa Aa Aaa Aaa Aaaaaa Aaaa Aaaaaaaaaa a Aaa Aaaaaa Aaaaaaaaa Aaa Aa Aaaaa Aaa Aaa Aa Aaa Aa Aa Aaaaaaaa Aaaa Aa Aaaaaa Aa Aaa Aaa Aaaaaaaa Aaaa Aaaaaaaaa Aaaa Aaa Aaaaa Aaa Aaaa Aaaa Aaaaaa a Aaaaaaaa Aaaaaaaaaaaaaaa Aaaa Aaa Aaaa Aaaaaaaaaa Aaa Aaaa Aa Aaa a Aaa Aaaaa Aaaaa Aa Aaaaa Aaa Aaaaaaa Aaaaaaaaaaaaaaa Aaa Aaaaaaaa a Aaaaa Aaaa Aa Aaaaa Aaa Aaa Aaa Aaa Aaaa Aaaaa
a Aaaaaaaaaaaaaa Aaaa Aaaa Aaaaaa Aaaaaaaaa Aa a Aa Aaaaaaaaaaa Aaa Aaa Aaaaaaa
🔒Examines how a permissive corner of the GLSL spec turns into a content-observable framebuffer leak when crossed into a stricter shading language
더 확인하려면 구독해 주세요
Audit directions
a Aaaaaaaaaaaa Aaaaaaa a Aaaa Aa Aaaaaa Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Aaaa Aaa Aaaaaa Aa Aaaaaaaaa Aa Aa Aaaaaaaaa Aa Aaaaa Aaa Aa Aaaaaa
a Aaaaaaaaa Aaaaaaaaaaaaaaaa Aaaaaa Aaaaaaaaaaa Aaaaaaaaaaaa Aaaaa Aaa Aa Aa Aaaaa Aa Aaa Aaaa Aa Aaaaaa Aaaaaaaa Aaaaaa Aaaaa Aa Aaaaa Aaa Aaaaaaaaaa Aaaaaaa Aaa Aaaaaaa Aaa Aaaaa Aaaaaaaaa Aaaaaaa Aaaaaaaaaaaaa Aa Aaaaa Aaaaaaaaaaaaaa Aaaaaaa Aaaaaaa Aa Aaaaaa Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Aaaa Aaaaa
a Aaaaaaaa a Aaaaaaaaa Aa Aaa Aaaa Aa Aaaaaaaa Aaaa Aaaa a Aa Aaaaaaaa Aa Aaaaa Aaaa Aaaa Aaaaaaaa Aaaaaaaaaaaaaaaaa Aaaaaaaaaaaaaaaaa Aaaaaaaa Aaaa Aaaa Aaa Aaaaaaa Aa Aaaaa Aaaaaa
a Aaaaaaaa Aaa Aaaaaa Aaa Aaaaaaaaaaaaa Aaaaaaaaaaaaaaaaaaaa Aaaaaaaaaaaaaaaaaaaaa Aa Aaaaaaaaa Aa Aaa Aaaa Aaaaaa Aaa Aaaa Aaaaaaa Aaaaaaaa Aaa Aaaa Aa Aa Aaaaaa Aaa Aaaaaa
🔒Multiple reusable audit patterns identified across ANGLE's per-backend translator passes, with concrete starting points for divergence-driven variant discovery
더 확인하려면 구독해 주세요