Zenbleed तकनीक
(lock.cmpxchg8b.com)- Zenbleed AMD Zen 2 श्रृंखला में एक ऐसी कमजोरी है जो गलत अनुमानित
vzeroupperrecovery का दुरुपयोग करके उसी physical core की vector register file में बचे डेटा को पढ़ने देती है - इसे CVE-2023-20593 के रूप में दर्ज किया गया है, और Ryzen 3000/4000/5000 with Radeon Graphics/7020 with Radeon Graphics, Ryzen PRO, Threadripper 3000, EPYC “Rome” जैसे Zen 2 product परिवार इसके प्रभाव क्षेत्र में आते हैं
- हमला तब संभव होता है जब XMM Register Merge Optimization, register rename, और गलत अनुमानित
vzeroupperएक बहुत संकरे समय-खंड में लगातार घटित हों;strlen,memcpy,strcmpजैसे बुनियादी operations भी अवलोकन के दायरे में आ सकते हैं - optimized variant प्रति core लगभग 30KB प्रति सेकंड तक data leak कर सकता है, और VM·sandbox·container·process boundary के पार उसी physical core की register file sharing समस्या बनती है
- AMD microcode update लागू करने की सिफारिश की जाती है; अस्थायी रूप से
DE_CFG[9]chicken bit सेट किया जा सकता है, लेकिन इसकी performance cost हो सकती है और सिर्फ SMT disable करना पर्याप्त नहीं है
Zenbleed किस execution unit को निशाना बनाता है
- x86-64 CPU में 128-bit XMM vector registers होते हैं, और आधुनिक CPU इन्हें 256-bit YMM, 512-bit ZMM तक बढ़ाते हैं
- vector registers केवल numerical computation में ही नहीं, बल्कि glibc के
strcmp,memcpy,strlenजैसे standard C library functions में भी उपयोग होते हैं - glibc का AVX2-optimized
strlenstring में पहले nul byte की स्थिति खोजने के लिए कई vector instructions को जोड़ता हैvpxor xmm0,xmm0,xmm0सेymm0के निचले हिस्से को 0 किया जाता हैvpcmpeqb ymm1,ymm0,[rdi]से string bytes की 0 byte से तुलना की जाती हैvpmovmskb eax,ymm1से comparison result को general register में लाया जाता हैtzcnt eax,eaxसे पहले nul byte की स्थिति निकाली जाती है
vzeroupper और register file
vzerouppervector register के upper bits को 0 करने वाला instruction है- जब
XMMऔरYMMregisters को मिलाकर उपयोग किया जाता है, तोXMMregister पूरी width तक promote हो जाता है, और इस प्रक्रिया में upper-bit dependency बन सकती है - glibc अनावश्यक stall से बचने के लिए
vzeroupperका उपयोग करता है ताकि बाद का result upper bits पर निर्भर न रहे - CPU हर register को किसी fixed physical location पर नहीं रखता; वह Register File और Register Allocation Table के जरिए physical register allocation संभालता है
XMMregister को 0 करते समय CPU वास्तविक bits store किए बिना RAT में z-bit flag सेट कर सकता है- यह flag
YMMregister के upper और lower हिस्सों पर स्वतंत्र रूप से लागू हो सकता है vzeroupperz-bit सेट करने के बाद register file से संबंधित resource को मुक्त कर सकता है
- यह flag
speculative execution recovery में पैदा होने वाली कमजोरी
- आधुनिक CPU speculative execution का उपयोग करते हैं, इसलिए गलत अनुमानित branch पर चली operations को rollback करना पड़ता है
- समस्या यह है कि गलत अनुमानित
vzeroupperके execute होने के बाद recovery के समय केवल z-bit को वापस करना पहले से मुक्त किए जा चुके register file resource की स्थिति को सही ढंग से restore नहीं कर पाता - सटीक scheduling के जरिए कुछ processors को गलत अनुमानित
vzeroupperसे गलत तरह recover करने के लिए मजबूर किया जा सकता है - यही तकनीक CVE-2023-20593 है, और यह पूरी Zen 2 श्रृंखला को प्रभावित करती है
- AMD Ryzen 3000 Series Processors
- AMD Ryzen PRO 3000 Series Processors
- AMD Ryzen Threadripper 3000 Series Processors
- AMD Ryzen 4000 Series Processors with Radeon Graphics
- AMD Ryzen PRO 4000 Series Processors
- AMD Ryzen 5000 Series Processors with Radeon Graphics
- AMD Ryzen 7020 Series Processors with Radeon Graphics
- AMD EPYC “Rome” Processors
हमले की शर्तें और data leak की सीमा
- bug को trigger करने के लिए XMM Register Merge Optimization, register rename, और गलत अनुमानित
vzeroupperको एक सटीक समय-खंड में लगातार होना चाहिए - उदाहरण instruction sequence निम्न संरचना का उपयोग करता है
vcvtsi2s{s,d}से merge optimization trigger किया जाता हैvmovdqaसे register rename trigger किया जाता है- अगर conditional branch वास्तव में taken है लेकिन CPU not-taken path का अनुमान लगाता है, तो
vzeroupperगलत अनुमान के साथ execute होता है और bug trigger हो जाता है
strlen,memcpy,strcmpजैसे बुनियादी operations भी vector registers का उपयोग करते हैं, इसलिए वे सिस्टम में कहीं भी चलें, अवलोकन का लक्ष्य बन सकते हैं- क्योंकि register file उसी physical core पर साझा होती है, इसलिए अन्य VM, sandbox, container और process भी प्रभाव के दायरे में आते हैं
- दो hyperthreads एक ही physical register file साझा करते हैं
- हमले का optimized variant प्रति core लगभग 30KB प्रति सेकंड data leak कर सकता है, जो logged-in user की cryptographic keys और passwords की निगरानी के लिए पर्याप्त गति है
- technical advisory और संबंधित code, Google के security research repository में सार्वजनिक किए गए हैं
- testing code Linux के लिए दिया गया है, लेकिन bug किसी खास operating system पर निर्भर नहीं है, इसलिए सभी operating systems प्रभावित हैं
खोज की विधि: CPU fuzzing और Oracle Serialization
- इस कमजोरी की खोज fuzzing से हुई
- CPU उद्योग भी hardware defects खोजने के लिए silicon निर्माण के बाद post-silicon validation करता है
- सामान्य coverage-based fuzzing के विपरीत, CPU में code coverage से सीधे मेल खाने वाला कोई metric नहीं होता
- इसके बजाय performance counters का उपयोग करके दिलचस्प architectural events को fuzzer के लिए feedback के रूप में दिया जाता है
- इस तरीके से ऐसे instruction sequences खोजे जा सकते हैं जिन्हें संयोग से ढूँढना मुश्किल होता
- merge optimization जैसी सुविधाएँ स्वचालित रूप से खोजी जा सकीं
- software fuzzing आम तौर पर crash ढूँढती है, लेकिन randomly generated CPU programs में crash स्वयं सही व्यवहार भी हो सकता है
- पहले के approaches में से एक reversi है, जो हर random instruction के लिए inverse operation बनाकर देखता है कि final state शुरुआती state से अलग है या नहीं
- x86 जैसी CISC architecture में testcase generation जटिल हो जाता है
- एक और तरीका oracle का उपयोग करके test CPU के परिणामों की तुलना किसी दूसरे CPU या simulator से करना है
- Oracle Serialization इन दोनों विचारों को जोड़ता है
- पहले random program बनाया जाता है, फिर उसे serialized रूप में स्वतः बदला जाता है
- store/load barrier, speculation fence, cache line flush जैसे serialization elements जोड़े जाते हैं
- मूल और serialized program की performance characteristics अलग हो सकती हैं, लेकिन उनका output समान होना चाहिए
- अगर final state मेल नहीं खाती, तो यह microarchitectural execution error हो सकता है, और यही mismatch Zenbleed की खोज तक ले गया
mitigation और detection की सीमाएँ
- इस कमजोरी की रिपोर्ट 15 मई 2023 को AMD को की गई थी
- AMD ने प्रभावित processors के लिए microcode update जारी किया
- संभव है कि BIOS या operating system vendor ने पहले से यह update शामिल करने वाला patch उपलब्ध करा दिया हो
- अनुशंसित mitigation microcode update लागू करना है
- जब update लागू नहीं किया जा सकता, तब software workaround के रूप में
DE_CFG[9]chicken bit सेट किया जा सकता है- इसकी performance cost हो सकती है
- Linux में
msr-toolsके जरिए इसे सभी cores पर सेट किया जा सकता है - FreeBSD में
cpucontrol(8)का उपयोग किया जाता है - अन्य operating systems में MSR कैसे सेट करना है यह न पता हो तो vendor support की जरूरत होगी
- सिर्फ SMT disable करना पर्याप्त नहीं है
- किसी भरोसेमंद attack detection technique के बारे में जानकारी नहीं है
- क्योंकि इसके लिए किसी खास system call या privilege की जरूरत नहीं होती
vzeroupperके अनुचित उपयोग को statically detect करना भी संभव नहीं है
1 टिप्पणियां
Hacker News की राय
यह वाकई बहुत दिलचस्प है, और VM में चलाने भर से सुरक्षित नहीं हो जाता का एक क्लासिक उदाहरण बन सकता है
VM escape के बारे में हमेशा से पता था, लेकिन यह बिना escape के भी लागू करने में आसान और असर के लिहाज से बड़ा, व्यापक vulnerability है
इस bug का microcode से fix हो जाना यह नहीं बताता कि ऐसे मिलते-जुलते दूसरे bug नहीं हैं। कई 0-day के बारे में अक्सर भाड़े के black hat लोगों को सार्वजनिक होने से बहुत पहले ही पता होता है
हाल के वर्षों में मिले CPU vulnerabilities:
https://en.wikipedia.org/wiki/Meltdown_(security_vulnerability)
https://en.wikipedia.org/wiki/Spectre_(security_vulnerability)
https://aepicleak.com/
https://en.wikipedia.org/wiki/Software_Guard_Extensions#SGAxe
https://en.wikipedia.org/wiki/Software_Guard_Extensions#LVI
https://en.wikipedia.org/wiki/Software_Guard_Extensions#Plundervolt
https://en.wikipedia.org/wiki/Software_Guard_Extensions/…
https://en.wikipedia.org/wiki/Software_Guard_Extensions#Enclave_attack
https://en.wikipedia.org/wiki/Software_Guard_Extensions/…
https://www.vusec.net/projects/crosstalk/
https://en.wikipedia.org/wiki/Hertzbleed
https://securityweek.com/amd-processors-expose-sensitive-data-new-squi…
यह कोई बड़ा
switchstatement चलाकर instructions interpret नहीं करती, बल्कि असली CPU पर instructions execute करती है, और कुछ hardware flags पर निर्भर करती है जो यह गारंटी देने वाले माने जाते हैं कि data या instructions आपस में overlap नहीं होंगे। CPU यह वादा तो करता है, लेकिन व्यवहार में ऐसे वादे निभाना मुश्किल हैवहाँ CPU ने वही किया जो उसे करना था, लेकिन timing-based तरीके से एक बिल्कुल नया attack संभव हुआ; जबकि Zenbleed पारंपरिक bug के ज्यादा करीब है, जहाँ ऐसा data register में रह जाता है जिसे वहाँ नहीं होना चाहिए
मुझे लगता है कि ऐसी कई vulnerabilities की जड़ software और hardware पक्ष के बीच सही संवाद न होना है। software isolation guarantee मानकर चलता है, और hardware उस तरह की assumptions बनने पर पर्याप्त चेतावनी नहीं देता
branch prediction स्वभाव से ही इतनी जटिल लगती है कि वह हमेशा इस तरह की vulnerabilities के लिए खुली रहेगी, या फिर code path और instruction execution को सहज रूप से समझने के हमारे तरीके से इतनी अलग है कि बहुत देर होने से पहले boundary conditions का ध्यान ही नहीं आता
क्या CPU architecture की जटिलता एक बिंदु के बाद इतनी बढ़ जाएगी कि लोग इसे सरल रखने के बदले performance hit स्वीकार करने लगें?
मैंने इस पर ध्यान दिलाया और सलाह दी कि इन्हें अलग hypervisor पर air-gap करना चाहिए, लेकिन मेरी बात हमेशा अनदेखी कर दी गई। अब शायद उसका नुकसान उन्हें ही उठाना पड़ेगा
exploit tar फ़ाइल के README में ज़्यादा विस्तृत जानकारी और public schedule शामिल है
2023-05-09CPU validation pipeline का एक component असामान्य परिणाम बना रहा था2023-05-12समस्या को सफलतापूर्वक isolate और reproduce किया गया, जाँच जारी रही2023-05-14समस्या के दायरे और गंभीरता का पता लगाया गया2023-05-15एक संक्षिप्त status report लिखकर AMD PSIRT के साथ साझा की गई2023-05-17AMD ने रिपोर्ट की पुष्टि की और माना कि इसे reproduce किया जा सकता है2023-05-17भरोसेमंद PoC का development पूरा करके AMD के साथ साझा किया गया2023-05-19प्रमुख kernel और hypervisor vendors को सूचित करना शुरू किया गया2023-05-23AMD से Rome के लिए beta microcode update मिला2023-05-24पुष्टि की गई कि update समस्या को ठीक करता है और AMD को सूचित किया गया2023-05-30AMD ने बताया कि उसने partners को security bulletin भेज दिया है2023-06-12स्थिति और विवरण पर चर्चा के लिए AMD के साथ meeting हुई2023-07-20AMD ने तय embargo date से पहले बिना सूचना patch जारी कर दिया2023-07-21चूँकि fix सार्वजनिक हो चुका था, इसलिए प्रमुख distributions को firmware package update तैयार करने के लिए निजी तौर पर सूचित करने का प्रस्ताव रखा गया2023-07-24सार्वजनिक disclosureतय embargo से पहले patch जारी कर दिया गया, और उसके बाद यह बात निजी तौर पर कहने की नौबत आई कि प्रमुख distributions को firmware package तैयार करना चाहिए
amd-ucode 20230625.ee91452d-5इस समस्या को ठीक करने वाला microcode update शामिल करता है या नहींhttps://archlinux.org/packages/core/any/amd-ucode/ को आख़िरी बार 2023-07-25 11:48 UTC पर update किया गया था, और https://git.kernel.org/pub/scm/linux/kernel/git/firmware/lin... में fix version 2023-07-18 बताया गया है
शुरुआत में PKGBUILD के
_tag=20230625औरsource=("git+[https://git.kernel.org/pub/scm/linux/kernel/git/firmware/lin...](<https://git.kernel.org/pub/scm/…;)")की वजह से लगा कि अभी भी 20230625 firmware ही इस्तेमाल हो रहा हैलेकिन
_backportsarray में 20 घंटे पहले edit किए गए दो cherry-pick commits हैं, और https://gitlab.archlinux.org/archlinux/packaging/packages/li... काb250b32ab1d044953af2dc5e790819a7703b7ee6वही kernel.org commit है जिसका ऊपर link दिया गया है, इसलिए उम्मीद है कि नवीनतम Arch Zenbleed के प्रति vulnerable नहीं होगायह सच में डरावना है। मेरे Zen 2 सिस्टम Ryzen 3600 पर unprivileged user के रूप में exploit चलाकर, और background में चल रहे text editor (Kate) में एक string copy-paste करने पर, कुछ ही सेकंड में उस string के टुकड़े zenbleed output में दर्ज हो गए
अच्छी बात यह है कि यह exploit एक खास assembly routine पर बहुत अधिक निर्भर लगता है, इसलिए browser के JS या WASM से इसका दुरुपयोग करना काफ़ी मुश्किल होना चाहिए। अगर ऐसा न होता, तो सिर्फ़ किसी malicious tab को कुछ घंटों तक background में खुला छोड़ देने से भी आसानी से data leak हो सकता था
Fedora maintainer के नया microcode deploy करने का इंतज़ार है ताकि kernel boot प्रक्रिया के दौरान उसे update कर सके
साथ ही उम्मीद है कि V8 और SpiderMonkey के software patches पहले से और अतिरिक्त रूप से mitigation दे सकें
हालांकि JS exploit को data बाहर निकालने का तरीका भी चाहिए होगा, और उसे पूरी तरह छिपाना शायद काफ़ी मुश्किल होगा
"No such file or directory"और error 127 आ रहा हैऐसा लगता है कि OpenBSD ने पिछले 3 दिनों में AMD microcode loading जोड़ी है, यह कोई संयोग नहीं है
https://news.ycombinator.com/item?id=36838511
ऐसा कहना कि AMD ने प्रभावित प्रोसेसरों के लिए microcode update जारी किया है, शायद पूरी तरह सटीक नहीं है
AMD ने family 17h model
0x31और0xa0के लिए microcode update[0] जारी किया है, और WikiChip[1] के अनुसार ये Rome, Castle Peak, Mendocino से मेल खाते हैंअभी तक Renoir, Grey Hawk, Lucienne, Matisse, Van Gogh के लिए microcode update नहीं दिखता। अच्छी बात यह है कि नया kernel इनके लिए बस chicken bit सेट कर सकता है, और वास्तव में ऐसा करता भी है[2]
[0] https://git.kernel.org/pub/scm/linux/kernel/git/firmware/lin...
[1] https://en.wikichip.org/wiki/amd/cpuid#Family_23_.2817h.29
[2] https://github.com/torvalds/linux/commit/522b1d69219d8f08317...
good_revsयहाँ हैं: https://github.com/torvalds/linux/commit/522b1d69219d8f08317...अभी सार्वजनिक revision (
Patch) git HEAD के आधार पर यहाँ देखे जा सकते हैं: https://git.kernel.org/pub/scm/linux/kernel/git/firmware/lin...यह लिखते समय पाँच
good_revमें से सिर्फ दो ही public हैंवह Celeron 50% overclock के लिए मशहूर था: https://ark.intel.com/content/www/us/en/ark/products/codenam...
संबंधित हिस्से को देखें तो, यह तकनीक CVE-2023-20593 है और सभी Zen 2-स्तर के प्रोसेसरों पर काम करती है, जिनमें कम से कम ये उत्पाद शामिल हैं
AMD Ryzen 3000 Series Processors
AMD Ryzen PRO 3000 Series Processors
AMD Ryzen Threadripper 3000 Series Processors
AMD Ryzen 4000 Series Processors with Radeon Graphics
AMD Ryzen PRO 4000 Series Processors
AMD Ryzen 5000 Series Processors with Radeon Graphics
AMD Ryzen 7020 Series Processors with Radeon Graphics
AMD EPYC “Rome” Processors
क्या यह संभव है कि यही या मिलती-जुलती तकनीक पहले के Zen/Zen+ या बाद के Zen 3 cores पर भी काम करे, लेकिन अभी तक इसे साबित न किया गया हो?
मेरा
AMD Ryzen 9 5950x Desktop Processorभी Zen 3 दिखता है, इसलिए शायद सुरक्षित हैमैं अविश्वसनीय workloads नहीं चलाता, लेकिन जैसा कहते हैं, तैयार रहने वालों का साथ किस्मत देती है
साइट ट्रैफिक के दबाव में डाउन हो रही है: https://web.archive.org/web/20230724143835/https://lock.cmpx...
ज़्यादातर मामलों में HN ट्रैफिक मुश्किल से 100 pageviews per second तक पहुँचता है
https://www.amd.com/en/resources/product-security/bulletin/a...
AMD security bulletin के अनुसार non-EPYC CPU के लिए firmware update साल के अंत तक नहीं आएगा। तब तक क्या users को chicken bit चालू करके performance hit सहना पड़ेगा?
जितना शानदार, उतना ही डरावना। 10MB sample को एक मिनट चलाने पर मैं अपने Bitwarden password के कुछ हिस्से, ssh login password, और banking credentials के टुकड़े “leak” कर सका, और उन्हें आसानी से फिर से जोड़ा जा सकता था
लेख वाकई बहुत अच्छा था। खासकर वह हिस्सा बहुत पसंद आया जिसमें बताया गया था कि यह कैसे तय किया जा सकता है कि random generation program सही तरीके से चला या नहीं
सीधा-सादा तरीका यह है कि उसे किसी दूसरे processor या simulator जैसे oracle पर चलाकर देखा जाए कि क्या वह उसी तरह व्यवहार करता है
लेकिन संकीर्ण timing window वाले microarchitectural effects की पुष्टि करने के लिए उसी program में कई stall, fence, nop आदि डालकर भी लिखा जा सकता है। single-threaded code में इससे output पर असर नहीं पड़ना चाहिए, लेकिन CPU के भीतर microarchitectural स्तर पर काफ़ी अलग चीज़ें हो रही होती हैं। इस तरह CPU खुद अपना oracle बन सकता है
chicken bit भी पसंद आया था