21.02.2006
О компьютерных вирусах сегодня знают безусловно все. Средства массовой информации регулярно пугают нас подробностями очередной вирусной эпидемии, рассказами о все более страшных и изощренных компьютерных червях и зловещих легионах вирусописателей. Которые, к тому же, теперь еще и со спамерами объединились...
Однако, как порой неожиданно выясняется, далеко не все знают, что же, по сути, представляют собой компьютерные вирусы и откуда вообще эта напасть на наши головы свалилась. Поэтому цель этой статьи - попытаться объяснить общими словами и понятиями даже не что такое компьютерные вирусы и черви, а почему их существование вообще стало возможным. Какие особенности компьютерных программ делают их уязвимыми перед "виртуальной заразой" и в чем причина столь масштабных эпидемий.
Ни одна программа не идеальна - ведь их пишут живые люди. В любой обязательно находятся какие-либо ошибки - "баги" и "глюки". И чем сложнее программа (пакет программ), тем больше ошибок в ней неизбежно присутствует. А ведь любая ошибка - брешь, "ворота" для хакеров, компьютерных вирусов и червей.
По большому счету, любая брешь в программах может быть отнесена к одному из трех следующих типов.
Тип 1. У компьютерных вирусологов есть выражение: "Скальпель, забытый в животе". Дело в том, что любой программист в ходе написания и последующей отладки программы использует множество вспомогательных функций, позволяющих, например, смотреть или менять значения переменных, передавать управление в программе в обход тех или иных фрагментов кода и так далее. Конечно же, в конце, когда программа "вылизывается" и выпускается конечный продукт, все отладочные средства должны убираться. Но программисты, как мы уже сказали, тоже люди, и вполне могут забыть о той или иной функции, которая использовалась лишь временно и использовалась сугубо во вспомогательных целях. Если злоумышленник обнаружит соответствующий кусок кода, то вполне сможет использовать его в собственных целях.
Другой (к сожалению, нередкий) вариант - это когда программист вполне сознательно оставляет в своих программах лазейки (функции), позволяющие выполнять различные "нештатные" операции. Зачем это делается - вопрос отдельный. Кто-то из добрых побуждений (помочь системным администраторам), кто-то из злых (обрести "власть" над будущими пользователями программы). К этому типу брешей относится, например, известная брешь в MS SQL Server, которая позволяет пользователю с определенным логином получить права администратора на сервере.
Тип 2. Этот тип уязвимостей можно кратко охарактеризовать известной фразой: "Хотели как лучше, а получилось как всегда". Бреши этого типа обычно бывают связаны со специфическими возможностями программ, которые их создатели планировали использовать исключительно на благо пользователей. Но в результате фантазия хакеров оказывается более развитой, чем фантазия разработчиков, и созданные с благими намерениями функциональные возможности оборачиваются против пользователей. Типичный пример - появление т.н. макровирусов. Разработчики "революционной" версии MS Office хотели сделать благое дело - встроить в программный пакет мощную систему программирования, удобное средство для автоматизации множества задач. Что из этого вышло, известно, к сожалению, всем...
Тип 3. К этому типу относятся весьма распространенные уязвимости особого типа - возможности нестандартных манипуляций с программой. Программист, пишущий программу, изначально рассчитывает на то, что пользователь будет работать с ней так-то и никак иначе. Хакер же первым делом начинает думать: а что с программой еще можно такого-этакого сделать? А что будет, если сделать то-то или то-то?
В результате значительное число брешей используется следующим образом: злоумышленник подбирает такие наборы исходных данных для программы (или производит другие манипуляции с программой), которые даже гипотетически не предусматривались авторами программы. В этом случае не помогает и предусмотренная разработчиками "защита от дурака". Классические примеры брешей третьего типа основаны на так называемом "переполнении стека". Суть его в следующем. Как правило, в исполняемых файлах сначала располагается секция данных (именно в ней и хранятся значения вводимых исходных данных), а затем - сам исполняемый код программы. Если в программе не предусмотрена специальная защита, злоумышленник может таким образом подобрать исходные данные, чтобы они превысили допустимый размер и "вторглись" в секцию программного кода. Если при этом данные подобраны таким образом, чтобы фрагмент, попавший в секцию кода, был "осмысленным", то злоумышленник может заставить атакуемый компьютер выполнять свои команды. Описанный прием атаки широко известен, но разработчики программного обеспечения не учитывают его с завидным постоянством.
Наиболее известный, ставший классическим, пример использования процедуры переполнения стека - эпидемия вируса Морриса в 1998 году, которая (по самым скромным оценкам) стоила человечеству более 150.000.000 долларов.
Другой вариант использования бреши этого типа - такие манипуляции со вполне корректными исходными данными, которые не могли предвидеть программисты. В качестве примера можно привести способ взлома популярного SQL-сервера MySQL, при котором пользователь, имеющий право администрировать какую-нибудь базу данных на сервере, при определенных условиях мог получить права администратора сервера, переопределив пароль администратора. К этой же категории относится брешь в Microsoft Internet Information Server (IIS). С этой брешью была связана одна из самых громких вирусных эпидемий - эпидемия червя "CodeRed". Принципиальной особенностью "CodeRed" является то, что в процессе работы он не создает и не использует никаких временных или постоянных файлов. Данный червь уникален: он существует либо в системной памяти зараженных компьютеров, либо в виде TCP/IP-пакета при пересылке на удаленные машины. Подобная "бестелесность" представляет серьезную проблему для защиты серверов, поскольку требует установки специальных антивирусных модулей на межсетевые экраны.
Но что бы ни говорили, а все же самая уязвимая часть компьютера - это пользователь. Элементарная человеческая лень препятствует установке и/или обновлению антивирусов, файрволлов и прочего подобного ПО. И лишь мизерная часть пользователей устанавливает патчи, даже те, которые специалисты по компьютерной вирусологии классифицируют как "критические" для обеспечения безопасности.
|