Нападения на дефектный код
Большинство проблем, связанных с компьютерной безопасностью, которые нам приходится наблюдать, являются результатом дефектов в программном коде. Вот некоторые примеры:
• В 1988 году червь Морриса использовал ошибку в UNIX для получения полного доступа к компьютерам, выполняющим программы. Это привело к переполнению буфера, о чем будет рассказано в следующем подразделе.
• В 1999 году некто обнаружил ошибку в сценарии Hotmail CGI, позволяющую пользователю получить доступ к записям электронной почты другого пользователя. Дефекты такого рода обсуждались в главе 10.
Традиционно дефектный код был орудием, используемым для взлома компьютеров. Например, недостатки программ, отсылающих почту, повлекли за собой огромное количество незаконных проникновений в компьютеры с операционной системой UNIX. Цель подобных нападений состоит в использовании погрешностей таким образом, чтобы нападающий мог взять в свои руки контроль над системой. Нападения незаметны, они могут использовать настройку параметров для получения доступа или лазейки в заголовке сообщения об ошибках для прочтения защищенных файлов, количество таких нападений огромно. Временами кажется, что каждый день происходит новое нападение на почтовые программы, после которого в очередной раз исправляются не найденные до того ошибки. (Производятся ли после этого исправления у пользователей коммерческих программ – это другой вопрос.)
Более недавний пример – это модель безопасности Java. В Java используется модель комплексной безопасности для защиты компьютеров от вредоносных апплетов Java. Ошибка в любом месте программного кода, ответственного за работу защитных механизмов, может сделать все эти механизмы бесполезными, и, если такая ошибка случится, характерные для Java нападения хлынут широким потоком, используя любые недостатки системы.
Эти примеры вызывают больше беспокойства, чем проблема «Ариан» (несмотря на меньшую степень накала страстей), поскольку недостатки, которые могут быть использованы для взлома защиты, обычно не влияют на выполнение программ. Они незаметно присутствуют там до тех пор, пока кто-либо не воспользуется ими. Это очень важно и потому создание защиты сложнее, чем обеспечение надежности. Ошибка, повлекшая за собой катастрофу «Ариан», – это единственный случай, который затронул выполнение. Как только ошибка при выполнении найдена – и предварительное тестирование сможет обнаружить ее – она может быть исправлена. Дефекты защиты не влияют на выполнение и не проявляются в результатах предварительного тестирования. Подробнее о надежности тестирования будет рассказано в главе 22, но мораль в том, что люди постоянно спотыкаются о недостатки в системах безопасности, и только опытные эксперты на самом деле способны отыскать их.
Такое случается постоянно. Когда квалифицированный специалист производит анализ защиты программного обеспечения, он всегда обнаружит случайные недостатки, подрывающие систему безопасности. Всегда. Чем сложнее код, тем больше несовершенства в его защите.
Огрехи защиты, однажды обнаруженные, будут использоваться до тех пор, пока не будут устранены. Предположим, что нападающий нашел брешь в защите торгового протокола, что позволило ему украсть номер кредитной карты или, что еще хуже деньги. Если его действия мотивировались желанием создать саморекламу, он известит о своем достижении прессу и эта ошибка будет исправлена. (Хотелось бы надеяться, что сначала он предупредит компанию.) Если его действиями управляет желание получить деньги, нападающий станет использовать эту возможность снова и снова. Он украдет столько, сколько сможет, пока еще кто-нибудь не обнаружит этот недостаток и не исправит его. В этом основное отличие: недостатки, влияющие на выполнение, заметны, в то время как недочеты защиты могут оставаться невидимыми в течение долгого времени.
Эти недостатки не обязательно находятся в коде, относящемся к системе безопасности. Они могут присутствовать повсюду: в интерфейсе пользователя, в программах обработки ошибок, в любом другом месте. И как мы видели в главе 10, даже программы, не имеющие никакого отношения к компьютерной безопасности, могут повлиять на защищенность компьютеров, работающих в сети. Недостатки в текстовом процессоре, драйвере принтера или мультимедийном проигрывателе могут полностью подорвать систему безопасности вашего компьютера.
Еще один вывод состоит в том, что ошибки в программном обеспечении (и, следовательно, недостатки защиты) неминуемы. Предположение, что огромное пространство Интернета может быть свободно от ошибок, настолько же невероятно, как, то, что программное обеспечение «Ариан 5» было полностью защищено от сбоев и лишь несчастливое стечение обстоятельств привело к таким катастрофическим последствиям.
Мы наблюдали подобные вещи в Windows NT. He проходит и дня без объявления об обнаружении нового просчета в системе безопасности этой программы. Те же тенденции наблюдаются и в Windows 2000.