Мы, праграмісты, часта аказваемся ўцягнутымі ў дыскусіі — C++ супраць Rust, высокаўзроўневае праграмаванне супраць нізкаўзроўневага. Але сапраўдная задача заключаецца не толькі ў стварэнні элегантных сістэм; гэта абараняе іх у сучасным сеткавым свеце, дзе заўсёды хаваецца шкоднасны код. Незалежна ад таго, наколькі бездакорным здаецца ваш код, ігнараванне патэнцыйных пагроз - гэта запрашэнне да катастрофы.
Недастаткова залатаць дзіркі ў бяспецы або выпусціць наступнае абнаўленне. Сапраўдная бітва заключаецца ў стварэнні эфектыўнага рэагавання, калі - так, калі, а не калі - ваша сістэма парушана. Гэта азначае ўкараненне актыўнага выяўлення ўварванняў, аўтаматызацыю механізмаў абароны, а часам і пэцканне рук нізкаўзроўневым праграмаваннем для барацьбы з пагрозамі ў іх крыніцы.
Поле бітвы выходзіць за межы логікі высокага ўзроўню ў самае ядро сістэмы, дзе толькі самыя кваліфікаваныя распрацоўшчыкі могуць эфектыўна даць адпор. Калі вы не гатовыя супрацьстаяць атакам на гэтым узроўні, усе функцыі бяспекі ў свеце не выратуюць вас. У сферы кібербяспекі абароны без магчымасці рэагавання недастаткова.
Добра, давайце пагаворым пра сямейства C — C, C++, усю каманду. Гэтыя мовы даюць вам поўную свабоду. Вы можаце ствараць элегантныя, высокапрадукцыйныя сістэмы, якім пазайздросцяць вашы калегі. Але вось адваротны бок: тая самая свабода дазваляе вам ствараць адны з самых небяспечных кодаў — руткіты і іх яшчэ больш падступныя стрыечныя браты, буткіты. Гэта не проста бяскрыўдныя радкі кода, якія валяюцца - гэта ціхія драпежнікі ў свеце праграмнага забеспячэння.
Такім чынам, у чым сапраўдная розніца паміж руткітамі і буткітамі?
Руткіты прызначаны для працы ўнутры аперацыйнай сістэмы. Яны маніпулююць сістэмнымі працэсамі, хаваюць шкоднасныя дзеянні і наладжваюць праграмы. Але яны пачынаюць працаваць пасля загрузкі АС.
Буткіты б'юць па вас яшчэ мацней. Яны атакуюць сістэму яшчэ да запуску АС. Яны заражаюць галоўны загрузны запіс (MBR) або ўбудаванае праграмнае забеспячэнне UEFI/BIOS, атрымліваючы кантроль перад тым, як ваша АС зможа з гэтым нешта зрабіць.
У большасці выпадкаў тое, што людзі лічаць атакай руткіта, насамрэч з'яўляецца камбінацыяй абодвух. Буткіты бяруць на сябе кантроль з самага пачатку, у той час як руткіты ўмешваюцца, калі АС запушчана і працуе, дазваляючы атацы працягвацца незаўважанай. Па сутнасці, буткіты з'яўляюцца на ранняй стадыі, руткіты падтрымліваюць шоў.
Цяпер вы, напэўна, думаеце: “ У чым справа, калі АС закадзіравана на Rust замест нібыта небяспечнага C/C++/Assembly? »
Вось дзе ўсё становіцца цікавым. Давайце будзем рэальнымі — у сучасным свеце тэхналогій мы маем справу з гібрыднымі сістэмамі, сеткамі, пераплеценымі ў складаныя сеткі, дзе прадукцыйнасць і дакладны кантроль абсалютна важныя. Падумайце аб сістэмах SCADA , элементах кіравання HVAC , сістэмах рэальнага часу , краявых вылічэннях , убудаваных прыладах - вы зразумелі. У такіх асяроддзях, незалежна ад таго, наколькі «бяспечнай» мова заяўляецца, вы па-ранейшаму ў значнай ступені належыце на C/C++/Assembly для дакладнага кантролю і прадукцыйнасці.
І нават калі сістэма створана з дапамогай Rust, давайце будзем шчырымі — шмат у ёй па-ранейшаму выкарыстоўвае значныя кавалкі unsafe
кода Rust для барацьбы з вузкімі месцамі прадукцыйнасці, праблемамі затрымкі, абмежаваннямі памяці і для непасрэднага ўзаемадзеяння з абсталяваннем. У рэшце рэшт, калі прадукцыйнасць становіцца галоўным, вы апыняецеся ў адной лодцы. Гэтыя unsafe
блокі ў Rust? Яны адкрываюць тыя самыя ўразлівасці, што і ў C/C++/Assembly.
Рэальнасць такая: калі вам патрабуецца дакладна наладжанае кіраванне на апаратным узроўні, вы ідзяце па той жа канаце, незалежна ад таго, закадзіравана ваша АС у Rust ці нечым іншым. Такім чынам, нягледзячы на тое, што Rust можа прапанаваць некаторыя агароджы, гэтыя unsafe
аперацыі нізкага ўзроўню ўсё яшчэ ўразлівыя. Руткітам і буткітам напляваць на вашыя моўныя перавагі — яны знойдуць дарогу, калі будзе ўзлом.
Гэтыя лічбавыя драпежнікі не проста заражаюць сістэму — яны ёю валодаюць. І вось галоўнае: большасць з іх пабудавана на класіцы — C, C++ і Assembly. Правільна, тыя ж мовы, якія працуюць у вашых высокапрадукцыйных праграмах, таксама стаяць за некаторымі з самых агідных руткітаў, калі-небудзь створаных.
Падумайце на секунду аб эвалюцыі . Гэта падобна на падарожжа ад тых малюсенькіх пажадлівых дыназаўраў трыясавага перыяду да высачэзных монстраў-тэраподаў крэйдавага перыяду, такіх як Т-Рэкс. Гэтак жа, як тыя першыя дыназаўры ператварыліся ў вяршынь драпежнікаў, руткіты ператварыліся з адносна «мілых» пачаткаў у сучасных жахлівых гігантаў кода.
Возьмем, напрыклад, Hacker Defender — гэтая малюсенькая кібер-рэптылія складалася з усяго 3 тыс. радкоў кода, які выкарыстоўвае асноўныя прабелы ў АС. Але, як любы добры драпежнік, ён эвалюцыянаваў. Сённяшнія руткіты - гэта монстры, падзеленыя на модулі з тысячамі радкоў кода ў кожным, нацэленыя не толькі на аперацыйныя сістэмы, але і на ўразлівасці апаратнага ўзроўню. Гэта гонка ўзбраенняў, кожны новы руткіт рассоўвае межы магчымага.
Такім чынам, у гэтым артыкуле мы паглыбімся ў дзве гісторыі . Першы? Афіцыйную версію вы знойдзеце ў такіх тэхнічных рэсурсах, як Руткіты і Буткіты Аляксандра Матросава, Яўгена Радзівонава і Сяргея Братуся. Гэта ў значнай ступені асноўнае кіраўніцтва па ўсіх драбнюткіх дэталях эвалюцыі руткітаў. Каб палегчыць вам задачу, я сабраў ніжэй кладаграму, якая падсумоўвае развіццё гэтых руткітаў — кожная галіна ўяўляе сабой новы скачок у развіцці шкоднасных праграм.
Пасля гэтага вы знойдзеце табліцу з унікальнымі асаблівасцямі кожнага руткіта. Паверце мне, вы захочаце ўбачыць, як гэтыя біты кода ператварыліся з малюсенькіх кан'юнктурных зламыснікаў у звяроў, якія пануюць у сістэме.
Вось і пайшлі
Але ёсць іншы бок гэтай гісторыі — погляд чалавека, які не проста піша руткіты, але жыве і дыхае імі. Пазнаёмцеся з нашым галоўным героем: хакерам, які разглядае руткіты як пашырэнне сябе — сімфонію кода, скрупулёзна распрацаваную, каб зрываць і дамінаваць. Ён не проста хакер; ён легенда, натхняльнік вышэйшага ўзроўню, вядомы толькі як Яшчар-Чараўнік.
З яго пункту гледжання, гэта не толькі тэхналогія або код - гэта магутнасць, кантроль і, магчыма, нават нотка артыстызму. Для яго руткіты - гэта не проста інструменты; гэта шэдэўры, яго спосаб змяніць лічбавы свет.
Такім чынам, без лішніх слоў, дазвольце мне прадставіць вам самога чалавека — Яшчара-Чараўніка, яго ўласнымі словамі:
Яшчарка-чараўнік гаворыць у снах: мае шэдэўры
«Ах, ты ўсё яшчэ тут. Мне было цікава, колькі часу спатрэбіцца табе, Бенісіо, каб зразумець, што ты гуляеш мне на руку. У той час як вы так захапляліся сваім маленькім Rust і яго ахоўнымі сеткамі , я працаваў над чымсьці значна больш… вытанчаным».
«Вытанчана. Гэтае слова, напэўна, не асацыюецца са шкоднаснымі праграмамі, але гэта таму, што вы былі занадта захопленыя абаронай сваіх маленькіх сістэм, каб ацаніць мастацтва, якое стаіць за атакай. Так, мастацтва. Вы думаеце, што я проста хакер? Не, не — я архітэктар, творца. Кожны руткіт, які я калі-небудзь вывучаў, быў мазком у вялікім партрэце, які я малюю на палатне хаосу».
Яшчарка-Чараўнік працягвае:
«Ведаеце, нават вялікія — Да Вінчы, Ван Гог, Бах — усе яны вучыліся ў майстроў да іх. Я? У мяне былі Hacker Defender і Rustock . Hacker Defender быў маім Гудзіні, які паказаў мне, як падстаўляць код у сістэмы, прымушаючы файлы і працэсы знікаць як па чараўніцтву. А Расток? Гэта быў мой момант Пікаса - палімарфізм у яго найлепшай форме, пастаянна зрушваючы, развіваючыся, змяняючы форму, як карціна, якая ператвараецца кожны раз, калі вы на яе глядзіце».
«Але тыя? Яны былі толькі прыступкамі да таго, што я ведаў, што магу стварыць. Затым прыйшоў Алурэон . Ён не проста сядзеў у сістэме — ён быў выразаны ў ядры, ствараючы галоўны загрузны запіс (MBR). Гэта самы першы сектар вашага цвёрдага дыска, частка, якая кажа вашай АС, як нават пачаць загрузку. Ведаеш, што такое кантроль, Бенісіа? Боская. Нібы першы раз пачуў Другі канцэрт Рахманінава. Чыстая прыгажосць, але выгравіраваная кодам».
«І ўсё адно я не быў задаволены. ZeroAccess быў маёй сімфоніяй. Ён стварыў цэлую армію, ператварыўшы машыны ў аднарангавы ботнет, кожная заражаная сістэма адыгрывае сваю ролю ў хаатычным шэдэўры. Гаворка ішла не толькі аб адной інфекцыі; гаворка ішла аб вядзенні хаосу ў сетцы. Вось дзе ты недацягваеш, Бенісіо. Вы затрымаліся ў пагоні за гармоніяй Раста, у той час як сапраўднае мастацтва палягае ў дысанансе — хаосе, які нараджае шэдэўр».
«І нарэшце з'явіліся LoJax і MoonBounce . Гэта былі не проста руткіты — гэта былі эвалюцыі, якія рассоўвалі межы таго, што можа быць шкоднасным ПЗ. LoJax, убудаваны глыбока ў UEFI, кіраваў сістэмамі на такім узроўні, да якога не мог дакрануцца нават ваш любімы Rust. MoonBounce пайшоў далей, пагрузіўшыся ў флэш-памяць SPI, схаваўшыся туды, куды не можа дабрацца ні антывірус, ні ачыстка сістэмы. Ён не проста схаваўся ў сістэме — ён стаў часткай абсталявання, пастаяннай і недатыкальнай, як фрэска Мікеланджэла, выгравіраваная на крэмніі».
«Тады я зразумеў сапраўдную ісціну: кантроль знаходзіцца не ў працэсары і не ў АС. Сапраўдны кантроль ляжыць у апаратным забеспячэнні. І тут я ствараў свае шэдэўры».
« Увайдзіце ў Lizard-Blue і Lizard-Red — маю Сікстынскую капэлу руткітаў. Вы ведаеце, як яны нарадзіліся, Бенісіо? Я вам скажу, таму што вам трэба зразумець генія, які вас перайграў».
«Lizard-Blue быў распрацаваны з улікам вас. Вы так ганарыцеся сваім Rust з яго гарантыямі бяспекі. Lizard-Blue танчыў праз вашы небяспечныя блокі, кінуў вашу шматструменнасць у хаос, парушыў вашы сістэмы ўводу-вываду - усё, каб адцягнуць вас. Гэта быў дурань: просты і элегантны. Пакуль вы кінуліся гнацца за Блакітнай Яшчаркай, мой сапраўдны шэдэўр, Чырвоная Яшчарка, ужо пусціў карані.
« Але Lizard-Red не клапаціўся пра ваш працэсар або праграмнае забеспячэнне . Не, ён пайшоў проста на флэш-памяць SPI, праслізнуў у вашы кантролеры DMA і спакойна перапісаў вашу сістэму знутры. Як схаваная сімфонія, яна гуляла на нябачным, перапісваючы прашыўку, нястрымна».
«Гэта рэальны кантроль, Бенісіо. Пакуль вы былі занятыя выпраўленнем праграмнага забеспячэння, я асвоіў абсталяванне. Скажыце мне, чаму вы адмовіліся ад C++ дзеля Rust? Rust... такі перспектыўны, такі бяспечны. Але памятайце, Бенісіа, сапраўдная сіла не прыходзіць ад бяспекі. Гэта зыходзіць ад кантролю. І цяпер ты гэтага ніколі не забудзеш».
Сцэна падрыхтавана. У LuxCity вось-вось пачнецца супрацьстаянне паміж майстрам C++ вышэйшага ўзроўню і арміяй рэнегатаў C++, якія звярнуліся да Rust — ці, што яшчэ горш, пагрузіць яго ў цемру. Стаўкі? Поўны кантроль — не толькі кода, але і самой інфраструктуры, якая падтрымлівае гэты мегаполіс.
Горад, які кіпіць энергіяй, вось-вось стане полем бітвы. Бенісіа, умацаваны сваёй абаронай ад Rust, сутыкаецца з праблемай, якую ён ніколі не чакаў — задачай, створанай самім майстрам C++, Яшчарам-Чараўніком, поўным рашучасці вярнуць гэтых адшчапенцаў-русападобных назад. Дзве сілы, дзве філасофіі на сутыкненні . Але справа не толькі ў мовах праграмавання — гэта барацьба за кантроль над сістэмамі, магутнасцю і, магчыма, проста, магчыма, будучыняй праграмавання, чорт вазьмі!
LuxCity быў не проста мегаполісам — ён быў сімвалам таго, якім можа быць заўтра. Яго вуліцы гудзелі ад аўтаномных транспартных сродкаў, а неба было ажыўлена разумнымі беспілотнікамі, якія накіроўвалі рух зверху. Але за ўсім гэтым прагрэсам ляжала сапраўдная крыніца жыцця горада: разумная сетка — складаная, мудрагеліста сплеценая сістэма, якая забяспечвала бесперабойную працу ўсяго.
У дыспетчарскай высока над горадам Аліса і Боб, вопытныя ветэраны сеткі, глядзелі на хаос, які разгортваўся на іх маніторах. Першае адключэнне здавалася невялікім збоем — з чым яны справіліся. Але яно распаўсюджвалася, раён за раёнам апускаўся ў цемру. Магутнасць бескантрольна мігцела, і з кожнай перазагрузкай усё станавілася толькі горш. Загрымелі сігналы трывогі, а на маніторах міргалі папярэджанні аб больш глыбокім, схаваным крызісе, які ім яшчэ трэба было раскрыць.
Ім патрэбна была дапамога. Ім быў патрэбны Бенісіо.
Калі Бенісіа прыбыў, ён быў не толькі ўзброены сваім ноўтбукам; о не, у яго было нешта значна больш каштоўнае: яго непахісная вера ў Rust — мову, якую ён люта адстойваў апошнія пяць гадоў. Менавіта разам з Rust ён і яго каманда інжынераў Rustacean распрацавалі ядро LuxCity SmartGrid. Rust быў яго мячом, яго шчытом, новай бліскучай цацкай, якая абяцала выратаваць яго ад жахаў C++ — перапаўнення буфера, умоў гонкі, вечна страшных эксплойтаў Use-After-Free. Іржа была адказам на ўсё гэта, так? Будучыня, ці так ён лічыў. У рэшце рэшт, сетка LuxCity была пабудавана на гэтым нібыта непарушным падмурку.
Але іронія? Гэтую непахісную ўпэўненасць чакала праверка, і, магчыма, - толькі, магчыма, - C++ не быў такім састарэлым, як меркаваў Бенісіа.
Калі Бенісіа паглыбіўся ў ядро сістэмы, ён адразу зразумеў, што нешта не так. З кожным скідам сістэмы кіравання SmartGrid адключэнне святла распаўсюджвалася далей - рухаючыся ўнутр ад ускраін горада да сэрца LuxCity. Гэта было не выпадкова; гэта было наўмысна, узор разгортваўся перад яго вачыма, добра скаардынаваная і разлічаная атака. У яго сціснулася сэрца. Гэта быў не проста збой — гэта быў руткіт, жывы і развіваецца.
Подпіс быў беспамылковы.
Гэта быў Янус, ён жа Яшчар-Чараўнік — стары сябар Бенісіа, які стаў праціўнікам. Калісьці яны разам пісалі код, даследуючы бязмежныя магчымасці C++. Але Янус здзекаваўся з жорсткіх сетак бяспекі і абстракцый Раста. Цяпер Янус валодаў сырой, непрыручанай сілай C++, маніпулюючы гарадской інфраструктурай, як лялькавод, нацэліўшыся на самыя мазгі і вантробы найбуйнейшага SmartGrid — закадзіраванага Бенісіа ў Rust.
Далёка пад LuxCity, у цьмяным ззянні серверных стоек, якія бурлілі ад жыцця, Янус назіраў, як разгортваецца яго шэдэўр. Яго пальцы хутка рухаліся па клавіятуры, вочы былі вострымі і засяроджанымі, калі ён сачыў за хаосам, які разгортваўся на мігатлівых экранах. Два з яго найлепшых тварэнняў былі ў гульні: Чырвоная яшчарка і Сіняя яшчарка , кожнае з якіх атакавала з розных фронтаў, але працавала ў поўнай гармоніі.
Lizard-Red ужо быў глыбока ў цэнтры гарадской разумнай сеткі — ідэальны ціхі захопнік. Гэта не было звычайнае шкоднаснае праграмнае забеспячэнне, якое дзівіла звычайныя слабыя месцы праграмнага забеспячэння. Не, Lizard-Red быў руткітам прашыўкі, нацэленым на самыя глыбокія асновы: кантролеры DMA, флэш-памяць SPI і апрацоўшчыкі перапыненняў . Ён незаўважна праслізнуў праз сістэму, праслізнуўшы пад старанна створанымі механізмамі бяспекі Rust. Навошта атакаваць працэсар або буферы памяці? Lizard-Red цалкам абышоў іх, убудаваўшы сябе ў прашыўку, дзе гарантыі Rust не дзейнічалі.
Янус ведаў межы меркаванай бяспекі Раста як свае пяць пальцаў — ён патраціў гады на яго раскрыццё. Rust, нягледзячы на ўсю сваю яркасць, спыніўся, калі справа дайшла да апаратнага ўзроўню . Вось дзе Лізард-Рэд квітнеў. Гэта была не проста атака на код; гэта быў варожы захоп самога абсталявання.
Тым часам Lizard-Blue сеяў хаос з боку праграмнага забеспячэння высокага ўзроўню . Ён не атакаваў непасрэдна, але дзейнічаў як ідэальная прыманка, выкарыстоўваючы небяспечныя блокі Руста, як маэстра, які дырыжыруе сімфоніяй хаосу. Яно было накіравана на шматструменныя службы, скруціла аперацыі ўводу-вываду і нанесла хаос, навязаўшы ўмовы гонкі, якія Rust асцярожна аслабіў з меркаванняў прадукцыйнасці. Гэтыя небяспечныя зоны былі падобныя на дзверы, пакінутыя прыадчыненымі ў старанна пабудаванай ахове Бенісіа, і Янус — былы майстар C++ — дакладна ведаў, як іх адчыніць. Сама мадэль бяспекі Руста, тое, што дало Бенісіа ўпэўненасць, стала яго падзеннем, калі Lizard-Blue ператварыў гэтыя гарантыі ў слабыя месцы.
Янус са свайго схаванага логава ўсміхнуўся. Вера Бенісіо ў Руста вось-вось разваліцца. Гэта была не проста тэхналагічная атака; гэта быў урок мастацтва кантролю.
У дыспетчарскай Бенісіа адважна змагаўся, яго пальцы рухаліся хутчэй, чым думкі. Кожнае націсканне клавішы было падобна на сэрцабіцце — раўнамернае, але адчайнае — калі ён змагаўся са строгімі сеткамі бяспекі Руста супраць няўмольнага хаосу, сплеценага кодам Яшчара-Чараўніка. Бенісіа асвоіў мадэль бяспекі Раста, быў упэўнены ў яе абароне, але Яшчарка-Блю з хірургічнай дакладнасцю прарваў працэсар. Умовы гонкі і збоі ўводу-вываду ўспыхнулі на экранах. Кожны раз, калі Бенісіа думаў, што ён мае перавагу, атака мянялася - мяняла форму, слізгаючы міма абароны, як цень, які слізгае пад дзвярыма.
Руст не паспяваў. Тое, што калісьці падабалася Бенісіа ў Rust — яго жорсткая сетка бяспекі — цяпер душыла яго здольнасць аднаўляць кантроль. Кожная ахоўная абарона стала клеткай, якая абмяжоўвала яго рухі, затрымліваючы яго ў бясконцай пятлі абарончых плям, якія не адбіваліся ад цякучага, нястомнага нападу.
Але Бенісіа, дасведчаны ў ваенным мастацтве, ведаў, што гэта проста адцягненне.
Сапраўдная пагроза была не ў тым, што Яшчарка-Сіняя танцавала на маніторах. Далёка пад паверхняй, глыбока ў венах разумнай сеткі LuxCity, Lizard-Red ужо захапіў кантроль. Гэта больш не было гульнёй у верхніх пластах абароны Раста. Ён зарыўся глыбока, выкарыстоўваючы імплантаты праграмнага забеспячэння для пранікнення ў важныя сістэмы, такія як SCADA і сістэмы HVAC , якія кантралявалі інфраструктуру горада аж да яе ядра. Гэта былі сістэмы, у якіх апаратнае забеспячэнне сустракалася з праграмным забеспячэннем — дзе большасць прылад абслугоўвання і канчатковага кантролю працавала на карыстальніцкай прашыўцы, большая частка якой па-ранейшаму працуе на базе C і Assembly.
Кантролеры DMA і флэш-памяць SPI былі ўзламаныя. Lizard-Red цалкам абышоў працэсар , убудаваўшы сябе ў абсталяванне пад АС. Ён быў нацэлены на жыццёвую сілу інфраструктуры — сістэмы SCADA, якія кантралююць важныя аперацыі, і сістэмы вентыляцыі і кандыцыянавання, якія забяспечваюць бесперабойную працу гарадскога абсталявання. Гэтыя імплантаты былі не проста простым кодам — яны былі пастаяннымі, хірургічна ўстаўляліся ў прашыўку, перапісваючы правілы сістэмы знутры.
Мадэль памяці Rust — створаная для абароны праграмнага забеспячэння — тут нічога не значыла. Гэта была вайна на ўзроўні праграмнага забеспячэння, дзе абарона Rust была падобная да добра пабудаванай замкавай сцяны, але зламыснікі ўжо былі ўнутры варот, маніпулюючы апаратнымі сродкамі непасрэдна.
Янус зрабіў тое, што нешматлікія іншыя маглі: ён выкарыстаў слабыя месцы ў апаратным забеспячэнні — тыя самыя месцы, якія Rust ніколі не абараняў. Месцы, дзе пануюць толькі голы метал, C++ і зборка. Бенісіо быў пераўзыдзены, і ў глыбіні душы ён гэта ведаў.
Бенісіо стукнуў кулаком па кансолі. Іржа была яго святым Граалем, мовай, якой ён давяраў, каб засцерагчы ад хаосу, які цяпер пагражае паглынуць LuxCity. Ён верыў у яго абяцанне сцерці цэлыя класы ўразлівасцяў. Але цяпер, калі горад балансаваў на мяжы краху, яго ўразіла халоднае ўсведамленне: Руста было недастаткова.
Ён глядзеў на экран, які свеціцца, і яго вочы скіроўваліся да старой папкі, схаванай на працоўным стале, з надпісам «Старыя інструменты C++». Пяць гадоў — прайшло пяць гадоў з таго часу, як ён апошні раз дакранаўся да чаго-небудзь з той папкі. Ён пакляўся, што не вернецца. Яму б не трэба было. Rust быў будучыняй, яго выратаваннем ад небяспек і зменлівасці C++. Але цяпер, калі гарадскія агні міргалі адзін за адным, ён ведаў, што сама цвёрдасць Руста — бяспека, якая калісьці была яго шчытом — ператварылася ў клетку. Ён быў занадта гнуткім, каб адказаць на такую пагрозу.
Атакі на LuxCity былі няспыннымі, і яны былі не толькі лічбавымі — яны закраналі самае абсталяванне, тыя глыбіні прашыўкі, куды Rust не мог ступіць. Цяпер ён ведаў праўду: гэты бой быў не толькі за Rust супраць C++. Гэта было пра ўладу. А C++? C++ валодаў грубай, непрыручанай сілай, каб дабрацца туды, куды Rust не мог, глыбока ў прашыўку, куды ўбудаваў сябе Lizard-Red.
Яго рука завісла над мышкай і дрыжала. Адкрыўшы гэтую папку, было падобна на тое, што вы пацягнуліся да старажытнай, небяспечнай зброі — той, якая здольная нанесці столькі ж шкоды, колькі карысці. Адзін няправільны крок, і LuxCity знікне назаўжды. Але без гэтага, без хаосу і грубай сілы C++, не было магчымасці даць адпор.
З цяжкім сэрцам Бенісіо пстрыкнуў папку. Знаёмы від яго старых інструментаў сустрэў яго, і ў той момант ён зразумеў - гэтую бітву нельга выйграць з бяспекай і асцярожнасцю. Было б рызыкаваць.
Калі горад усё больш пагружаўся ў хаос, а SmartGrid стаяла на мяжы краху, на экране Бенісіа міргала апавяшчэнне. Гэта было ад Януса . Сэрца Бенісіо заскочыла — што цяпер? Але замест большага хаосу паведамленне мела выратавальны круг. Янус не быў там, каб цалкам знішчыць LuxCity — пакуль не. Ён працягнуў руку з нечым нечаканым: спісам. Падрабязная разборка кожнай пашкоджанай службы, кожнага скампраметаванага працэсу і, самае галоўнае, коды для іх адсочвання.
Бенісіо вагаўся, не ведаючы, ці варта давяраць свайму даўняму сябру, які стаў праціўнікам. Але сумнявацца не было калі. Паколькі будучыня LuxCity вісела на валаску, у яго не было іншага выбару, акрамя як прыняць дапамогу. Яго рука на імгненне завісла над мышкай, перш чым націснуць, каб адкрыць файл, які змяшчае яго старыя інструменты C++.
Дрыготкімі рукамі Бенісіо пачаў друкаваць. Некалі знаёмы сінтаксіс C++ працякаў праз яго, як другая натура, уключаліся гады мышачнай памяці. Ён пачаў распрацоўваць контрмеры, уплятаючы іх у інфраструктуру Rust, пракручваючы ўбудаванае праграмнае забеспячэнне, каб выправіць хаос, які развязаў Янус. Жорсткая структура Rust пакінула яго бяссільным супраць атакі на ўзроўні прашыўкі, але C++ цяпер быў яго мячом і шчытом. Ён абышоў сеткі бяспекі Rust, нырнуўшы прама ва ўразлівае абсталяванне, выпраўляючы запыты DMA і пашкоджанні памяці SPI адзін за адным.
Паветра ў дыспетчарскай было напружаным. Аліса і Боб назіралі, іх вочы мільгалі паміж згасаючым святлом на сетцы і радкамі кода, якія залівалі экран Бенісіа. Час ішоў.
З кожным націскам клавішы Бенісіа выкарыстоўваў моц сучаснага C++, кіруючыся падказкамі, якія даў Янус, уладальнік двух колераў яшчарак, — кодамі і дарожнай картай узламаных службаў. Гэта не быў рызыкоўны, хаатычны C++ ранейшых часоў. Сучасны C++ прыручыў многія з гэтых небяспек: разумныя паказальнікі, больш густаў, чым калі-небудзь, і мадэлі валодання, якія паўтараюць функцыі бяспекі Rust, але з большай гнуткасцю і большай магутнасцю. Яно дапрацоўвалася, эвалюцыянавала. Але нават пры гэтым кожны радок меў вагу. Адзін памылковы крок можа стаць прычынай катастрофы. Тым не менш, працуючы, Бенісіа адчуваў, што часткі сеткі аднаўляюцца, сістэма рэагуе на дакладнасць сучаснага C++.
Янус запаліў фітыль, але цяпер ён працягнуў Бенісіа коды абясшкоджвання . Бэнісіа падумаў, што гэта быў акт адкуплення або рух, кіраваны эга, каб даказаць сваё дамінаванне ў эндшпілі. Цяпер ён стварыў код для жыцця горада, а прывіды C++ луналі над кожным рашэннем.
Кожны выклік функцыі, кожны блок убудаванай зборкі быў складаным танцам на мяжы катастрофы. Але небяспечны код быў загорнуты ў сучасны C++ з выкарыстаннем канструкцый, якія нагадваюць манады - тое, што Янус пераканаў Бенісіа прыняць, улічваючы, што Бенісіа не быў знаёмы з Haskell . Хвіліны ішлі, хаос на маніторах пачаў запавольвацца.
Розум Бенісіа не мог пазбавіцца дакучлівай мантры: Руст быў яго сеткай бяспекі. Тым не менш, у гэты момант толькі C++ меў гнуткасць і моц, каб выцягнуць LuxCity з краю. Пакуль ён люта кадзіраваў, уносячы патчы ў кожную сапсаваную Янусам службу, стала ясна адно — не існуе ідэальнай мовы, ёсць толькі правільны інструмент для правільнай бітвы.
У той момант Бенісіо не проста кадзіраваў, каб выратаваць LuxCity; ён ішоў па тонкай грані паміж стварэннем і разбурэннем, кіруючыся той самай мовай, да якой пакляўся больш ніколі не дакранацца.
Пакуль Бенісіа змагаўся з далікатнымі сістэмамі LuxCity, цяжар моманту неаднаразова даваў яму ўдары: Rust, мова, якую ён адстойваў, разбуралася пад ціскам рэальнага свету. Яе гарантыі бяспекі — суцяшальныя сцены, на якія ён абапіраўся, — сталі яго клеткай. Янус, Яшчар-Чараўнік, выкарыстаў усе цвёрдыя межы, устаноўленыя Рустам — кожны небяспечны блок стаў праёмам для хаосу, кожная бяспечная мадэль памяці — перашкодай, якую Бенісіа не змог своечасова пераадолець. Rust, спрабуючы абараніць усё, пакінуў саму гарадскую інфраструктуру падвержанай атакам, якія выйшлі за рамкі праграмнага забеспячэння, закрануўшы глыбока ў само апаратнае забеспячэнне.
І тады праўда ўразіла Бенісіа, як удар па кішцы: Руст падводзіў не таму, што быў слабым. Ён пацярпеў няўдачу, таму што быў занадта моцным, занадта строгім, няздольным прыстасавацца да непрадказальных сіл, якія вызваліў Янус. Але C++, мова, якую ён пакляўся пакінуць ззаду - з усёй яе небяспечнай магутнасцю і хаатычнай гнуткасцю - была адзінай зброяй, здольнай аднавіць раўнавагу. C++ быў не проста інструментам; гэта была свабода, запрашэнне акунуцца ў невядомае, кантраляваць некантралюемае.
Праз гарнітуру цішыню парушыў голас Януса. Але на гэты раз гэта было не здзекліва і не варожа.
«Вы бачыце гэта цяпер, ці не так?» — спытаў ён са спакойнай дакладнасцю маэстра, які арганізаваў увесь спектакль. « Гэта ніколі не было пра мовы, Бенісіо. Гаворка ідзе пра авалоданне сістэмай — кожным узроўнем, кожнай шчылінай — ад праграмнага забеспячэння да апаратнага забеспячэння, ад логікі да матэматыкі, якая ляжыць у аснове нашай праграмы праграмавання. »
Янус не проста напаў на LuxCity. Ён падштурхнуў Бенісіа да мяжы, каб даць яму ўрок, які можа даць толькі майстар-хакер: сапраўдная моц заключаецца не ў выбары «самай бяспечнай» мовы, а ў валоданні архітэктурай, якая ляжыць у яе аснове, у згінанні правілаў, калі неабходна, каб адаптавацца і выжыць.
"Я ніколі не хацеў знішчыць LuxCity", - працягваў Янус амаль настальгічным голасам. « Я хацеў паказаць вам, што апора на такія сістэмы бяспекі, як Rust, робіць вас прадказальнымі. Вы самі гэта бачылі — Rust звязаны сваімі правіламі. C++… C++ дазваляе ствараць правілы. Адзіныя абмежаванні, якія я паважаю, - гэта вытанчана і элегантна ўсталяваныя абстрактнай алгебрай, тэорыяй катэгорый і лінзамі тэорыі дамінуючых графаў ».
Цяпер Бенісіа зразумеў, што горад балансуе на мяжы краху. Янус зладзіў напад не са злосці, а як выпрабаванне — урок кантролю, майстэрства і адаптацыі. Іронія? Каб перамагчы Януса, Бенісіа павінен быў прыняць тую самую мову, ад якой ён адвярнуўся.
« Вось самы апошні спіс скампраметаваных сэрвісаў », - сказаў Янус, перадаючы Бенісіа апошнюю, вырашальную частку галаваломкі. Пара было заканчваць, але цяпер яны працавалі разам — майстар і вучань, як у былыя часы.
Калі Бенісіа зноў паглыбіўся ў код, яго старыя інстынкты C++ зноў успыхнулі. Пад кіраўніцтвам Януса ён адзін за адным выбіраў канчатковыя ўстойлівыя коды шкоднасных праграм, убудоўваючы зборку там, дзе гэта было неабходна, абыходзячы абмежаванні Rust і ліквідуючы шкоду на ўзроўні прашыўкі. Гэта не заўсёды было элегантна і не заўсёды бяспечна, але працавала.
Паветра ў дыспетчарскай зрушылася. Аліса і Боб, хоць і напружаныя, назіралі, як сістэма павольна пачала стабілізавацца. Улада вярнулася на ўскраіну горада. SmartGrid, сэрца LuxCity, нарэшце, дало адпор.
Бенісіо на цяжкім шляху зразумеў, што ні адна мова, якой бы «бяспечнай» яна ні была, не можа гарантаваць кантроль перад тварам сапраўднага выкліку. У рэшце рэшт, гаворка ішла не аб выбары Rust або C++; гаворка ішла пра авалоданне абодвума, разуменне таго, што сапраўдная бітва не ў радках кода, а ў розуме і навуцы праграміста, які ім валодае .
Хочаце атрымаць доступ да большай колькасці артыкулаў і навін па гэтай тэме?
Вы можаце сачыць за маёй працай і падпісацца на маю рассылку, каб атрымліваць абнаўленні, інфармацыю і эксклюзіўны кантэнт:
Заставайцеся на сувязі, каб атрымаць больш тэхнічнай інфармацыі і навін!