Кіріспе

Компьютерде жадқа қол жеткізу құқықтарын басқару жолы

Жадты қорғау – компьютерде жадқа қол жеткізу құқықтарын басқарудың бір жолы және қазіргі заманғы көптеген нұсқау жинағы архитектуралары мен операциялық жүйелердің құрамына кіреді. Жадты қорғаудың басты мақсаты – процестің оған бөлінбеген жадқа қол жеткізуіне жол бермеу. Бұл процестегі қателердің немесе зиянды бағдарламалардың басқа процестерге немесе операциялық жүйенің өзіне әсер етуін қамтамасыз етеді. Қорғау белгілі бір жад аймағына жасалатын барлық қол жеткізулерді, жазуға жасалатын қол жеткізулерді немесе аймақтың мазмұнын орындау әрекеттерін қамтуы мүмкін. Рұқсатсыз жадқа қол жеткізу әрекеті аппараттық қатеге, мысалы, сегментация қатесіне, жад бұзушылық ерекшелігіне алып келеді, бұл әдетте, құқық бұзған процестің қалыпты емес тоқтауына себеп болады. Компьютерлік қауіпсіздік үшін жадты қорғау адрестік кеңістіктің кездейсоқ орналасуы және орындалатын кеңістікті қорғау сияқты қосымша техникаларды қамтиды.

Сегменттеу

Сегменттеу – компьютер жадының сегменттерге бөлінуі. Жад орнына сілтеме сегментті және сол сегмент ішіндегі ығысуды анықтайтын мәнді қамтиды. Сегмент сипаттамасы қолжетімділік құқықтарын шектеуі мүмкін, мысалы, тек оқуға ғана рұқсат беру немесе белгілі бір сақиналардан ғана қолжетімді болуы. x86 архитектурасы қорғалған жадты пайдалануға көмектесетін бірнеше сегменттеу мүмкіндіктеріне ие. x86 архитектурасында компьютер жадындағы сегменттерге сілтеме жасау үшін Global Descriptor Table (Жалпы сипаттама кестесі) және Local Descriptor Tables (Жергілікті сипаттама кестелері) қолданылуы мүмкін. x86 процессорларындағы жад сегменттеріне сілтемелер процессордың сегменттік тіркегіштерінде сақталуы мүмкін. Бастапқыда x86 процессорларында 4 сегменттік тіркегіш болды: CS (код сегменті), SS (стек сегменті), DS (дерек сегменті) және ES (қосымша сегмент); кейіннен тағы екі сегменттік тіркегіш – FS және GS қосылды. Артықшылықтары жоқ қосымшаның оған тікелей бөлінбеген бетке қол жеткізуіне болмайды, себебі әрбір жад адресі сол қосымшаға бөлінген бетке сілтеме жасайды немесе «беттік қате» деп аталатын үзіліс тудырады. Бөлінбеген беттер мен басқа қосымшаларға бөлінген беттерде қосымша үшін ешқандай мекенжайлар болмайды. Беттік қате міндетті түрде қателік емес. Беттік қателер жадыны қорғау үшін ғана емес, басқа да мақсаттарда қолданылады. Операциялық жүйе беттік кестені осылай басқаруы мүмкін: екінші деңгейдегі жадқа бұрын шығарылған бетке сілтеме жасау беттік қатені тудырады. Операциялық жүйе беттік қатені ұстап алады, қажетті жад бетін жүктейді және қосымша ешқандай қате болмағандай жұмысын жалғастырады. Бұл схема, виртуалды жадтың бір түрі, қолданыста болмайтын деректерді екінші деңгейдегі жадқа және кері жылжытуға мүмкіндік береді, бұл жадтың жалпы сыйымдылығын арттырады. Кейбір жүйелерде виртуалды жадқа сұраныс жасағанда виртуалды мекенжайлар блогы бөлінеді, оған әлі ешбір беттік жақтау тағайындалмаған, ал жүйе беттік қателер пайда болғанда ғана беттік жақтауларды тағайындайды және инициализациялайды. Кейбір жүйелерде қателерді анықтау үшін немесе дерек құрылымдарын автоматты түрде кеңейту үшін «қорғау беті» қолданылуы мүмкін. Кейбір жүйелерде беттік қате механизмі W^X сияқты орындалатын кеңістікті қорғау үшін де қолданылады.

Қорғау кілттері

Жадты қорғау кілті (MPK) механизмі физикалық жадты белгілі бір өлшемдегі (мысалы, 4 КиБ) блоктарға бөледі, олардың әрқайсысы сандық мәні бар қорғаныс кілтімен байланысты. Әрбір процеске де қорғаныс кілтінің мәні сәйкес келеді. Жадқа қол жеткенде аппараттық құрал ағымдағы процестің қорғаныс кілті, қол жеткізіліп жатқан жад блогымен байланысты мәнге сәйкес келе ме екенін тексереді; егер сәйкес келмесе, қателік туындайды. Бұл механизм System/360 архитектурасында енгізілген. Ол бүгінгі System z негізгі жүйелерінде қолданылады және System z операциялық жүйелері мен олардың қосалқы жүйелерінде кеңінен пайдаланылады. Жоғарыда сипатталған System/360 қорғаныс кілттері физикалық мекенжайлармен байланысты. Бұл Hewlett Packard/Intel IA 64 және Hewlett Packard PA RISC сияқты архитектураларда қолданылатын, виртуалды мекенжайлармен байланысты және процеске бірнеше кілттерді рұқсат ететін қорғаныс кілті механизмінен өзгеше. Itanium және PA RISC архитектураларында аудармалар (TLB жазбалары) кілттермен (Itanium) немесе кіру идентификаторларымен (PA RISC) байланыстырылған. Жұмыс істеп жатқан процесте бірнеше қорғаныс кілті тіркелгіштері бар (Itanium үшін 16, PA RISC үшін 4). Виртуалды мекенжай таңдаған аударманың кілті әрбір қорғаныс кілті тіркелгіштерімен салыстырылады. Егер олардың кез келгені сәйкес келсе (басқа да тексерулермен қатар), кіруге рұқсат беріледі. Егер сәйкес келмесе, қателік немесе ерекшелік туындайды. Бағдарламалық жасақтамадағы қателіктерді өңдеуші, қажет болса, жоғалған кілтті бағдарламалық жасақтамада сақталатын кілттердің үлкен тізімімен салыстыра алады; осылайша процессордағы қорғаныс кілті тіркелгіштері процеске байланысты кілттердің үлкен тізімінің бағдарламалық қамтамасыз етілген кэші ретінде қарастырылуы мүмкін. PA RISC 15–18 биттік кілтке ие; Itanium кемінде 18 бит талап етеді. Кілттер әдетте қорғаныс домендерімен, мысалы кітапханалар, модульдер және т.б. байланысты. x86 архитектурасындағы қорғаныс кілттері пайдаланушы беттеріне виртуалды мекенжайларды 16 қорғаныс кілтінің кез келгенімен белгілеуге мүмкіндік береді. Бір қорғаныс кілтімен белгіленген барлық беттер қорғаныс доменін құрайды. Жаңа тіркелгіште әрбір қорғаныс доменіне байланысты рұқсаттар болады. Деректерді жүктеу және сақтау операциялары беттік кесте рұқсаттарымен және виртуалды мекенжайдың қорғаныс доменімен байланысты қорғаныс кілті рұқсаттарымен сәйкес тексеріледі және егер екі рұқсат та кіруге рұқсат берсе ғана рұқсат етіледі. Қорғаныс кілті рұқсаттарын пайдаланушы кеңістігінен орнатуға болады, бұл қолданбаларға операциялық жүйенің араласуынсыз қолданба деректеріне тікелей кіруді шектеуге мүмкіндік береді. Қорғаныс кілттері виртуалды мекенжаймен байланысты болғандықтан, қорғаныс домендері әр мекенжай кеңістігіне сәйкес келеді, сондықтан әртүрлі мекенжай кеңістіктерінде жұмыс істейтін процестер әрқайсысы 16 доменді пайдалана алады.

Қорғау сақиналары

Мултикс және одан туындаған жүйелерде әрбір сегменттің оқу, жазу және орындау үшін қорғаныш сақинасы болады; егер процесс сегменттің сақинасынан жоғарырақ сақинаға ие болса, онда қате пайда болады. Төменгі сақинада жұмыс істейтін процедураларды қауіпсіз шақыру және жоғарырақ сақинаға оралу механизмі бар. Төменгі сақина нөмірімен жұмыс істейтін бағдарлама өз сақинасы мен шақырушының сақинасының ең үлкеніне сәйкес параметрге қол жеткізуге мүмкіндік беретін механизмдерге ие.

Эмоционалды сегменттеу

Моделирлеу – кейбір компьютерлік архитектуралардың машиналық код нұсқауларын түсіндіру үшін бақылау бағдарламасын пайдалану. Мұндай нұсқаулар жиынтығын симулятор сегменттеу сияқты схеманы қолдану арқылы және оларды нақты орындаудан бұрын әр нұсқаудың мақсатты мекенжайын және ұзындығын нақты уақытта тексеру арқылы жадты қорғай алады. Симулятор мақсатты мекенжай мен ұзындығын есептеп, оны желі ортасына қатысты бар жарамды мекенжай диапазондарының тізімімен салыстыруы керек, мысалы, желі басталғаннан бері алынған кез келген динамикалық жад блоктары, сондай-ақ кез келген жарамды ортақ статикалық жад ұялары. "Жарамды" мағынасы мағынасына байланысты, желінің өмірлік циклі бойында өзгеруі мүмкін. Кейде сақтаудың статикалық блогын өзгертуге рұқсат етуі мүмкін, ал кейде рұқсат етілмейді, бұл сақтау кілтіне немесе қадағалаушы күйіне байланысты болуы мүмкін немесе болмауы мүмкін. Егер процессорда жеткілікті мүмкіндіктер болса, жадты қорғау үшін осы әдісті пайдалану ұсынылмайды, себебі бұл компьютердің құнды өңдеу қуатын алады. Дегенмен, ол әдетте жөндеу және сынау мақсатында қолданылады, бұл әдеттегі жад бұзушылықтарына қосымша егжей-тегжейлі деңгейді қамтамасыз етеді және қорғалмаған жад сияқты сақтау кілтіне ие болған сақтау бөлігін қай нұсқаудың жазуға тырысатынын нақты көрсете алады.

Қуаттылыққа негізделген адрестеу

Қуаттылыққа негізделген адрестеу – қазіргі заманғы коммерциялық компьютерлерде қолданылмайтын жадты қорғау әдісі. Бұл әдісте, көрсеткіштер (поинтерлер) қорғалған нысандармен (қабілеттер деп аталады) алмастырылады, олар ядроның немесе оны орындауға уәкілеттік алған басқа процестің артықшылықты нұсқауларын ғана пайдалана отырып құрылуы мүмкін. Бұл ядроға жадтағы нысандарға қай процестердің қол жеткізе алатынын бақылауға мүмкіндік береді, жеке адрестік кеңістіктерді немесе контексттік ауысуларды пайдалану қажеттілігін жояды. Қабілеттерге негізделген қауіпсіздікті тек бірнеше коммерциялық өнім қолданды: Plessey System 250, IBM System/38, Intel iAPX 432 архитектурасы және KeyKOS. Қабілеттерге негізделген тәсілдер EROS және Combex DARPA браузері сияқты зерттеу жүйелерінде кеңінен қолданылады. Олар Smalltalk және Java сияқты кейбір виртуалды машиналардың негізі ретінде түсіндіріледі. Қазіргі уақытта Кембридж университетіндегі DARPA қаржыландыратын CHERI жобасы, ескі бағдарламалық қамтамасты да қолдайтын заманауи қабілеттерге негізделген машина құруға жұмыс істеп жатыр.

Динамикалық зақымдану

Динамикалық зақымдану – бағдарламаларды заңсыз жадқа қол жеткізуден қорғау тәсілі. Жады орындалу барысында бөлінген кезде, бұл тәсіл жадының өзін және сәйкес көрсеткішті бірдей зақымдану белгісімен белгілейді. Зақымдану белгілері бағдарлама орындалғанда тиісінше таратылады және жад мекенжайы m көрсеткіш p арқылы қол жеткізілген сайын тексеріледі; егер m және p-ге байланысты зақымдану белгілері өзгеше болса, орындалу тоқтатылады және заңсыз қол жеткізу туралы хабарлама жіберіледі. SPARC M7 процессорлары (және одан жоғары) динамикалық зақымдануды аппараттық деңгейде жүзеге асырады. Oracle бұл мүмкіндікті Silicon Secured Memory (SSM) (бұрын Application Data Integrity (ADI)) деп саудалайды. LowRISC CPU дизайны динамикалық зақымдануды "Tagged Memory" деген атаумен қамтиды.

Іс-шаралар

Нақты бір іске асырудың қорғалу деңгейі, оның ең төменгі құқықтар қағидасын қаншалықты дәл сақтауымен анықталады.