Кіріспе

Компьютерлік қауіпсіздік техникасы. Адрес кеңістігінің кездейсоқ орналасуы (ASLR) – жад зақымдану осалдықтарын пайдаланудың алдын алуға бағытталған компьютерлік қауіпсіздік техникасы. Шабуылшыға код орындауды сенімді түрде, мысалы, жадтағы белгілі бір бұзылған функцияға қайта бағыттау мүмкіндігін болдырмау үшін, ASLR процестің маңызды дерек аймақтарының жад кеңістігіндегі орналасуын кездейсоқ түрде өзгертеді, оның ішінде атқарылатын файлдың бастапқы орнын, сондай-ақ стек, үйінді және кітапханалардың орналасуын қамтиды.

Тарих

Linux PaX жобасы алғаш рет "ASLR" терминін енгізіп, 2001 жылдың шілдесінде Linux ядросы үшін түзету ретінде ASLR-дің алғашқы дизайны мен іске асырылуын жариялады. Бұл толыққанды іске асырылым деп есептеледі және 2002 жылдың қазан айынан бастап ядролық стектің кездейсоқ орналасуына түзету ұсынады. ASLR-ді әдепкі бойынша қолдаған алғашқы кең таралған операциялық жүйе 2003 жылы шыққан OpenBSD 3.4 нұсқасы болды, одан кейін 2005 жылы Linux қолдау көрсетті.

Артықшылықтары

Адрес кеңістігін кездейсоқтандыру шабуылдың кейбір түрлерін қиындатады, өйткені ол шабуылшыға мақсатты мекенжайларды болжауды күрделендіреді. Мысалы, libc-ге қайта оралу шабуылдарын орындауға тырысатын шабуылшылар орындалуға тиіс кодты табуы керек, ал стекке енгізілген шеллкодты орындауға тырысатын басқа шабуылшылар алдымен стек орнын анықтауы керек. Екі жағдайда да, жүйе шабуылшылар үшін байланысты жад адрестерін болжау мүмкін емес етеді. Бұл мәндерді табу қажет, ал қате болжау көбінесе қолданбаның істен шығуына байланысты түзетілмейді.

Энтропияны азайту

Шабуылшылар кездейсоқ адрес кеңістігіндегі ентропияны азайту үшін әртүрлі әдістерді қолдануы мүмкін, қарапайым ақпарат ағып кетуінен бастап, бір шабуылда энтропияның бірнеше битіне шабуыл жасауға дейін (мысалы, үймелеп бүрку арқылы). Бұл жағдайда көп нәрсе жасау мүмкін емес. Пішімдік жолдардың осалдықтарын пайдаланып, жадтың орналасуы туралы ақпаратты ағытуға болады. printf сияқты пішімдік жолдар функциялары өз жұмысын атқару үшін өзгергіш аргументтер тізімін пайдаланады; пішімдік спецификаторлар аргументтер тізімінің қандай түрде болатынын сипаттайды. Аргументтер әдетте қалай берілетіндіктен, әр пішімдік спецификатор стек фреймінің үстіне жақындайды. Соңында, қайтару көрсеткіші мен стек фреймі көрсеткіші алынуы мүмкін, бұл осал кітапхананың мекенжайын және белгілі стек фреймінің мекенжайын ашады; бұл кітапхана мен стек кездейсоқтығын шабуылшы үшін кедергі ретінде жоюы мүмкін. Сондай-ақ, стек немесе үйіндідегі ентропияны азайтуға болады. Стек әдетте 16 байтқа дейін туралануы керек, сондықтан бұл ең кішкентай кездейсоқ аралық; ал үйінді әдетте 4096 байттық бетке туралануы керек. Шабуыл жасауға тырысқанда, осы аралықтармен сәйкес келетін қайталама шабуылдарды жасауға болады; NOP слайдын shellcode инъекциясымен пайдалануға болады, ал жүйеге қайта оралуға тырысқанда " " жолы " " жолымен алмастырылуы мүмкін. Шабуылданған аралықтар саны үшін алынған биттер саны дәл n-ге тең. Мұндай азайтулар стектегі немесе үйіндідегі деректер көлемімен шектеледі. Мысалы, стек әдетте 8-ге дейін шектеледі және одан да азқа дейін өседі; бұл ең көп дегенде 19-ға мүмкіндік береді, бірақ консервативті бағалау 8–10 шамасында болады, бұл 4–16-ға сәйкес келеді. Android 5.0 PIE қолдауын тоқтатты және барлық динамикалық байланысты екіліктердің позицияға тәуелді болуын талап етеді. Кітапхана жүктеу ретін кездейсоқ реттеу 2015 жылдың 26 қазанында Android ашық коды жобасына қабылданды. Ол әдепкі бойынша өшірілген және sysctl vm.randomize_mmap параметрін 1-ге орнату арқылы қосуға болады.

FreeBSD-нің нұсқасы

ASLR қолдауы FreeBSD 13.0 нұсқасында енгізілді. 13.2 нұсқасынан бастап ол әдепкі бойынша қосулы күйде болады.

iOS (iPhone, iPod touch, iPad) құрылғысы

Apple iOS 4.3-те (2011 жылдың наурыз айында шығарылған) ASLR енгізді. KASLR iOS 6-да енгізілді. Кездейсоқ ядролық базасы – , мұндағы – iBoot (iOS жүктеушісінің 2-ші кезеңі) арқылы жасалған SHA1 (кездейсоқ деректер) кездейсоқ байты.

Linux жүйесі

Linux ядросы 2005 жылғы маусымда шыққан 2.6.12 нұсқасынан бастап ASLR-дің әлсіз түрін әдепкі бойынша қосты. Linux ядросына арналған PaX және Exec Shield патч жинақтары толыққанды жүзеге асыруды қамтамасыз етеді. Linux үшін Exec Shield жапсырмасы 16 байттық кезеңде 19 биттік стек энтропиясын және 4096 байттық кезеңдегі 1 беттік кезеңде 8 биттік mmap базасын кездейсоқтайды. Бұл стек базасын 524,288 мүмкін позицияны қамтитын 8 МБ кеңістікте, ал mmap базасын 1 МБ кеңістікте 256 мүмкін позицияда орналастырады. ASLR-ді белгілі бір процесс үшін оның орындалу доменін өзгерту арқылы, personality(2) функциясын пайдалану арқылы өшіруге болады. Көптеген sysctl опциялары негізгі ASLR мінез-құлқына басқарады. Мысалы, нені кездейсоқтандыру керектігін басқарады; ең күшті опциясы – 2. mmap үшін қанша бит кездейсоқтандыру керектігін басқарады. Позицияға тәуелсіз орындалатын файл (PIE) негізгі орындалатын бинарлық файл үшін кездейсоқ базалық мекенжайды жүзеге асырады және 2004 жылдың 18 сәуірінен бастап қолданыста. Ол ортақ кітапханалар үшін қолданылатын негізгі орындалатын файлға бірдей адрестік кездейсоқтық береді. PIE мүмкіндігі бір орындалатын файл үшін prelink мүмкіндігімен бірге қолданылмайды. Prelink құралы орындалу уақытында емес, prelink уақытында кездейсоқтандыруды жүзеге асырады, себебі дизайн бойынша prelink динамикалық байланыстырушының алдында кітапханаларды орналастыруға бағытталған, бұл бағдарламаның көптеген орындалулары үшін бір рет орналастыруға мүмкіндік береді. Нәтижесінде, нақты адрестік кеңістікті кездейсоқтандыру prelinking мақсатын жояды. 2014 жылы Марко Гисберт және Риполл PIE орындалатын файлдары үшін Linux ASLR-ді әлсірететін offset2lib техникасын жариялады. Linux ядролары PIE орындалатын файлдарын кітапханаларынан кейін жүктейді; нәтижесінде орындалатын файл мен кітапхана функциялары арасында тұрақты ауытқу болады. Егер шабуылшы орындалатын файлдағы функцияның мекенжайын табудың жолын тапса, кітапхана мекенжайлары да белгілі болады. Олар 400-ден аз әрекетте мекенжайды табатын шабуылды көрсетті. Олар орындалатын файлдың кітапханаға қатысты орналасуын кездейсоқтандыру үшін жаңа опцияны ұсынды.

2022 жылдың мамырында шыққан Linux ядросы 5.18 32 биттік және 64 биттік жүзеге асырулардың тиімділігін төмендетті. Linux файлдық жүйелері файлға сүйенетін mmap-қа жауап беру үшін thp get unmapped area деп атайды. 5.18 нұсқасындағы өзгерістерге сәйкес, 2 МиБ-тан үлкен файлдар 2 МиБ-қа сәйкес келетін мекенжайларды қайтарады, осылайша оларды үлкен беттермен қолдауға болады. (Бұрын жоғарылатылған сәйкестік тек Direct Access (DAX) карталарына ғана қолданылған.) Осы уақыт аралығында C кітапханасы (libc) уақыт өте келе, бұл 2 МиБ-тан асып кетті, сондықтан бұрынғыдай 4 КиБ беттік шекарасына сәйкестендірілмейтін, енді бұл кітапханалар 2 МиБ-қа сәйкестендірілген: 9 бит энтропия жоғалды. 32 биттік Linux үшін көптеген дистрибутивтер libc орналасуында кездейсоқтық белгілерін көрсетпейді. 64 биттік Linux үшін 28 биттік энтропия 19 битке дейін азайды. Жауап ретінде Ubuntu өз параметрлерін арттырды. Мартин Душа осы мәселені анықтау үшін Linux Test Project сынақ жағдайын қосты.

Жүректің адрестік кеңістігі орналасуын кездейсоқ таңдау

Ядролық мекенжай кеңістігінің ретсіздендірілуі (KASLR) Linux ядросының бейнесі үшін мекенжай кеңістігін ретсіздендіруді жүзеге асырады, ядро кодын жүктеу кезінде орналасқан жерін кездейсоқ ету арқылы. KASLR 2014 жылдың 30 наурызында шыққан 3.14 ядро нұсқасында Linux ядросының негізгі құрамына қосылды. Ол құрастырылған кезде, ядроның жүктелу параметрлерінің бірі ретінде көрсетілген жағдайда өшірілуі мүмкін. x86 процессорларында ядро мекенжайларын ашуға мүмкіндік беретін бірнеше жанама арналы шабуылдар бар. 2017 жылдың соңында осы шабуылдарды жеңу үшін ядролық беттік кестелерді оқшаулау (KPTI, сондай-ақ KAISER) әзірленді. Дегенмен, бұл әдіс тармақ болжаушы құрылымдарындағы соқтығыстарды пайдаланатын жанама арналы шабуылдардан қорғай алмайды. 2021 жылғы мәліметтер бойынша, ядролық мекенжай кеңістігінің ұсақ түйірлі ретсіздендірілуі (немесе функциялық түйірлі KASLR, FGKASLR) KASLR-ді функция деңгейіне дейін ретсіздендіруге бағытталған жоспарланған кеңейтім болып табылады.

Microsoft Windows-тың жүйелік жүйесі

Microsoft-тың Windows Vista (2007 жылдың қаңтарында шығарылған) және одан кейінгі нұсқаларында ASLR тек ASLR қолдауымен арнайы байланыстырылған орындалатын файлдар мен динамикалық кітапханалар үшін ғана қосылады. Үйлесімділік үшін, ол әдетте басқа қолданбалар үшін әдепкі бойынша қосылмайды. Көбінесе, тек ескі бағдарламалық қамтамасыз ету үйлесімсіз келеді және ASLR тіркеу жазбасын өңдеу арқылы немесе Microsoft-тың кеңейтілген қорғау құралдары жиынтығын орнату арқылы толыққанды қосылуы мүмкін. Жинақ, стек, процесс ортасының блогы және жиек ортасының блогының орналасуы да кездейсоқ таңдалады. Symantec компаниясының қауіпсіздік туралы ақпаратында 32 биттік Windows Vista-дағы ASLR күтілгендей сенімді болмауы мүмкін екені және Microsoft оның іске асырылуындағы кемшілікті мойындағаны айтылған. WehnTrust және Ozone сияқты хост-негізгі кіріп-шығуды болдырмау жүйелері Windows XP және Windows Server 2003 операциялық жүйелері үшін де ASLR ұсынады. WehnTrust ашық кодты. Ozone-ның іске асырылу толыққанды мәліметтері қолжетімді емес. 2012 жылдың ақпан айында Windows 8-ге дейінгі 32 биттік Windows жүйелеріндегі ASLR-дің жад жеткіліксіз болған жағдайларда тиімділігі төмендеуі мүмкін екені анықталды. Осы зерттеуде Linux жүйелерінде де ұқсас нәтижелерге қол жеткізілді. Тесттік код Mac OS X 10.7.3 жүйесінің ядролық қатеге түсуіне себеп болды, сондықтан осы жағдайда оның ASLR мінез-құлқы белгісіз қалды.

NetBSD-нің

Userland-те ASLR қолдауы NetBSD 5.0 нұсқасында пайда болды (2009 жылдың сәуірінде жарық көрді) және 2016 жылдың сәуірінде NetBSD-нің соңғы нұсқасында әдепкі бойынша қосылды. AMD64 архитектурасында ядролық ASLR қолдауы 2017 жылдың қазан айында NetBSD-нің соңғы нұсқасына қосылды, осылайша NetBSD KASLR-ді қолдайтын алғашқы BSD жүйесі атанды.

OpenBSD- тің атауы

2003 жылы OpenBSD ASLR-дің күшті түрін қолдайтын және оны әдепкі бойынша қосатын алғашқы кең таралған операциялық жүйе болды. OpenBSD 2008 жылы PIE бинарлық файлдарын қолдауды қосып, ASLR қолдауын толықтырды. OpenBSD 4.4-тің malloc(3) функциясы OpenBSD-нің mmap жүйелік шақыруының құрамында жүзеге асырылған ASLR және бос беттер мүмкіндіктерін пайдаланып, қауіпсіздікті арттыру және жадты босатылғаннан кейін пайдалану қателерін анықтау мақсатымен жасалды. 2013 жылы шыққан OpenBSD 5.3 бірнеше аппараттық платформада позицияға тәуелсіз орындалатын файлдарды әдепкі бойынша қосатын алғашқы кең таралған операциялық жүйе болды, ал OpenBSD 5.7 позицияға тәуелсіз статикалық бинарлық файлдарды (Static PIE) әдепкі бойынша қосты. Mac OS X Lion 10.7 (2011 жылдың шілдесінде шығарылды) жүйесінде Apple өздігінен іске асыруын барлық қолданбаларды қамту үшін кеңейтті, "адрес кеңістігінің орналасуын кездейсоқтандыру (ASLR) барлық қолданбалар үшін жақсартылды. Бұл қазір 32 биттік қолданбалар үшін де қолжетімді (жадтың топтық қорғау сияқты), 64 биттік және 32 биттік қолданбаларды шабуылға қарсы тұруға көбірек мүмкіндік береді". OS X Mountain Lion 10.8 (2012 жылдың шілдесінде шығарылды) және одан кейінгі нұсқаларында жүйе, оның ішінде ядро, сондай-ақ кеңейтімдер мен аймақтар жүйе іске қосылғанда кездейсоқ түрде орналастырылады.

Соларис

ASLR, қазан 2012 жылы жарық көрген Solaris 11.1 нұсқасынан бастап Solaris жүйесіне енгізілді. Solaris 11.1-дегі ASLR жүйелік деңгейде, аймақтар бойынша немесе жеке файлдар бойынша орнатылуы мүмкін.

Пайдалану

Бүйірлік арнаға шабуыл жасалып, бранш-тағайындағы буферді пайдаланып ASLR қорғанысын айналып өту мүмкіндігі көрсетілді.