์„ฑ๊ธ‰ํ•œ ์ˆ˜์ •์œผ๋กœ ์ธํ•ด Linux ์ปค๋„์˜ Spectre ์ทจ์•ฝ์ ์ด ๋ถˆ์™„์ „ํ•˜๊ฒŒ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Grsecurity ํ”„๋กœ์ ํŠธ์˜ ๊ฐœ๋ฐœ์ž ๊ณต์œ  ์ปดํŒŒ์ผ๋Ÿฌ ๊ฒฝ๊ณ ๋ฅผ ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ์ œ๊ฑฐํ•˜๋ฉด ์ฝ”๋“œ์˜ ์ทจ์•ฝ์ ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒฝ๊ณ  ์ด์•ผ๊ธฐ์ž…๋‹ˆ๋‹ค. XNUMX์›” ๋ง์— ptrace ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ํ†ตํ•ด Spectre ์ทจ์•ฝ์ ์„ ์•…์šฉํ•˜๋Š” ์ƒˆ๋กœ์šด ๋ฒกํ„ฐ์— ๋Œ€ํ•ด Linux ์ปค๋„์— ๋Œ€ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์ด ์ œ์•ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํŒจ์น˜๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋™์•ˆ ๊ฐœ๋ฐœ์ž๋Š” ๋นŒ๋“œํ•  ๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ฝ”๋“œ์™€ ์ •์˜ ํ˜ผํ•ฉ์— ๋Œ€ํ•œ ๊ฒฝ๊ณ ๋ฅผ ํ‘œ์‹œํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค(๊ตฌ์กฐ๋Š” ์ฝ”๋“œ ๋’ค์— ์ •์˜๋˜์–ด ๊ธฐ์กด ๋ณ€์ˆ˜์— ๊ฐ’์„ ํ• ๋‹นํ•จ).

int ์ธ๋ฑ์Šค = n;
if (n < HBP_NUM) { index = array_index_nospec(index, HBP_NUM); struct perf_event *bp = ์Šค๋ ˆ๋“œ->ptrace_bps[index];

๋ฆฌ๋ˆ„์Šค๊ฐ€ ๋ฐ›์•„๋“ค์ธ๋‹ค ์ˆ˜์ • ๋งˆ์Šคํ„ฐ ๋ธŒ๋žœ์น˜๋กœ, ์ œ๊ฑฐํ•œ ํ›„ ๋ณ€์ˆ˜ ์ •์˜๋ฅผ if ๋ธ”๋ก์œผ๋กœ ์ด๋™ํ•˜์—ฌ ๊ฒฝ๊ณ ์—์„œ:

if (n < HBP_NUM) { int index = array_index_nospec(n, HBP_NUM); struct perf_event *bp = ์Šค๋ ˆ๋“œ->ptrace_bps[index];

4.4์›”์—๋Š” ์ˆ˜์ • ์‚ฌํ•ญ์ด ์•ˆ์ •์ ์ธ ์ปค๋„ ๋ถ„๊ธฐ 4.9, 4.14, 4.19, 5.2 ๋ฐ XNUMX์—๋„ ํฌํŒ…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์•ˆ์ •์ ์ธ ๋ธŒ๋žœ์น˜์˜ ๊ด€๋ฆฌ์ž๋“ค๋„ ๊ฒฝ๊ณ ๋ฅผ ์ ‘ํ–ˆ๊ณ , Linus์˜ ๋งˆ์Šคํ„ฐ ๋ธŒ๋žœ์น˜์—์„œ ์ด๋ฏธ ์ˆ˜์ •๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋Œ€์‹  ์Šค์Šค๋กœ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์‹ค์ œ๋กœ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜์ง€ ์•Š๊ณ  ๋‹จ์ง€ ์›€์ง์ด๋Š” ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•  ๋•Œ ์ทจ์•ฝ์ ์— ๋Œ€ํ•œ ๋ณดํ˜ธ๋ฅผ ์ง์ ‘ ์ œ๊ณตํ•˜๋Š” array_index_nospec์— ๋Œ€ํ•œ ํ˜ธ์ถœ์ด ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ณ  "index" ๋ณ€์ˆ˜ ๋Œ€์‹  ํ•ญ์ƒ "n" ๋ณ€์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋˜๋„๋ก ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

int ์ธ๋ฑ์Šค = n;
if (n < HBP_NUM ){ struct perf_event *bp = thread->ptrace_bps[index];
index = array_index_nospec(index, HBP_NUM);

์ถœ์ฒ˜ : opennet.ru

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€