Сказка о циничном ученом, простреленных ногах разработчиков
От: kochetkov.vladimir Россия https://kochetkov.github.io
Дата: 29.10.08 17:09
Оценка: 271 (26) +4 -7 :))) :))) :))) :))) :))) :))) :))) :))) :))) :))) :))) :))) :))) :))
Навеяно рассуждениями здесь (в ФП) о прочно засевших в песочницу .NET'a, и преимуществами нативного кода делфи перед управляемым шарповым в КСВ...

Хотите, расскажу вам на ночь сказку?

Жил да был в конце второй половины далекого двадцатого века ученый. Великий ученый, отменный математик и прирожденный физик. Но циничен он был — до жути. Все делал только для науки, и не перед чем ни останавливался. И даже ядерную бомбу, младшими сестрами которой впоследствии были уничтожены миллионы людей, он помогал строить ради науки, не иначе. А в перерывах между строительством ядерной бомбы, он подумывал о создании принципиально новой архитектуры вычислительных систем, наука о которых только-только зарождалась в буйных головах тогдашних гиков. Помыслы его были несомненно чистыми: сделать архитектуру простой, надежной и дешевой. И таки-создал. Да не абы какую, а самую, что ни на есть простую и дешевую, в основе которой лежал принципе хранения данных и кода в единой, совместно разделямой ими памяти. Но мало кто знал, что скрывается за созданием этой архитектуры. А скрывается за ним еще одно его злодеяние, которое совершил Джон по отношению ко всем, ныне существующим разработчикам, пишущим код для систем, построенных по его принципу. Ведь он, ни много ни мало, авансом прострелил обе ноги каждому из них. Бытует мнение, что разработчик впервые простреливает себе ногу, когда допускает свою первую грубую и, в то же время, трудноуловимую ошибку. Как бы не так. Лишь только прийдя в мир систем, построенных по архитектуре Джона, разработчик сразу же получает две, отнюдь не серебряных пули в свои нижние конечности...

Почему фон-Нейман изобрел именно эту архитектуру, в принципе, понятно. В том, насколько она оказалась успешной тоже можно убедиться воочию. Но знал ли он, к чему приведет его идея хранения данных и кода в единой памяти? Знал ли он, что спустя почти полвека, это неоспоримое достоинство предложенной им архитектуры начнет широко использоваться нечистыми на руку людьми, которые поймут, что подсунув коду специальным образом сформированные данные, при определенных условиях, они смогут заставить код выполнить эти данные, как если бы они сами были кодом? Осознавал ли он масштаб содеянного им? Вряд ли. Но с этого момента, любой программист, ковыляя на простреленных ногах по просторам написанного им же кода, был вынужден искать те места, в которых входные данные могли бы стать кодом и латать их заплатками, чтобы обеспечить безопасность разрабатываемой им системы.

Но как проще всего ковылять на простреленных ногах? Правильно: используя костыли. И они потихоньку таки-стали появляться. Сначала придумали помечать особым образом верхушку стека контрольной величиной, дабы впоследствии убедиться что он не был сорван через переполнение буфера. Потом выяснилось, что переполнить можно не только буфер, но и кучу (видели пример эксплуатации такой уязвимости? Вообще жесть, до такого додуматься). Стали пытаться как-то управлять кучей. Тогда выяснилось, что подсунуть процессору левый код можно и через специальным образом сформированные данные, обрабатываемые в форматной строке. Перестали использовать форматную строку. И т.д. и т.п.

А тут еще производители процессоров подтянулись со своими красивыми, никелированным костылями, призывающими помечать особым образом страницы памяти с данными, дабы процессоры могли понять, что ничего выполнять там не стоит. Но и это как-то не прижилось, да и на проверку — такие костыли оказались совсем кривыми и неудобными

Между тем, лучик надежды блеснул гораздо раньше, когда начали появляться интерпретируемые языки. Ведь если интерпретатор выполняет написанный код покомандно, значит он (в теории) имеет возможность полностью контролировать ход выполнения программы и, в случае чего, адекватно отреагировать на попытку обмануть процессор. Да и вообще, будучи отвязанным от архитектуры фон-Неймана, интерпретируемый код мог организовывать свою собственную виртуальную архитектуру, лишенную недостатков аппаратной. Точнее не код, а выполняющий его интерпретатор, но не суть. Одно было плохо: с быстродействием такого кода обозначились вполне реальные проблемы

И вскоре, гикам пришло в голову, что интерпретируемый код можно не выполнять заново каждый раз, а компилировать в более низкоуровневый — промежуточный, в байт-код. В этом случае, такой код будет по-прежнему отвязан от аппаратной архитектуры, но его приближение к машинному позволит выполнять его в разы быстрее. Сказано — сделано. Но все равно: скорость не та, хотя и выше на порядки.. Опять облом, нечего противопоставить банальным костылям, кроме тихоходного инвалидного кресла

И вот гикам приходит в голову идея, что промежуточный код ведь можно скомпилировать в самый что ни на есть нативный, процессорный перед первым его выполнением, если иметь гарантии того, что никоим образом код в виде данных в них не попадет, а если и попадет, то выполнится не сможет ну никак. И гики создают матрицу, совершенно отвязанную от фон-Неймановской архитектуры, верифицирующую каждую строчку выполняемого в ней кода, и не допускающую в принципе (by design) конфузов, свойственных предыдущим платформам. А благодаря компиляции промежуточного кода в нативный, скорость программы выполняющейся в матрице, ниже уже совсем не на порядки, а ряде случаев: вообще — быстрее.

И оказалось, что находясь в такой матрице, разработчику уже не нужны костыли, т.к. там его ноги оказываются совершенно не простреленными! Т.е. он может носиться по своему коду со скоростью пантеры, ходить с прямой спиной, гордо подняв голову, да вообще — делать все что угодно, а не тратить свое время на занудный поиск мест для латания на искалеченных ногах!

И что? Думаете праздник там, всеобщее ликование, фейрверки и воздушные шарики? Щас. Нарисовались на горизонтах матрицы всякие Нео с Морфеусами (еле дошли, тяжело ведь с простреленными ногами, да на костылях) и давай бухтеть, что это все иллюзия, обман, что нет бога кроме фон-Неймана и Страуструп пророк его, что так нельзя, а если и можно, то это не даст никаких выгод, что их костыли позволяют ходить на простреленных ногах быстрее, чем целые ноги жителей матрицы. В общем, стали всеобщее ликование всячески портить и праздник своим присуствием отравлять. Для них даже отдельную матрицу сделали, тоже управляемую, чтобы они могли со своими драгоценными костылями туда переселиться и постепенно выкинуть их нафиг. Ан нет, не получилось. Потому как оказалось, что они к костылям за долгое время ходьбы по-просту приросли...

Так и ковыляют они и по сей день, искалеченные, хмурые, с вросшими костылями под мышками, и бухтят, бухтят, бухтят... И поняли люди, что не излечить их, и что нужно просто дождаться их есстественного вымирания, и терпеть после этого их не легион, но маленькую горстку, которая будет вынуждена ковылять там, где матрицу при всем желании не развернуть. И продолжили люди свой праздник, и я на нем был, мед да пиво пил...

И на этом сказка заканчивается и начинается бухтение Нео и Морфеусов... *приглашающий жест рукой*

[Интервью] .NET Security — это просто
Автор: kochetkov.vladimir
Дата: 07.11.17
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.