Mayhem - атака, якая скажае біты ў памяці для абыходу аўтэнтыфікацыі ў sudo і OpenSSH

Даследнікі з Вустэрскага політэхнічнага інстытута (ЗША) прадставілі новы тып нападу Mayhem, выкарыстоўвалы метад скажэння бітаў у дынамічнай аператыўнай памяці Rowhammer для змены значэнняў зменных у стэку, ужывальных у праграме ў якасці сцягоў для прыняцця рашэння аб паспяховасці аўтэнтыфікацыі і мінанні праверак бяспекі. Практычныя прыклады ўжывання нападу прадэманстраваны для абыходу аўтэнтыфікацыі ў SUDO, OpenSSH і MySQL, а таксама для змены выніку праверак, злучаных з бяспекай, у бібліятэцы OpenSSL.

Атака можа быць прыменена да прыкладанняў, у якіх пры праверках выкарыстоўваецца параўнанне адрозненняў значэнняў ад нуля. Прыклад уразлівага кода: int auth = 0; … // код праверкі, які змяняе значэнне auth у выпадку паспяховай аўтэнтыфікацыі if (auth! = 0) return AUTH_SUCCESS; else return AUTH_FAILURE;

У кантэксце дадзенага прыкладу для паспяховага нападу досыць дамагчыся скажэнні любога біта ў памяці, якая прыходзіцца на 32-разрадную зменную auth у стэку. Пры скажэнні любога біта ў зменнай значэнне ўжо не будзе роўна нулю і ўмоўны аператар вызначыць паспяховае мінанне аўтэнтыфікацыі. Падобныя шаблоны праверкі досыць распаўсюджаны ў дадатках і сустракаюцца, напрыклад, у SUDO, OpenSSH, MySQL і OpenSSL.

Mayhem - атака, якая скажае біты ў памяці для абыходу аўтэнтыфікацыі ў sudo і OpenSSH

Атака можа быць ужыта і на параўнанні выгляду "if(auth == 1)", але ў гэтым выпадку яе правядзенне ўскладняецца, бо трэба сказіць не любы біт з 32, а апошні біт. Метад таксама можа выкарыстоўвацца для ўплыву на значэнні зменных у працэсарных рэгістрах, бо змесціва рэгістраў можа быць на час скінута ў стэк пры пераключэнні кантэксту, выкліку функцый ці спрацоўванні апрацоўшчыка сігналу. У прамежак часу, пакуль рэгістравыя значэнні знаходзяцца ў памяці, у гэтую памяць можна ўнесці скажэнні і ў рэгістр будзе адноўлена змененае значэнне.

Mayhem - атака, якая скажае біты ў памяці для абыходу аўтэнтыфікацыі ў sudo і OpenSSH

Для скажэння бітаў ужываецца адна з мадыфікацый нападу класа RowHammer. Бо памяць DRAM уяўляе сабою двухмерны масіў вочак, кожная з якіх складаецца з кандэнсатара і транзістара, выкананне бесперапыннага чытання адной і той жа вобласці памяці прыводзіць да флуктуацыі напругі і анамаліям, выклікалым невялікую страту зарада суседніх вочак. Калі інтэнсіўнасць чытання вялікая, то суседняе вочка можа страціць досыць вялікі аб'ём зарада і чарговы цыкл рэгенерацыі не паспее аднавіць яе першапачатковы стан, што прывядзе да змены значэння захаваных у вочку дадзеных. Для абароны ад RowHammer вытворцы чыпаў дадалі механізм TRR (Target Row Refresh), які блакуе скажэнне вочак у прыватных выпадках, але не абараняе аб усіх магчымых варыятаў нападу.

Для абароны ад нападу Mayhem рэкамендуецца выкарыстоўваць у параўнаннях не адзнаку адрозненняў ад нуля ці супадзенні з адзінкай, а праверку супадзенняў, выкарыстаючы выпадковае значэнне затраўкі c ненулявымі актэтамі. У гэтым выпадку для выстаўлення патрэбнага значэння зменнай неабходна сапраўды сказіць істотную колькасць бітаў, што нерэалістычна, у адрозненне ад скажэння аднаго біта. Прыклад не схільнага нападу кода: int auth = 0xbe406d1a; … // код праверкі, які выстаўляе значэнне auth у 0x23ab8701 у выпадку паспяховай аўтэнтыфікацыі if(auth == 0x23ab8701) return AUTH_SUCCESS; else return AUTH_FAILURE;

Указаны метад абароны ўжо ўжыты распрацоўнікамі sudo і ўвайшоў у склад выпуску 1.9.15 як выпраўленне ўразлівасці CVE-2023-42465. Прататып кода для здзяйснення нападу плануюць апублікаваць пасля занясення выпраўленняў у асноўныя ўразлівыя праекты.

Крыніца: opennet.ru

Дадаць каментар