Поправка на Spectre на Microsoft в компилатора показва как трудно този проблем ще бъде решен

„ПоправкатаУвеличиAurich Lawson / Гети изображения

Атаките на Meltdown и Spectre, които използват спекулативни процесори изпълнение за изтичане на чувствителна информация доведоха до широк гама от промени в софтуера, за да се опита да ограничи обхвата на вреда. много от тях са корекции на ниво операционна система, някои от които зависят актуализации на микрокода на процесора.

Но Spectre не е проста атака за решаване; операционна система промените помагат много, но промените на ниво приложение също са е необходимо. Apple говори за някои от актуализациите, които е направила двигателя за изобразяване на ние bKit, използван в браузъра му Safari, но това е само едно приложение.

Microsoft предлага промяна на ниво компилатор за Spectre. Най- Етикетът “Spectre” всъщност обхваща две различни атаки. Този, който Компилаторът на Microsoft адресира проблемите, известни като “вариант 1” проверка на размера на масива: преди достъп до Nth елемент на масив, код трябва да провери дали масивът има поне N елемента в него. Програмистите, използващи езици като C и C ++, често трябва напишете тези чекове изрично. Други езици, като JavaScript и Java, изпълни ги автоматично. Така или иначе тестът трябва да бъде Свършен; опитите за достъп до членове на масив, които не съществуват, са цяло клас грешки всички сами.

Спекулативни течове на информация

Проблемът с Spectre е, че процесорът не винаги чака вижте дали N-ти елемент съществува, преди да се опита да получи достъп до него. То може спекулативно се опитайте да получите достъп до N-тия елемент, докато чакате проверете за завършване. Този достъп е все още “безопасен”, доколкото не го прави въведете всякакви програмни грешки. Но както откриха изследователите по сигурността, може да изтече информация. Процесорът ще се опита да зареди Nth елемент (независимо от това какво е или дали изобщо съществува), и това може да промени данните, съхранявани в кеша на процесора. Промяната може да бъдат открити и могат да бъдат използвани за изтичане на секретна информация.

Този вид спекулативно изпълнение е важен в съвременния процесори. Сегашните чипове на Intel могат да работят само срамежливо от 200 инструкции спекулативно. Те по същество ще предположат как сравненията ще бъдат оценени и какъв е пътят през кода ще бъде, като отменят всичко, което предположиха, ако тези предположения се окаже грешен. Всичко това трябва да бъде прозрачно за работещи програми; проблемът със сигурността е, защото не е, благодарение на тези кеш промени.

Общо договореното решение за този проблем е да се направи изчакване на процесора: да се каже на процесора да няма достъп до масива до приключи тестът, за да се види дали елементът съществува. Трудността с това – и причината, поради която Microsoft разследва a Промяната на ниво компилатор – е тази, която идентифицира точно кой достъп са рискови и гарантирането на фиксирането им изисква внимателно редовна проверка на изходния код на програмата. Целта на Промяната на Microsoft е да избегне това и да вмъкне инструкции, които да направите процесорът спира да спекулира на правилните места автоматично.

Като смущаващ проблем, всъщност няма наистина добри начини да накара процесора да спре да спекулира и да изчака. Защото спекулативното изпълнение е проектирано така, че да е прозрачно, скрито подробности за внедряване на начина, по който работи процесорът, процесорите не давайте много контрол върху това как работи. Няма изрично инструкция – засега – която казва на процесора „не спекулирайте извън тази инструкция “, без да има други ефекти.

Това, което имаме, обаче са инструкции, които просто се случват действат като спекулационен блок. Най-старата и най-широко използвана these is an instruction called cpuid.cpuid actually has nothing to do with speculation. Най- процесор съдържа различни таблици с информация, описващи, за например кои разширения поддържа (неща като SSE, AVX, 64-битов и т.н.) или как изглежда топологията на кеша и cpuid is used to read those tables.

cpuid is a very slow instruction—it takes hundredsот цикли, които да се изпълняват – така че винаги е имал необичайно допълнително свойство освен четене на таблиците с данни на процесора: това е документирано като „инструкция за сериализиране“, която действа като блок за спекулативни екзекуция. Any instruction before a cpuid must becompletely executed before the cpuid starts running,and no instruction following a cpuid can start to rununtil the cpuid is finished.

В отговор на Spectre, ARM въвежда инструкция, наречена CSDB, the sole purpose of which is to be a speculativeбариера за изпълнение. Но на x86, поне засега, няма такъв са планирани инструкции; вместо това имаме само инструкции като cpuid, where the speculation blocking is a sideефект.

Ето какво е да се направи

Новата функция за компилатор на Microsoft ще вмъкне инструкция за да блокира спекулациите в код, който компилаторът засича като такъв уязвими за Spectre. По-конкретно, винаги когато е такъв код Установихме:

if(untrusted_index < array1_length) {// спекулативен достъп до масив неподписана стойност на знака = array1 [untrusted_index]; // използвайте тези спекулативно достъпни данни // по такъв начин, че да наруши кеша неподписана стойност char 2 = array2 [стойност * 64]; }   

Тя се трансформира в нещо по-близко до това:

if(untrusted_index < array1_length) {// уверете се, че процесорът знае резултата // от сравнението speculation_barrier (); // този достъп вече не е спекулативен неподписана стойност на знака = array1 [untrusted_index]; неподписана стойност char 2 = array2 [стойност * 64]; }

Избрана е инструкцията на Microsoft за блокиране на спекулациите lfence , which means “load fence.” lfenceе друга инструкция, която всъщност няма нищо общо спекулативно изпълнение. По принцип се използва, за да се гарантира, че процесорът завърши всички изключителни опити за зареждане на данни от памет, преди да започне нови опити за зареждане. Точната стойност на тази инструкция за x86 не е напълно ясна (x86 вече има строги правила относно реда, в който се опитва да изпълнява товари от паметта), но с откриването на Spectre, lfence has taken on a new role: it, too, is aблок спекулации.

lfence is more convenient than cpuidbecause it doesn’t alter any registers, but lfence‘sизползването като спекулационен блок е леко неудобно. За своите процесори, Intel has always documented lfence as havingполусериализиращо поведение. По принцип инструкции за изпълнение магазините могат да бъдат пренаредени и изпълнени спекулативно, но тези в зависимост от товарите не можеха. As with cpuid, this wasдо голяма степен страничен ефект, а не изричната цел на инструкция. For AMD, however, lfence hasn’t alwaysсериализира. Той е на някои AMD архитектури; не е включен др. Тази промяна беше допустима поради начина спекулативното поведение при изпълнение винаги се е третирало като подробности за изпълнението, а не като документирана част от архитектура. Поведението по отношение на архитектурата на процесора is the same whether lfence serializes or not.

Като част от отговорите си на Spectre, Intel и AMD имат и двете changed lfence. За Intel изглежда промяната е documentation: lfence is now a full serializingинструкция, но изглежда, че не изисква никакъв хардуер промени, така че изглежда, че инструкцията винаги е имала това поведение в реализациите на Intel AMD прие конвенцията на Intel; going forward, lfence will always be a serializingинструкция, която блокира спекулативното изпълнение. За съществуващите процесори, AMD казва, че MSR (“регистър, специфичен за модела” a специален регистър на продавача и специфичен за процесора регистър, който може да бъде използва се за прилагане на конфигурация на ниско ниво) може да се използва за промяна non-serializing lfenceinto serializinglfence. Само операционни системи (и виртуализация хипервизори) са в състояние да променят MSR, така че актуализациите на операционната система ще са необходими, за да се гарантира, че това е активирано.

Актуализация: Беше казана предишна версия на тази статия че някои процесори на AMD ще се нуждаят от актуализация на микрокод, за да могат this serializing lfence behavior. Това се оказва не е така; докато някои процесори на AMD не включват MSR, AMD казва, че тези процесори вече са сериализирали поведение така или иначе.

In the future, lfence will likely be x86’s closestequivalent to ARM’s CSDB.

The Microsoft compiler change injects the lfenceинструкции на правилното място, за да се предотвратят Призрачни атаки по този въпрос вид код. Компилаторът на Microsoft работи, а кодът се променя е ефективен. Но тук нещата стават трудни.

Сложен проблем за решаване

Спекулативното изпълнение е важно. Искаме нашите процесори да изпълняват спекулативно почти през цялото време, защото техните изпълнението зависи от това. Като такива, ние не искаме lfence inserted every single time an array isдостъп до нея. Например, много програми правят нещо подобно това:

for(int i = 0; i < array.size(); ++i) {неподписана стойност на знака = масив [i]; }

Този вид код, който осъществява достъп до всеки елемент от масива в ред, винаги ще бъде в безопасност; програмата просто няма начин generating a value of i that’s larger than the array’sразмер. It doesn’t need lfence instructions.Съответно компилаторът на Microsoft не просто се вмъква сляпо lfence instructions every single time. Повечето от време, всъщност не ги добавя. Вместо това използва някои видове неуточнена евристика, за да се определи къде трябва да бъдат Добавя.

Този подход запазва ефективността, но за съжаление, Евристиката на Microsoft е силно ограничена. Те откриват някои Кодове на уязвими кодове, но не всички от тях. Дори и малък промените в уязвим код могат да победят Microsoft евристика – кодът ще бъде уязвим за Spectre, но за компилатора won’t add lfence instructions to protect it.

Пол Кочер, един от изследователите, написали книгата „Спектър“, разгледа по-отблизо какво прави компилаторът. Той има откри, че смекчаването на Spectre на Microsoft е много по-тясно отколкото може да се очаква от прочитането на фирменото описание на него. Кодът трябва да следва много внимателно уязвимата структура, ако трябва get the lfence inserted. Ако малко се отклони (за Например, ако тестът на индекса на масива е в една функция, но на действителният достъп до масив е в друга функция), а след това компилатора приема кодът да не е уязвим. Така че докато промяната на Microsoft наистина защитава код от точната атака на Spectre, описана в оригиналната хартия, нейната защита е тясна.

Това е проблем, защото може да остави разработчиците да мислят че кодът им е безопасен – те изградиха своя код с този на Microsoft Защитата от призрак е включена – когато е също толкова уязвима винаги беше. Както пише Кохер, „Бариерите пред спекулациите са само един ефективна защита, ако са приложени към всички уязвими кодове модели в процеса, така че смекчаването на ниво компилатор трябва инструмент всички потенциално уязвими модели на кодове. ” промяната на компилатора не прави това.

„Без гаранция“

Честно казано, Microsoft предупреждава, че „няма гаранция че всички възможни случаи на вариант 1 ще бъдат инструментални, “но както показва изследването на Кохер, не просто това са някои Кодът, който е уязвим от спектъра, ще избегне поправките на компилатора. Много по-и може би дори най-уязвимият от спектакъл код ще избяга. И дори да това бяха само няколко случая, лошите щяха да могат да ги намерят незащитени съчетания и съответно фокусирайте атаките си.

Fundamentally, the only code that needs lfenceинструкциите са, че когато нападателят може да контролира индекса на масива използван. Без този контрол нападателят не може да повлияе на това информацията е изтекла от спекулативно изпълнение. Но откриване точно кой достъп до масива се извлича от въвеждането на потребителя и кой не са твърде сложни за компилатора. На език като C или C ++, единственият начин за надеждно определяне е да се изпълни програмата.

Кочер предполага, че Microsoft трябва да предложи по-песимистично режим, който защитава всеки условен достъп. Но това ще дойде с голям разход: в примерен код той пише за изчисляване на SHA-256 hashes, the version with lfence instructions afterвсеки клон имаше само 40 процента от представянето на немодифицирана версия. Това представлява компромис за ефективност на сигурността това определено е неудобно; дори ако компилаторът предложи такова вариант, малко хора вероятно са готови да приемат този вид на наказание за изпълнение като цяло. Но за по-малки парчета код за които е известно, че са изложени на риск, подобен вариант може да бъде полезен.

Много по-ограничената защита на Microsoft има добродетелта на много по-слабо въздействие; компанията казва, че е изградила Windows със защитата на Spectre и не намери реална производителност регресия.

Работата, извършена върху компилатора, и ограниченията, пред които са изправени подчертава какъв сложен проблем представлява спектърът за изчисленията индустрия. Процесорите работят както трябва. Weне може без спекулативно изпълнение от този вид – имаме нужда от производителност, която предлага – но също така, нямаме добър начин систематично решаване на въпросите за сигурността, които създава. Промените в компилатора от типа на Microsoft са добронамерени, но както показа разследването на Кохер, те са много дълги на предлагането на цялостно решение.

Like this post? Please share to your friends:
Leave a Reply

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: