Tak na ARMu je v tech vyssich bitech nejaka signatura/podpis, ktery se overuje, je to takova vzdalena variace na NX.
Predstava je takova, ze mate tajnou hodnotu X, a nekde se vsechny JUMP instrukce na pevnou adresu prekoduji do podepsaneho formatu z DST na "hash(DST,X) & DST". Myslim ze LAM specifikuje kde se deli hash vs. DST.
CPU pak runtime (v hw) overuje, ze to, kam skacete je podepsany = validni. Protoze typicky nejaky vir nebo buffer overflow utok chtel/potreboval skocit na pro ne vhodnou adresu, ale nema jak spocitat hash a podepsat si ten DST pointer, takze nastane vyjimka a naborenej program bude ukoncen.
A v praxi to stejne nefunguje, minimalne na applu je to podepisovani v nektere verzi uz prelomeny :D
Co jsem popisoval se jmenuje PAC - pointer authentication code:
https://developer.apple.com/documentation/browserenginekit/improving-control-flow-integrity-with-pointer-authentication
Pokec o prolomeni prvnich implementaci a nasledcich:
https://www.youtube.com/watch?v=7zCBOFxATFs
Zjednodušeně - je to takový HW sanitizer, takže je "zadarmo".
Já jsem to pochopil teda tak, že třeba alokátor paměti může "tagovat" alokované regiony, takže třeba když mám tento region:
[AAAA|BBBB|CCCC|DDDD] - řekněme že jedno písmenko je třeba 64 bytů nebo nějaká jiná praktická granularita (může být i page-size, atd...).
Tak pointer co ukazuje na A má nějaký tag, třeba A, a pokud k němu připočtu 256 bytů, tak už bude ukazovat na B, jenže ten má jiný tag, takže při adresaci CPU pozná, že ten pointer je mimo (třeba to může být buffer overrun).
No a když uvolním A, tak alokátor dá novému regionu třeba tag E, a když s tagem A přistoupím k paměti, tak ty tagy opět nesedí, takže to by mohlo být "use-after-free".
Nevím ale do detailu jestli LAM se dá použít přesně na toto, ale ARM má něco takového, kde právě vrchních 8 bytů se dá použít právě jako tag (pointer tagging).
BTW takto podobně fungujou SW sanitizéry (ASAN), ale tam ty kontroly dělá SW a ne CPU.