Kees Cook, një ish-shef sysadmin në kernel.org dhe udhëheqës i ekipit të sigurisë Ubuntu, tani punon në Google për të mbrojtur Android dhe ChromeOS, ka lëshuar një sërë rregullimesh që rastësojnë kompensimet e pirgjeve të kernelit kur merren me thirrjet e sistemit. Arnimet përmirësojnë sigurinë e kernelit duke ndryshuar vendndodhjen e pirgut, lose kjo i bën sulmet stack shumë më të vështira dhe më pak të suksesshme
Ideja origjinale për arnimin i përket projektit PaX RANDKSTACK. Në vitin 2019, Elena Reshetova, një inxhiniere në Intel, u përpoq të krijonte një zbatim të kësaj ideje, të përshtatshme për përfshirje në përbërjen kryesore të kernelit Linux.
Më pas, iniciativa u mor nga Kees Cook i cili paraqiti një implementim të përshtatshëm për versionin kryesor të kernelit dhe arnimet e të cilit janë planifikuar për versionin 5.13 të Linux.
Modaliteti do të çaktivizohet si parazgjedhje dhe për ta mundësuar atë, ofrohet parametri i rreshtit të komandës së kernelit "Randomize_kstack_offset = ndezur / çaktivizuar»Dhe cilësimet CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT, Për më tepër, shpenzimet e përgjithshme të mundësimit të mënyrës vlerësohen me afërsisht 1% humbje të performancës.
Thelbi i mbrojtjes së propozuar është të zgjidhni një kompensim të rafteve të rastësishme në secilën thirrje të sistemit, gjë që komplikon përcaktimin e paraqitjes së pirgut në memorje edhe nëse merret informacioni i adresës, pasi adresa bazë e pirgut do të ndryshojë në thirrjen tjetër.
Ndryshe nga zbatimi i SISTEMI PAX, në pjesët e propozuara për përfshirje në bërthamë, randomizimi nuk bëhet në fazën fillestare, por pas vendosjes së strukturës pt_regs, gjë që e bën të pamundur përdorimin e metodave të bazuara në ptrace për të përcaktuar një kompensim të rastësishëm gjatë një thirrjeje të gjatë në sistem.
Ndërsa mbrojtjet e pirgjeve të kernelit Linux janë përmirësuar vazhdimisht (harta e grumbujve të bazuar në vmap me faqe mbrojtëse, heqje thread_info, STACKLEAK), sulmuesve u është dashur të gjejnë mënyra të reja për të funksionuar shfrytëzimet e tyre.
Ata kanë dhe vazhdojnë të mbështeten në determinizmin e pirgut të kernelit, në situata kur VMAP_STACK dhe THREAD_INFO_IN_TASK_STRUCT ato nuk ishin të rëndësishme. Për shembull, sulmet e mëposhtme të fundit do të ishin penguar nëse kompensimi i pirgut nuk do të ishte përcaktues midis thirrjeve të sistemit
Qëllimi i funksionit randomize_kstack_offset është të shtoni një kompensim të rastësishëm pasi pt_regs të jetë shtyrë në pirg dhe para se pjesa tjetër e pirgut të fijeve të përdoret gjatë përpunimit të thirrjeve të sistemit dhe ta ndryshoni atë sa herë që një proces lëshon një thirrje të sistemit. Burimi i rastësisë përcaktohet aktualisht nga arkitektura (por x86 përdor bajtin e ulët të rdtsc ()).
Përmirësimet e ardhshme janë të mundshme për burime të ndryshme të entropisë, por jashtë fushës së kësaj patch-i. Gjithashtu, për të shtuar më shumë pa parashikueshmëri, kompensimet e reja zgjidhen në fund të thirrjeve të sistemit (koha e të cilave duhet të jetë më pak e lehtë për tu matur nga hapësira e përdoruesit sesa në kohën e hyrjes së thirrjes së sistemit) dhe ruhen në një ndryshore për CPU, në mënyrë që jetëgjatësia e vlerës të mos mbetet e lidhur në mënyrë të qartë me një detyrë të vetme.
Nuk ka ndryshime të dukshme për këtë në x86 sepse ruajtësi i pirgut është tashmë i paaftë pa kushte për njësinë e përpilimit, por ndryshimi kërkohet në krah64. Fatkeqësisht, nuk ka asnjë atribut që mund të përdoret për të çaktivizuar ruajtësin e pirgut për funksione specifike. Krahasimi me funksionin PaX RANDKSTACK: Funksioni RANDKSTACK rastëson vendndodhjen e fillimit të pirgut (cpu_current_top_of_stack), domethënë, përfshin vendndodhjen e strukturës pt_regs në pirg.
Fillimisht, kjo copë toke ndoqi të njëjtën qasje, por gjatë diskutimeve të fundit është përcaktuar të ketë pak vlerë pasi nëse funksionaliteti ptrace është i disponueshëm për një sulmues, ju mund të përdorni PTRACE_PEEKUSR për të lexuar / shkruar kompensime të ndryshme në strukturën pt_regs, për të vëzhguar sjelljen e memorjes cache të pt_regs kompensim i rafteve të rastësishme.
Më në fund përmendet se implementimi fillestar mbështet procesorët ARM64 dhe x86 / x86_64.