[ARM] MTE (Memory Tagging Extension)
MTE
์ผ๋จ MTE๋ ๋ฉ๋ชจ๋ฆฌ ์์ฒด๋ฅผ 'ํ๊น 'ํ๋ ๊ธฐ๋ฒ์ด๋ค. ๊ทธ๋ ๋ค๋ฉด ํ๊น ์ด๋ผ๋๊ฒ ์ ํํ๊ฒ ๋ญ๊น?
- Address Tag (Key) : 4bit๋ก ๋์ด์๊ณ , virtual address์ ์์ ๋นํธ์ ์ ์ฅ๋๋ค! ์์ ๋นํธ์ ์ ์ฅ๋ ์ ์๋ ์ด์ ๋, AArch64์ TBI(Top-Byte-Ignore' ํน์ง ๋๋ฌธ์ด๋ค
- Memory Tag (Lock) : ๋๊ฐ์ด 4bit๋ก ๊ตฌ์ฑ๋์ด์๊ณ , memory storage์ ์ ์ฅ๋๋ค. ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์์ 16byte๋ก ์ ๋ ฌ๋ ๋ชจ๋ region์ ๋งํฌ๋์ด์๋ค!
์ฐธ๊ณ ) TBI๊ฐ ํ์ฑํ๋๋ฉด virtual address์ top byte๋ ์ฃผ์ ํด์์์ ๋ฌด์๋๋ค! ๊ทธ๋์ top byte๋ฅผ metadata๋ฅผ ์ ์ฅํ๋๋ฐ ์ธ ์ ์๋ ๊ฒ์ด๋ค
์ผ๋จ ์ด๋ ๊ฒ 'ํ๊น
๋'๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผ/์ ์ฅํ๊ธฐ ์ํด์๋ address tag์ memory tag ๋์ ๋น๊ตํด์ผํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ง์ฝ ์ด ๋ ํ๊ทธ๊ฐ ๋ง์ง ์๋๋ค๋ฉด ์์ธ๋ฅผ ๋ฐ์์ํจ๋ค.
Address Tag
์ผ๋จ ์๋ ๊ทธ๋ฆผ์์ X0์ด ์ฃผ์๋ฅผ ์ ์ฅํ๋ค๊ณ ๊ฐ์ ํ์!! ์ด์ฒ๋ผ ์ฃผ์๋ฅผ ์ ์ฅํ ๋ address tag๊ฐ ์๋๋ฏ (๊ถ๊ธํ๊ฑด, ์ ์ ์ฅํ ๋๋ ๊ทธ๋ฅ ๋ค address๋ก ๊ฐ์ฃผํ๊ณ address tag๊ฐ ์๋์ง?)
์๋ฅผ ๋ค์ด LDR X1, [X0]์ฒ๋ผ X0์ด์๋ ๋ฐ์ดํฐ(์ฆ, ์ฃผ์)๊ฐ X1์ ์ ์ฅ๋๋ฏ์ด, X0๊ฐ ์ฃผ์๋ฅผ ์ ์ฅํ๋ค๊ณ ์๊ฐํด๋ณด์
X0์์, 55๋ฒ์งธ ๋นํธ์ [47:0]๋ถ๋ถ๋ง ์ค์ ์ฃผ์๋ฅผ ์ ์ฅํ๊ฒ ๋๊ณ , [59:56]๋ถ๋ถ์๋ 4bit์ง๋ฆฌ ํ๊ทธ๊ฐ ์ ์ฅ๋๋ค.
๊ทธ๋ฆฌ๊ณ ํ๊ทธ์๋ ๋๋คํ ๊ฐ์ด ๋ค์ด๊ฐ๋ ๊ฒ ๊ฐ๋ค
Memory Tag
์ผ๋จ ์์์ ๋งํ๋ฏ, 16byte ๋ฉ๋ชจ๋ฆฌ๋ง๋ค 4bit์ ํ๊ทธ๊ฐ ๋ค ์๋ค.
๋ฉ๋ชจ๋ฆฌ ํ๊ทธ ์คํ ๋ฆฌ์ง๋ ์ ์ฉ ์ฃผ์๋ก ์ ๊ทผํ ์ ์๋ค! associated data๋ฅผ ํตํด์๋ง ์ ๊ทผ ๊ฐ๋ฅํ๋ค
์ฐธ๊ณ ๋ก ์ด ํ๊ทธ๋ค์ CPU ์บ์ ๋ฑ์ ์ ์ฅ๋ ์ ์๋ค๊ณ ํ๋ค!
๊ทธ๋ฌ๋ฉด ์ด memory tag์ address tag๋ ์ ํํ ์ด๋ป๊ฒ ์ฐ๊ด์ด ๋๋๊ฑธ๊น??
์๋ ๊ทธ๋ฆผ์ MTE์ STG X0, [X0] ๋ผ๋ ๋ช ๋ น์ด์ ๋์์ ๋ณด์ฌ์ฃผ๋ ๊ทธ๋ฆผ์ด๋ค.
์ผ๋จ ์์์ ๋ดค๋ฏ, X0์๋ ํ๊ทธ์ ์ฃผ์๊ฐ ์ ์ฅ๋์ด์๋ค.
์ด๋ ๊ทธ๋ฆผ์์๋ X0์ ์ ์ฅ๋์ด์๋ ์ฃผ์(physical address)๋ก ์ ๊ทผํ ํ, ํด๋น ์ฃผ์์ memory ํ๊ทธ์ X0์ ์ ์ฅ๋์ด์๋ address tag๋ฅผ ์ ์ฅํ๊ณ ์๋ค.
Tag Check
์ผ๋จ ํ๊ทธ๋ฅผ ์ฒดํฌํ ๋, ๋จผ์ address register(์ ๊ทธ๋ฆผ์ ๊ฒฝ์ฐ X0)์ ์ ์ฅ๋์ด์๋ ํ๊ทธ์, X0์ ์ฃผ์๋ก ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํด์ ์ฃผ์ ํ๊ทธ์ ๋น๊ตํ๊ฒ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ง์ฝ ์ด ๋์ด ๋ค๋ฅด๋ฉด execption์ด ์ผ์ด๋๊ฒ ๋๋ ๊ฒ์ด๋ค.
์ฐธ๊ณ ๋ก ์๋ ๊ทธ๋ฆผ์ฒ๋ผ memory tag๊ฐ ์ ์ฅ๋์ด์๋๋ฏํ๋ค
Operation Mode
MTE์์ exception์ ๋ฐ์์ํค๋ ๋ฐฉ๋ฒ์๋ ๋๊ฐ์ง ๋ฐฉ๋ฒ์ด์๋ค. ์ด๊ฑฐ๋ 2๊ฐ์ง operation mode๋ก ๊ตฌ๋ถ๋๊ฒ ๋๋ค.
๊ทธ๋ฆฌ๊ณ Execption์ด ๋ฐ์ํ๋ฉด SIGSEGV ์๊ทธ๋์ ๋ฐ์์ํค๊ฒ ๋๋ค.
1. Precise (Synchronous) Mode
- exception์ด ๋ฐ์ํ์ ๋, instantํ๊ฒ ๋ฐ๋ก synchronousํ exception์ ๋ฐ์์ํด
- performance overhead ์กด์ฌ
- SEGV_MTESERR
2. Imprecise (Asynchronous) Mode
- exception์ด ๋ฐ์ํ์ ๋, asynchronousํ exception์ ๋ฐ์์ํด
- instantํ๊ฒ ๋ฐ์์ํค์ง๋ ์๊ณ illegal memory access๊ฐ ๋ฐ์ํ๊ณ ์ข ํ์ exception๋ฐ์์ํค๋ ๋ฏ
- ์ ํํ๋ kernel mode์ ๋ค์ด๊ฐ์ ๋ exception ๋ฐ์์ํค๋ ๊ฒ ๊ฐ๋คใ ใ
- SEGV_MTEAERR
๋น๋๊ธฐ/๋๊ธฐ์ ๊ด๋ จํด์ ์์ ์ ์ ๋ฆฌํ ๊ธ -> [OS] ๋๊ธฐ์ ์ ์ถ๋ ฅ vs ๋น๋๊ธฐ์ ์ ์ถ๋ ฅ
UAF Prevention
๊ทธ๋ ๋ค๋ฉด ์ด MTE ๊ธฐ๋ฒ์ด ์ด๋ป๊ฒ UAF๋ฅผ preventํ ์ ์๋ ๊ฒ์ผ๊น?
์ผ๋จ ์ฌ๊ธฐ์ pointer๋ key, ํ ๋นํ ๋ฉ๋ชจ๋ฆฌ๋ lock์ ๋์๋ ๊ฒ์ด๋ค.
์ด๋ memory๊ฐ free๋๋ฉด memory tag๋ ๋ฐ๋ก invalidate๋๋ค. ๋ฐ๋ผ์ pointer์ key (address tag)๋ outdated๋๊ฒ ๋๊ณ , ํด๋น ์ฃผ์์ ์ดํ์ ๋ ์ ๊ทผํ๊ฒ ๋๋ฉด mismatch๊ฐ ์ผ์ด๋์ UAF๋ฅผ ๋ฐฉ์งํ๊ฒ ๋๋ ๊ฒ ๊ฐ๋ค
Reference
Where is the MTE Tag stored and checked? (arm.com)
MTE (Memory Tagging Extension): ๋ฉ๋ชจ๋ฆฌํ๊น (velog.io)
Arm Memory Tagging Extension(MTE) - Security Update List (skill.or.kr)