Intel CPU Spectre 패치(Retpoline) 와 ν…ŒμŠ€νŠΈ

λ°˜μ‘ν˜•

μ§€λ‚œ Meltdown 취약점 패치λ₯Ό ν†΅ν•΄μ„œ System Call ν•¨μˆ˜ ν˜ΈμΆœμ‹œ 4배의 μ„±λŠ₯이 ν•˜λ½λ˜λŠ” 것을 μ•Œ 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. 


ν•˜μ§€λ§Œ 이 취약점은 Intel CPUμ—μ„œλ§Œ μ‘΄μž¬ν•˜λŠ” 취약점이며 Kernel Page Table Isolation (KPTI) 패치λ₯Ό 톡해 취약점을 κ³ μΉ  수 μžˆμ—ˆκ³ , AMD 및 ARM ν”„λ‘œμ„Έμ„œμ—μ„œλŠ” 영ν–₯이 μ—†μ—ˆμŒμ„ μ•Œ 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.


Spectre 취약점은 이전 ν¬μŠ€νŠΈμ—μ„œλ„ μ„€λͺ…ν•œ 적이 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. κ°„λ‹¨ν•˜κ²Œ λ‹€μ‹œ ν•œ 번 μ„€λͺ…λ“œλ¦¬μžλ©΄, A ν”„λ‘œκ·Έλž¨μ΄ B ν”„λ‘œκ·Έλž¨μ˜ λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό μΉ¨λ²”ν•  수 μžˆλŠ” μ·¨μ•½μ μœΌλ‘œ, ν¬κ²ŒλŠ” 가상 λ¨Έμ‹ μ˜ OSκ°€ Host OS의 μ£Όμ†Œ λ²”μœ„κΉŒμ§€ μΉ¨λ²”ν•  μˆ˜λ„ μžˆλŠ” 맀우 λ¬΄μ„œμš΄ μ·¨μ•½μ μž…λ‹ˆλ‹€. 이 취약점은 Intel CPU 뿐만 μ•„λ‹ˆλΌ, AMD, ARM CPU에도 취약점이 μ‘΄μž¬ν•©λ‹ˆλ‹€.


Spectre 취약점은 2개의 μ’…λ₯˜κ°€ μžˆμŠ΅λ‹ˆλ‹€.


 

 Spectre Variant 1

 Spectre Variant 2 

 λŒ€μƒ μ•„ν‚€ν…μ²˜

 Intel, AMD, ARM 

 Intel, AMD, ARM 

 κ³΅κ²© 방법 

 λΆ„κΈ°λ¬Έ 쀑 μ·¨μ•½ν•œ μ½”λ“œμ—μ„œ 곡격 

 μ•…μ„±μ½”λ“œλ₯Ό ν†΅ν•œ 곡격 

 CVE

 CVE-2017-5753

 CVE-2017-5715 

 νŒ¨μΉ˜ 방법

 μ†Œν”„νŠΈμ›¨μ–΄ μ—…λ°μ΄νŠΈ 패치 

 μ†Œν”„νŠΈμ›¨μ–΄ μ—…λ°μ΄νŠΈ 및 CPU λ§ˆμ΄ν¬λ‘œμ½”λ“œ 패치


아직 Spectre Variant 2 취약점에 λŒ€ν•΄μ„œ AMD CPUμ—μ„œλŠ” 발견된 λ°”κ°€ μ—†μ—ˆμŠ΅λ‹ˆλ‹€. 또, Variant 1에 λŒ€ν•œ νŒ¨μΉ˜μ— λŒ€ν•΄μ„œλŠ” μ„±λŠ₯ μ €ν•˜κ°€ 거의 μ—†μ—ˆκ³ , 곡격 방법 λ˜ν•œ 맀우 κΉŒλ‹€λ‘­κΈ° λ•Œλ¬Έμ—, Meltdown 취약점 λ³΄λ‹€λŠ” κ·Έλ ‡κ²Œ μœ„ν—˜ν•˜μ§€ μ•Šμ€ νŽΈμž…λ‹ˆλ‹€.


ν•˜μ§€λ§Œ Variant 2 취약점은 λ‹€λ₯Έ ν”„λ‘œκ·Έλž¨μ— μ˜ν•΄μ„œ 곡격할 수 있기 λ•Œλ¬Έμ— 이야기가 λ‹€λ¦…λ‹ˆλ‹€. ν•˜μ§€λ§Œ AMD CPU에 λŒ€ν•΄μ„œλŠ” 아직 μ·¨μ•½ν•˜λ‹€κ³  λ‚˜μ˜¨ μ΄μ•ΌκΈ°λŠ” μ—†μŠ΅λ‹ˆλ‹€. ν˜„μž¬ Intelκ³Ό ARM μ•„ν‚€ν…μ²˜μ—μ„œλ§Œ μ·¨μ•½ν•˜λ‹€λŠ” 이야기가 있으며 Googleμ—μ„œλŠ” Android 8.0 ν”Œλž«νΌμ—μ„œ νŒ¨μΉ˜κ°€ 이미 μ§„ν–‰λ˜μ—ˆκ³ , Linux Kernel μ—μ„œλ„ 이미 νŒ¨μΉ˜κ°€ 이루어진 μƒν™©μž…λ‹ˆλ‹€. (단, 각 배포판 별 νŒ¨μΉ˜λŠ” μ œμ™Έ)



Google Retpoline

Google Project Zero νŒ€μ—μ„œλŠ” Spectre 취약점에 λŒ€ν•΄μ„œ μ„±λŠ₯ ν•˜λ½ 이슈 없이 ν•΄κ²°ν•  수 μžˆλ‹€. 라고 μ΄μ•ΌκΈ°ν•œ 적이 μžˆμ—ˆλŠ”λ°, 이 방법이 λ°”λ‘œ Retpoline ν•΄κ²° λ°©λ²•μž…λ‹ˆλ‹€. Googleμ—μ„œλŠ” 이λ₯Ό μ˜€ν”ˆμ†ŒμŠ€ν™”ν•˜μ—¬ κ³΅κ°œν•œ λ°” μžˆμŠ΅λ‹ˆλ‹€.


Google Retpoline


이 방법은 CPU의 투기적 λ™μž‘μ΄λ‚˜ ν•˜λ“œμ›¨μ–΄ κΈ°λŠ₯, ν˜Ήμ€ λ©”λͺ¨λ¦¬ μ£Όμ†Œ ꡬ쑰 λ“±μ˜ 큰 μš”μ†Œλ₯Ό 바꾸지 μ•Šκ³ λ„ λ³΄ν˜Έν•  수 μžˆλŠ” λ°©λ²•μœΌλ‘œ μ‹€μ œ KVM, Xen 같은 가상 ν™˜κ²½μ—μ„œ κ³΅κ²©ν•˜λŠ” 것을 μΆ©λΆ„νžˆ 방지할 수 μžˆμŠ΅λ‹ˆλ‹€.



패치 적용

μ§€λ‚œ λ©œνŠΈλ‹€μš΄ 패치 ν…ŒμŠ€νŠΈμ— μ΄μ–΄μ„œ μ΄λ²ˆμ—” μŠ€νŽ™νƒ€ μ·¨μ•½μ μ˜ 패치λ₯Ό μ§„ν–‰ν•˜μ˜€μŠ΅λ‹ˆλ‹€. μ§€λ‚œ λ©œνŠΈλ‹€μš΄ νŒ¨μΉ˜λŠ” λ¦¬λˆ…μŠ€ 컀널에 Meltdown 패치 μ˜΅μ…˜μ„ μ£ΌλŠ” κ²ƒλ§ŒμœΌλ‘œ κ°„λ‹¨νžˆ 컀널을 컴파일 ν•  수 μ—ˆμ—ˆμ§€λ§Œ, 이번 νŒ¨μΉ˜λŠ” 패치 μ˜΅μ…˜λ§ŒμœΌλ‘œ 컴파일 λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.


Retpoline νŒ¨μΉ˜κ°€ 적용된 컀널을 컴파일 ν•˜κΈ° μœ„ν•΄ μ•„λž˜μ˜ 쀀비물이 ν•„μš”ν•©λ‹ˆλ‹€.


- Linux Kernel 4.15-rc9

- GCC 7.2.1 λ²„μ „μ˜ Retpoline μ΄μŠˆκ°€ 적용된 컴파일러


λ¦¬λˆ…μŠ€ 컀널 μ†ŒμŠ€λ₯Ό κ΅¬ν•΄μ„œ μ»΄νŒŒμΌμ„ ν•  λ•Œ, λ°˜λ“œμ‹œ GCC 7.2.1 컴파일러λ₯Ό μš”κ΅¬ν•©λ‹ˆλ‹€. 각각의 ν”„λ‘œκ·Έλž¨ μ†ŒμŠ€λŠ” μ•„λž˜μ˜ λ²„νŠΌμ„ 톡해 ꡬ할 수 μžˆμŠ΅λ‹ˆλ‹€.


Linux Source GNU C Compiler Source


μ €μ˜ 경우, Ubuntu 17.10 곡식 λ ˆν¬μ§€ν„°λ¦¬μ—μ„œ GCC 7.2.1 컴파일러λ₯Ό ꡬ할 수 μ—†μ–΄ 직접 μ†ŒμŠ€ μ„€μΉ˜λ₯Ό μ§„ν–‰ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 


μžμ‹ μ˜ μ»΄νŒŒμΌλŸ¬κ°€ μ΄λ ‡κ²Œ 7.2.1 20180118 이후 λ²„μ „μ˜ 컴파일러λ₯Ό 가진 μƒνƒœμ—μ„œ 컀널 μ˜΅μ…˜μ— Retpoline 패치λ₯Ό μ€€ λ‹€μŒμ—μ•Ό Google Retpoline νŒ¨μΉ˜κ°€ μ μš©λ©λ‹ˆλ‹€.



패치 확인 및 ν…ŒμŠ€νŠΈ

컀널을 λΉŒλ“œν•˜κ³  μ„€μΉ˜ν–ˆλ‹€λ©΄, 이제 Google Retpoline νŒ¨μΉ˜κ°€ μ μš©λ˜μ—ˆλŠ”μ§€ 확인해보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€.

Spectre Variant 2 취약점 λΆ€λΆ„μ—μ„œ, Full generic retpoline ν‘œμ‹œκ°€ λ‚˜νƒ€λ‚˜λ©΄, Retpoline νŒ¨μΉ˜κ°€ 적용된 κ²ƒμž…λ‹ˆλ‹€.


μ €μ˜ 경우, 취약점 패치 도ꡬ인 Spectre-meltdown-checker둜 ν™•μΈν•˜μ˜€μ§€λ§Œ, μ‹€μ œλ‘œ 곡식적인 확인 방법은 λ‹€μŒμ˜ 컀널 값을 톡해 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.


# cat /sys/devices/system/cpu/vulnerabilities/spectre_v2 

μœ„μ˜ 값을 좜λ ₯ν•΄μ„œ Full generic retpoline이 λ‚˜μ˜€λ©΄ 적용된 κ²ƒμž…λ‹ˆλ‹€. 

λ§Œμ•½ μ œκ°€ μ‚¬μš©ν•œ 취약점 패치 도ꡬλ₯Ό μ‚¬μš©ν•˜κ³ μž ν•œλ‹€λ©΄, μ•„λž˜μ˜ Github 링크λ₯Ό μ‚¬μš©ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€.

(https://github.com/speed47/spectre-meltdown-checker)


패치 적용이 ν™•μΈλ˜μ—ˆμœΌλ‹ˆ, λ°”λ‘œ ν…ŒμŠ€νŠΈ 해보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€.


ν…ŒμŠ€νŠΈλŠ” μ§€λ‚œλ²ˆ Meltdown νŒ¨μΉ˜μ—μ„œ μ„±λŠ₯ ν•˜λ½μœΌλ‘œ μ΄μŠˆκ°€ λ˜μ—ˆλ˜ System Call ν•¨μˆ˜μ™€ File I/O λ§Œμ„ Test ν•˜μ˜€μŠ΅λ‹ˆλ‹€.



SystemCall Test

μ§€λ‚œλ²ˆκ³Ό λ™μΌν•˜κ²Œ 1μ–΅ 번의 System Call ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜μ—¬ μ–Όλ§ˆλ§ŒνΌμ˜ μ‹œκ°„μ΄ κ±Έλ¦¬λŠ”μ§€λ₯Ό ν…ŒμŠ€νŠΈν•˜μ˜€μŠ΅λ‹ˆλ‹€.


Retpoline 패치 μ „μ˜ κ²°κ³Όμž…λ‹ˆλ‹€. λ‹¨μˆœνžˆ Meltdown νŒ¨μΉ˜λ§Œμ„ μ μš©ν•΄μ„œ, Meltdown 패치 μ „μ˜ 결과와 4λ°° μ •λ„μ˜ 차이 κ·ΈλŒ€λ‘œμ˜ λͺ¨μŠ΅μž…λ‹ˆλ‹€.


Retpoline 패치 이후, μ„±λŠ₯ λ³€ν™”κ°€ 거의 μ—†μŠ΅λ‹ˆλ‹€.




File I/O Test

File I/O λΆ€λΆ„ ν…ŒμŠ€νŠΈλ„ μ§€λ‚œ 번 Meltdown νŒ¨μΉ˜μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ SSDμ—μ„œ ν…ŒμŠ€νŠΈλ₯Ό μ§„ν–‰ν•˜μ˜€μŠ΅λ‹ˆλ‹€.


패치 μ „μ˜ ν…ŒμŠ€νŠΈμž…λ‹ˆλ‹€. Meltdown μ„±λŠ₯ 체감 영ν–₯은 μ‘΄μž¬ν•©λ‹ˆλ‹€.


Retpoline 패치 적용 ν›„ λͺ¨μŠ΅μž…λ‹ˆλ‹€. μ—­μ‹œ μ„±λŠ₯ λ³€ν™”κ°€ 거의 μ‘΄μž¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€..



ν…ŒμŠ€νŠΈ κ²°λ‘ ... (Intel vs Google)

Meltdown νŒ¨μΉ˜μ— μžˆμ–΄μ„œ μ„±λŠ₯ 체감 λ³€ν™”κ°€ λ„ˆλ¬΄ 심해, Spectre 취약점 νŒ¨μΉ˜μ—μ„œλ„ μ„±λŠ₯ 체감이 더 μžˆλ‹€κ³  ν•œλ‹€ ν•˜μ—¬ ꡉμž₯히 κΈ΄μž₯ν–ˆμ§€λ§Œ, λ‹€ν–‰νžˆ Google Retpoline νŒ¨μΉ˜μ—μ„œλŠ” μ„±λŠ₯ λ³€ν™”κ°€ μ‘΄μž¬ν•˜μ§€ μ•Šμ•„ μ‘°κΈˆμ€ μ•ˆλ„ ν–ˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ˜ˆμ™Έ 사항이 μžˆμŠ΅λ‹ˆλ‹€..


μ‹€μ œλ‘œ Intel CPU Spectre v2λ₯Ό νŒ¨μΉ˜ν•˜λŠ” λ°©λ²•μ—λŠ” 2가지 방법이 μ‘΄μž¬ν•©λ‹ˆλ‹€. 첫 번째 방법은 Intel CPU의 λ§ˆμ΄ν¬λ‘œμ½”λ“œλ₯Ό μˆ˜μ •ν•œ 방법인데, 이 방법을 μ΄μš©ν•˜λ©΄ μ»€λ„μ—μ„œλŠ” IBRS, IBPB, STIBP κΈ°λŠ₯이 ν™œμ„±ν™”λ©λ‹ˆλ‹€. 이 κΈ°λŠ₯이 ν™œμ„±ν™” 되면, Intelμ—μ„œλŠ” 일뢀 CPU μ„±λŠ₯이 μ €ν•˜λœλ‹€κ³  ν•©λ‹ˆλ‹€. 
(κ³΅κ΅λ‘­κ²Œλ„ μ €μ˜ CPUλŠ” 아직 λ§ˆμ΄ν¬λ‘œμ½”λ“œ νŒ¨μΉ˜κ°€ μ§„ν–‰λ˜μ–΄ μžˆμ§€ μ•Šμ•„ 이 뢀뢄에 λŒ€ν•΄μ„œλŠ” ν…ŒμŠ€νŠΈν•  수 μ—†μ—ˆμŠ΅λ‹ˆλ‹€..)


- IBRS: κ°„μ ‘λΆ„κΈ° κΈ°λŠ₯을 λ„λŠ” ν”Œλž˜κ·Έμž…λ‹ˆλ‹€. μ•„μ˜ˆ κ°„μ ‘λΆ„κΈ° κΈ°λŠ₯ 자체λ₯Ό λͺ»ν•˜λ„둝 λ§‰λŠ” 것이죠.

- IBPB: 컀널 μ˜μ—­ <--> μ‚¬μš©μž μ˜μ—­κ°„ μ»¨ν…μŠ€νŠΈ μŠ€μœ„μΉ­μ΄ λ°œμƒν•  경우, BTBλ₯Ό μ „λΆ€ μ΄ˆκΈ°ν™”(κ°„μ ‘λΆ„κΈ° μ΄ˆκΈ°ν™”) μž‘μ—…μ„ 톡해 λ‹€λ₯Έ μ‚¬μš©μžκ°€ BTBλ₯Ό λ³Ό 수 없도둝 ν•˜λŠ” κΈ°λŠ₯

- STIBP: 단일 ν”„λ‘œμ„Έμ„œμ—μ„œ ν•˜μ΄νΌμŠ€λ ˆλ”©/SMTκ°€ λ™μž‘ν•  λ•Œ, 각 μŠ€λ ˆλ“œ κ°„ λ©”λͺ¨λ¦¬ μ˜μ—­μ„ λ³΄ν˜Έν•˜λŠ” κΈ°λŠ₯


두 번째 방법은 Googleμ—μ„œ μ œμ•ˆν•œ Retpoline 패치 방법을 μ΄μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 이 패치 방법은 μ†Œν”„νŠΈμ›¨μ–΄ 패치둜 진행할 수 있으며 CPU λ§ˆμ΄ν¬λ‘œμ½”λ“œκ°€ μˆ˜μ •λ˜μ§€ μ•Šμ€ μƒνƒœμ—μ„œλ„ 취약점 νŒ¨μΉ˜κ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€. 더 쒋은 것은 μ„±λŠ₯ μ €ν•˜κ°€ 거의 μ—†λ‹€λŠ” κ²ƒμ΄μ§€μš”. 취약점을 λ§‰λŠ” 방식은 Google Retpoline 곡식 λ¬Έμ„œμ— λ‚˜μ˜¨ κ²ƒμ²˜λŸΌ κ°„μ ‘ λΆ„κΈ°λ₯Ό 예츑 μ‹€ν–‰ν•˜μ—¬ 곡격 μ½”λ“œλ₯Ό 격리 μ‹œν‚€λŠ” λ°©λ²•μž…λ‹ˆλ‹€. μ‹€μ œ Googleμ—μ„œλŠ” 이 패치 방법을 Google Cloud Platform, Android, Google Chrome λΈŒλΌμš°μ €μ— μ μš©ν•˜μ˜€μŠ΅λ‹ˆλ‹€.


Google Chrome 63 버전 이상을 μ‚¬μš©ν•˜κ³  계신닀면, μ•„λž˜μ˜ 링크λ₯Ό ν†΅ν•΄μ„œ ν™œμ„±ν™” ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이 방법은 Spectre v2 취약점을 μ΄μš©ν•œ 곡격을 μ˜μ‹¬ν•˜λ©΄ μ‚¬μ΄νŠΈλ₯Ό 격리 μ‹œν‚€λŠ” κΈ°λŠ₯μž…λ‹ˆλ‹€. ν•˜μ§€λ§Œ 이 방법은 아직 μ•ˆμ •ν™”λœ 것이 μ•„λ‹ˆλ―€λ‘œ μ°Έκ³ ν•˜μ…”μ„œ μ‚¬μš©ν•˜μ‹œκΈ° λ°”λžλ‹ˆλ‹€.

(링크: chrome://flags/#enable-site-per-process)



마치며...

μ—¬κΈ°κΉŒμ§€ Linux 운영체제λ₯Ό μ΄μš©ν•˜μ—¬ Spectre 패치 진행과 μ„±λŠ₯을 ν…ŒμŠ€νŠΈ ν•΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€. μ €μ˜ μž…μž₯μ—μ„œλŠ” λ§ˆμ΄ν¬λ‘œμ½”λ“œλ₯Ό νŒ¨μΉ˜ν•œ μ„±λŠ₯ ν…ŒμŠ€νŠΈλ„ 맛보고 μ‹Άμ—ˆμ§€λ§Œ, μ•„μ‰½κ²Œλ„ 이 뢀뢄은 눈으둜 보지 λͺ»ν•œ 점, ν•˜μ§€λ§Œ λ‹€ν–‰νžˆλ„ μ„±λŠ₯ μ΄μŠˆκ°€ 이만큼으둜 λ§ˆλ¬΄λ¦¬λ˜μ–΄μ„œ 닀행이라 μƒκ°ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.


ν˜„μž¬ Windows μš΄μ˜μ²΄μ œμ—μ„œλŠ” IBRS, IBPB, STIBPλ₯Ό μ‚¬μš©ν•œ Spectre v2 νŒ¨μΉ˜μ— λ¬Έμ œκ°€ μžˆλŠ” 점을 ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€. 일뢀 CPU λͺ¨λΈμ—μ„œ μžλ™μœΌλ‘œ μš΄μ˜μ²΄μ œκ°€ μž¬λΆ€νŒ… λ˜λŠ” ν˜„μƒμ΄ μžˆλ‹€κ³  ν•˜λ‹ˆ, ν•΄λ‹Ή 뢀뢄을 μ£Όμ˜ν•˜μ‹œκ³ , 패치λ₯Ό μ§„ν–‰ν•΄μ£Όμ‹œκΈ° λ°”λžλ‹ˆλ‹€.μ•„λ§ˆ μ‘°λ§Œκ°„ Windowsμ—μ„œλ„ Google Retpoline 패치 방법을 μ μš©ν•˜μ—¬ λ‹€μ‹œ 내놓지 μ•Šμ„κΉŒ λΌλŠ” μ €μ˜ 개인적인 μƒκ°μž…λ‹ˆλ‹€.


μ—¬κΈ°κΉŒμ§€ Spectre 패치 ν…ŒμŠ€νŠΈλ₯Ό λ§ˆμΉ˜λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.



[μ°Έκ³ ]: http://www.hwbattle.com/bbs/board.php?bo_table=cpumbram&wr_id=98565


λ°˜μ‘ν˜•
TAGS.

Tistory Comments