pkeys(7) - wariua/manpages-ko GitHub Wiki

NAME

pkeys - ๋ฉ”๋ชจ๋ฆฌ ๋ณดํ˜ธ ํ‚ค ๊ฐœ์š”

DESCRIPTION

๋ฉ”๋ชจ๋ฆฌ ๋ณดํ˜ธ ํ‚ค(Memory Protection Key, pkey)๋Š” ๊ธฐ์กด์˜ ํŽ˜์ด์ง€ ๊ธฐ๋ฐ˜ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ํ—ˆ๊ฐ€์— ๋Œ€ํ•œ ํ™•์žฅ์ด๋‹ค. ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์„ ์ด์šฉํ•œ ์ผ๋ฐ˜์ ์ธ ํŽ˜์ด์ง€ ์ ‘๊ทผ ํ—ˆ๊ฐ€์—์„œ๋Š” ํ—ˆ๊ฐ€ ๋ณ€๊ฒฝ ์‹œ ๊ฐ’๋น„์‹ผ ์‹œ์Šคํ…œ ํ˜ธ์ถœ๊ณผ TLB ๋ฌดํšจํ™”๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ๋ณดํ˜ธ ํ‚ค๋Š” ํ—ˆ๊ฐ€ ๋ณ€๊ฒฝ ๋•Œ๋งˆ๋‹ค ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์„ ๋ณ€๊ฒฝํ•  ํ•„์š” ์—†์ด ๋ณดํ˜ธ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•œ๋‹ค.

pkey๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € ์†Œํ”„ํŠธ์›จ์–ด์—์„œ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ” ๋‚ด์˜ ํŽ˜์ด์ง€์— pkey "ํƒœ๊ทธ"๋ฅผ ๋ถ™์—ฌ์•ผ ํ•œ๋‹ค. ๊ทธ ํ›„์— ์‘์šฉ์—์„œ ํƒœ๊ทธ ๋ถ™์€ ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ์“ฐ๊ธฐ ์ ‘๊ทผ๊ถŒ์ด๋‚˜ ์ „์ฒด ์ ‘๊ทผ๊ถŒ์„ ์ œ๊ฑฐํ•˜๋ ค๋ฉด ๋ ˆ์ง€์Šคํ„ฐ์˜ ๋‚ด์šฉ๋งŒ ๋ฐ”๊พธ๋ฉด ๋œ๋‹ค.

๋ณดํ˜ธ ํ‚ค๋Š” mprotect(2)์™€ mmap(2) ๊ฐ™์€ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์— ์ „๋‹ฌํ•œ ๊ธฐ์กด์˜ PROT_READ/PROT_WRITE/PROT_EXEC ํ—ˆ๊ฐ€์™€ ๊ฒฐํ•ฉ๋ผ์„œ ๋™์ž‘ํ•œ๋‹ค. ์–ธ์ œ๋‚˜ ๊ทธ ์ „ํ†ต์  ํ—ˆ๊ฐ€ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋” ์ œ์•ฝํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

์–ด๋А ํ”„๋กœ์„ธ์Šค์—์„œ ํ‚ค ์ œ์•ฝ์„ ์œ„๋ฐ˜ํ•˜๋Š” ์ ‘๊ทผ์„ ์ˆ˜ํ–‰ํ•˜๋ฉด SIGSEGV ์‹œ๊ทธ๋„์„ ๋ฐ›๋Š”๋‹ค. ๊ทธ ์‹œ๊ทธ๋„์—์„œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ •๋ณด์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ sigaction(2)์— ์žˆ๋‹ค.

pkey ๊ธฐ๋Šฅ์„ ์“ฐ๋ ค๋ฉด ํ”„๋กœ์„ธ์„œ์—์„œ ์ด๋ฅผ ์ง€์›ํ•ด์•ผ ํ•˜๊ณ  ํ•ด๋‹น ํ”„๋กœ์„ธ์„œ์—์„œ์˜ ๊ธฐ๋Šฅ ์ง€์›์ด ์ปค๋„์— ํฌํ•จ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. 2016๋…„ ์ดˆ ํ˜„์žฌ ํ–ฅํ›„์˜ ์ธํ…” x86 ํ”„๋กœ์„ธ์Šค๋“ค๋งŒ ์ง€์›ํ•˜๋ฉฐ, ๊ทธ ํ•˜๋“œ์›จ์–ด์—์„œ๋Š” ํ”„๋กœ์„ธ์Šค๋ณ„๋กœ 16๊ฐœ ๋ณดํ˜ธ ํ‚ค๋ฅผ ์ง€์›ํ•œ๋‹ค. ํ•˜์ง€๋งŒ pkey 0์€ ๊ธฐ๋ณธ ํ‚ค๋กœ ์“ฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ ์‘์šฉ ์šฉ๋„๋กœ๋Š” ์ตœ๋Œ€ 15๊ฐœ๊ฐ€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. pkey_mprotect(2)๋ฅผ ํ†ตํ•ด ๋ช…์‹œ์ ์œผ๋กœ pkey๋ฅผ ๋ถ€์—ฌํ•˜์ง€ ์•Š์€ ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ๊ธฐ๋ณธ ํ‚ค๊ฐ€ ๋ถ€์—ฌ๋œ๋‹ค.

๋ณดํ˜ธ ํ‚ค์—๋Š” ์‘์šฉ์— ๋ณด์•ˆ ๋ฐ ์‹ ๋ขฐ์„ฑ ๊ณ„์ธต์„ ๋”ํ•ด ์ค„ ์ž ์žฌ๋ ฅ์ด ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ๋ณด์•ˆ ๊ธฐ๋Šฅ์œผ๋กœ ์„ค๊ณ„๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด WRPKRU๋Š” ์™„์ „ํ•œ ๋น„ํŠน๊ถŒ ์ธ์ŠคํŠธ๋Ÿญ์…˜์ด๊ณ , ๋”ฐ๋ผ์„œ ๊ณต๊ฒฉ์ž๊ฐ€ PKRU ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ํ†ต์ œํ•˜๊ณ  ์žˆ๊ฑฐ๋‚˜ ์ž„์˜ ์ธ์ŠคํŠธ๋Ÿญ์…˜์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” pkey๊ฐ€ ์†Œ์šฉ์—†๋‹ค.

์‘์šฉ์—์„œ๋Š” ๋ณดํ˜ธ ํ‚ค๋ฅผ "๋ˆ„์ถœ"ํ•˜์ง€ ์•Š๋„๋ก ์•„์ฃผ ์กฐ์‹ฌํ•ด์•ผ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์‘์šฉ์—์„œ pkey_free(2) ํ˜ธ์ถœ ์ „์—๋Š” ์–ด๋–ค ๋ฉ”๋ชจ๋ฆฌ์—๋„ ๊ทธ pkey๊ฐ€ ํ• ๋‹น๋˜์–ด ์žˆ์ง€ ์•Š๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค. ์‘์šฉ์—์„œ ํ•ด์ œ๋œ ๊ทธ pkey๋ฅผ ํ• ๋‹น๋œ ์ฑ„๋กœ ๋‘๋ฉด ํ–ฅํ›„ ๊ทธ pkey์˜ ์‚ฌ์šฉ์ž๊ฐ€ ์˜๋„์น˜ ์•Š๊ฒŒ ์ƒ๊ด€์—†๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ์˜ ์ ‘๊ทผ ํ—ˆ๊ฐ€๋ฅผ ๋ฐ”๊พธ๊ฒŒ ๋  ์ˆ˜๋„ ์žˆ์„ ํ…Œ๊ณ , ๊ทธ๊ฒŒ ๋ณด์•ˆ์„ฑ์ด๋‚˜ ์•ˆ์ •์„ฑ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜๋„ ์žˆ๋‹ค. ์ปค๋„์—์„œ๋Š” ํ˜„์žฌ ์‚ฌ์šฉ ์ค‘์ธ pkey์— pkey_free(2) ํ˜ธ์ถœ์„ ํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ๊ทธ๊ฑธ ๋ง‰๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ํ”„๋กœ์„ธ์Šค ๋‚ด์ง€ ๋ฉ”๋ชจ๋ฆฌ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ค„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•„์š”ํ•œ ๊ฒ€์‚ฌ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ์‘์šฉ์˜ ๋ชซ์ด๋‹ค. /proc/[pid]/smaps ํŒŒ์ผ์—์„œ pkey๊ฐ€ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์‘์šฉ์—์„œ ๊ทธ๋Ÿฐ ๊ฒ€์‚ฌ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ณดํ˜ธ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ์‘์šฉ์€ ๋ณดํ˜ธ ํ‚ค ์—†์ด๋„ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์‘์šฉ์ด ๋™์ž‘ํ•˜๋Š” ํ•˜๋“œ์›จ์–ด์—์„œ ์ง€์›ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜, ์ปค๋„ ์ฝ”๋“œ์— ์ง€์›์ด ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š๊ฑฐ๋‚˜, ์ปค๋„ ์ง€์›์ด ๊บผ์ ธ ์žˆ๊ฑฐ๋‚˜, ํ‚ค๊ฐ€ ๋ชจ๋‘ (๊ฒฝ์šฐ์— ๋”ฐ๋ผ์„  ์‘์šฉ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์˜ํ•ด) ํ• ๋‹น๋˜์–ด์„œ ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•  ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ๋ณดํ˜ธ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ์‘์šฉ์—์„œ ๊ธฐ๋Šฅ ์ง€์›์„ ํƒ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ๋ฐฉ์‹์„ ์‹œ๋„ํ•˜๋Š” ๋Œ€์‹  ๊ทธ๋ƒฅ pkey_alloc(2)์„ ํ˜ธ์ถœํ•ด ๋ณด๊ธฐ๋ฅผ ๊ถŒ์žฅํ•œ๋‹ค.

๋ถˆํ•„์š”ํ•œ ์ผ์ด๊ธด ํ•˜์ง€๋งŒ ํ•˜๋“œ์›จ์–ด์˜ ๋ณดํ˜ธ ํ‚ค ์ง€์›์„ cpuid ์ธ์ŠคํŠธ๋Ÿญ์…˜์œผ๋กœ ํ™•์ธํ•ด ๋ณผ ์ˆ˜๋„ ์žˆ๋‹ค. ์ž์„ธํ•œ ๋ฐฉ๋ฒ•์€ Intel Software Developers Manual์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. ์ปค๋„์—์„œ ๊ทธ ํ™•์ธ์„ ํ•ด์„œ /proc/cpuinfo ๋‚ด์˜ "flags" ํ•„๋“œ๋กœ ์ •๋ณด๋ฅผ ๋“œ๋Ÿฌ๋‚ธ๋‹ค. ์ด ํ•„๋“œ์— ๋ฌธ์ž์—ด "pku"๊ฐ€ ์žˆ์œผ๋ฉด ๋ณดํ˜ธ ํ‚ค๋ฅผ ํ•˜๋“œ์›จ์–ด์—์„œ ์ง€์›ํ•œ๋‹ค๋Š” ํ‘œ์‹œ์ด๊ณ  ๋ฌธ์ž์—ด "ospke"๊ฐ€ ์žˆ์œผ๋ฉด ์ปค๋„์— ๋ณดํ˜ธ ํ‚ค ์ง€์›์ด ํฌํ•จ๋˜์–ด ์žˆ๊ณ  ์ผœ์ ธ ์žˆ๋‹ค๋Š” ํ‘œ์‹œ์ด๋‹ค.

์Šค๋ ˆ๋“œ์™€ ๋ณดํ˜ธ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‘์šฉ์—์„œ๋Š” ํŠนํžˆ ์กฐ์‹ฌํ•ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค. ์Šค๋ ˆ๋“œ๋Š” clone(2) ์‹œ์Šคํ…œ ํ˜ธ์ถœ ์‹œ์ ์— ๋ถ€๋ชจ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธ ํ‚ค ๊ถŒํ•œ์„ ๋ฌผ๋ ค๋ฐ›๋Š”๋‹ค. ์‘์šฉ์—์„œ๋Š” clone(2) ํ˜ธ์ถœ ์‹œ์ ์— ์ž๊ธฐ ๊ถŒํ•œ์ด ์ž์‹ ์Šค๋ ˆ๋“œ์—๊ฒŒ ์ ์ ˆํ•˜๋„๋ก ํ•˜๊ฑฐ๋‚˜, ์•„๋‹ˆ๋ฉด ๊ฐ ์ž์‹ ์Šค๋ ˆ๋“œ์—์„œ ์ž์ฒด์ ์œผ๋กœ ๋ณดํ˜ธ ํ‚ค ๊ถŒํ•œ ์ดˆ๊ธฐํ™”๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค.

์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ ๋™์ž‘ ๋ฐฉ์‹

์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋ถˆ๋ฆด ๋•Œ๋งˆ๋‹ค (์ค‘์ฒฉ ์‹œ๊ทธ๋„ ํฌํ•จ) ์ค‘๋‹จ๋œ ๋ฌธ๋งฅ์˜ ๊ถŒํ•œ์„ ๋ฎ๋Š” ์ƒˆ๋กœ์šด ๊ธฐ๋ณธ ๋ณดํ˜ธ ํ‚ค ๊ถŒํ•œ ์„ธํŠธ๊ฐ€ ์Šค๋ ˆ๋“œ์—๊ฒŒ ์ž„์‹œ๋กœ ์ฃผ์–ด์ง„๋‹ค. ์ฆ‰ ์‘์šฉ์—์„œ ์›ํ•˜๋Š” ๊ถŒํ•œ์ด ๊ธฐ๋ณธ ์„ธํŠธ์™€ ๋‹ค๋ฅด๋‹ค๋ฉด ์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ ์ง„์ž… ์งํ›„์— ์›ํ•˜๋Š” ๋ณดํ˜ธ ํ‚ค ๊ถŒํ•œ์„ ์žฌ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค. ์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋ฐ˜ํ™˜ํ•  ๋•Œ ์ค‘๋‹จ๋๋˜ ๋ฌธ๋งฅ์˜ ๊ถŒํ•œ์ด ๋ณต์›๋œ๋‹ค.

์ด๋Ÿฐ ํŠน์ดํ•œ ์‹œ๊ทธ๋„ ๋™์ž‘ ๋ฐฉ์‹์€ (๋ณดํ˜ธ ํ‚ค ์ ‘๊ทผ๊ถŒ์„ ์ €์žฅํ•˜๋Š”) x86 PKRU ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ๋ถ€๋™์†Œ์ˆ˜์  ๋ ˆ์ง€์Šคํ„ฐ์™€ ๊ฐ™์€ ํ•˜๋“œ์›จ์–ด ๋ฉ”์ปค๋‹ˆ์ฆ˜(XSAVE)์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด ์‹œ๊ทธ๋„ ๋™์ž‘ ๋ฐฉ์‹์€ ๋ถ€๋™์†Œ์ˆ˜์  ๋ ˆ์ง€์Šคํ„ฐ์™€ ๋™์ผํ•˜๋‹ค.

๋ณดํ˜ธ ํ‚ค ์‹œ์Šคํ…œ ํ˜ธ์ถœ

๋ฆฌ๋ˆ…์Šค ์ปค๋„์—์„œ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋Š” pkey ๊ด€๋ จ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์€ pkey_mprotect(2), pkey_alloc(2), pkey_free(2)์ด๋‹ค.

๋ฆฌ๋ˆ…์Šค์˜ pkey ์‹œ์Šคํ…œ ํ˜ธ์ถœ์€ CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS ์˜ต์…˜์œผ๋กœ ์ปค๋„์„ ๊ตฌ์„ฑํ•˜์—ฌ ๋นŒ๋“œ ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

EXAMPLE

์•„๋ž˜ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ํ•œ ํŽ˜์ด์ง€๋ฅผ ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ ํ—ˆ๊ฐ€๋กœ ํ• ๋‹นํ•œ๋‹ค. ๊ทธ๋Ÿฌ๊ณ ์„œ ๋ฉ”๋ชจ๋ฆฌ์— ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ์จ๋„ฃ๊ณ  ์„ฑ๊ณต์ ์œผ๋กœ ์ฝ์–ด๋“ค์ธ๋‹ค. ๊ทธ ํ›„์— ๋ณดํ˜ธ ํ‚ค๋ฅผ ํ• ๋‹นํ•˜์—ฌ WRPKRU ์ธ์ŠคํŠธ๋Ÿญ์…˜์œผ๋กœ ๊ทธ ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ๋ถˆํ—ˆํ•ด ๋ณธ๋‹ค. ๊ทธ๋Ÿฌ๊ณ ์„œ ํŽ˜์ด์ง€์— ์ ‘๊ทผ์„ ์‹œ๋„ํ•˜๋Š”๋ฐ, ์ด๋ฒˆ์—๋Š” ์‘์šฉ์— ์น˜๋ช…์  ์‹œ๊ทธ๋„์„ ์ผ์œผํ‚ค๊ฒŒ ๋œ๋‹ค.

$ ./a.out
buffer contains: 73
about to read buffer again...
Segmentation fault (core dumped)

ํ”„๋กœ๊ทธ๋žจ ์†Œ์Šค

#define _GNU_SOURCE
#include <unistd.h>
#include <sys/syscall.h>
#include <stdio.h>
#include <sys/mman.h>

static inline void
wrpkru(unsigned int pkru)
{
    unsigned int eax = pkru;
    unsigned int ecx = 0;
    unsigned int edx = 0;

    asm volatile(".byte 0x0f,0x01,0xef\n\t"
                 : : "a" (eax), "c" (ecx), "d" (edx));
}

int
pkey_set(int pkey, unsigned long rights, unsigned long flags)
{
    unsigned int pkru = (rights << (2 * pkey));
    return wrpkru(pkru);
}

int
pkey_mprotect(void *ptr, size_t size, unsigned long orig_prot,
              unsigned long pkey)
{
    return syscall(SYS_pkey_mprotect, ptr, size, orig_prot, pkey);
}

int
pkey_alloc(void)
{
    return syscall(SYS_pkey_alloc, 0, 0);
}

int
pkey_free(unsigned long pkey)
{
    return syscall(SYS_pkey_free, pkey);
}

#define errExit(msg)    do { perror(msg); exit(EXIT_FAILURE); \
                           } while (0)

int
main(void)
{
    int status;
    int pkey;
    int *buffer;

    /*
     * ๋ฉ”๋ชจ๋ฆฌ ํŽ˜์ด์ง€ ํ•œ ๊ฐœ ํ• ๋‹น
     */
    buffer = mmap(NULL, getpagesize(), PROT_READ | PROT_WRITE,
                  MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
    if (buffer == MAP_FAILED)
        errExit("mmap");

    /*
     * ํŽ˜์ด์ง€์— ์ ๋‹นํ•œ ์ž„์˜ ๋ฐ์ดํ„ฐ ๋„ฃ๊ธฐ (์•„์ง ๊ฑด๋“œ๋ ค๋„ ๊ดœ์ฐฎ์Œ)
     */
    *buffer = __LINE__;
    printf("buffer contains: %d\n", *buffer);

    /*
     * ๋ณดํ˜ธ ํ‚ค ํ• ๋‹น
     */
    pkey = pkey_alloc();
    if (pkey == -1)
        errExit("pkey_alloc");

    /*
     * "pkey"๊ฐ€ ์„ค์ •๋œ ๋ฉ”๋ชจ๋ฆฌ(ํ˜„์žฌ๋Š” ์—†์Œ)์— ๋Œ€ํ•œ ์ ‘๊ทผ ๋„๊ธฐ
     */
    status = pkey_set(pkey, PKEY_DISABLE_ACCESS, 0);
    if (status)
        errExit("pkey_set");

    /*
     * "buffer"์— ๋ณดํ˜ธ ํ‚ค ์„ค์ •.
     * mprotect()์™€ ๊ด€๋ จํ•ด์„  ์—ฌ์ „ํžˆ ์ฝ๊ธฐ/์“ฐ๊ธฐ์ด๋ฉฐ
     * ์•ž์˜ pkey_set()์ด ์ด๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œ ํ•œ๋‹ค.
     */
    status = pkey_mprotect(buffer, getpagesize(),
                           PROT_READ | PROT_WRITE, pkey);
    if (status == -1)
        errExit("pkey_mprotect");

    printf("about to read buffer again...\n");

    /*
     * ์ ‘๊ทผ์„ ๋ถˆํ—ˆํ–ˆ์œผ๋ฏ€๋กœ ์ฃฝ๊ฒŒ ๋จ
     */
    printf("buffer contains: %d\n", *buffer);

    status = pkey_free(pkey);
    if (status == -1)
        errExit("pkey_free");

    exit(EXIT_SUCCESS);
}

SEE ALSO

pkey_alloc(2), pkey_free(2), pkey_mprotect(2), sigaction(2)


2019-03-06

โš ๏ธ **GitHub.com Fallback** โš ๏ธ