Владислав Кабак | Omegicus CIO

NebKa

Животные

Сова является единственной птицей, которая может повернуть голову на 270 градусов.


читать далее »

Космос

Кометы движутся по гигантским эллиптическим орбитам со скоростью около 20 км/сек.


читать далее »

Анекдот

Зима, снег, метель. Едет дальнобойщик- матершинник на своей фуре с только-что подобранной, симпатичной, молодой попутчицой. Вдруг забуксовали! Дальнобойщик зло: - Ну всё, пи@дец, теперь нае@ёмся! Девица испугалась!!! Дальнобойщик: - Придётся цепи нах@й одевать!!! Девушка в шоке: - Товарищ водитель,


читать далее »

Винтажные подсвечники ко дню Святого Валентина

По материалам howdidyoudothat-jojo.blogspot.com/2014/01/valentines-day-diy.html



читать далее »

Curiosity нашёл органику на Марсе

Директор лаборатории JPL NASA Чарльз Элачи (Charles Elachi) сегодня упомянул о таинственной находке Curiosity на Марсе. Это некие «простые органические молекулы», не биологического происхождения. Выступая на научной конференции в Риме, он сказал об «органических и неорганических» доказательствах


читать далее »

Схемы детской вышивки для украшения одежды



читать далее »

Космос

У созвездия Большой Медведицы чрезвычайно медленно для земного наблюдения, но непрерывно изменяется форма ковша из-за движения звезд.


читать далее »

Как сделать игрушку-домик своими руками

Классика никогда не выходила из моды. Это утверждение прошло испытание временем, как в одежде так, и в украшениях. Украшения новогодней елки тоже можно украсить “классическими игрушками”, а не только свежеиспеченными Санта-Клаусами и однотонными шариками (на



читать далее »

Фоамиран мастер-класс мак



читать далее »

Природа

Каждый год от ледников на западном побережье Гренландии отрывается до 15 000 айсбергов.


читать далее »

Цветы из лент.



читать далее »

Цветные браслеты из застежки-молнии. МК.

Потребуются:застежки-молнии,плоскогубцы,ножницы,цветные нитки,застежки.                                      Обрезать часть ткани на молниях.Обернуть хлопчатобумажной пряжей, вставляя нить в пространство между зубчиками.Кончики нитки закрепить клеем.С помощью



читать далее »

Природа

Крупнейшие плотины мира удерживают в своих водохранилищах столько же воды, сколько ее во всем Северном море.


читать далее »

Джинсовые переделки

или Как правильно разрезать джинсы, чтобы сшить из них юбку и не только Вроде интересно и понятно. Но всё равно нужно пробовать. Хотя и для того, чтобы попробовать лучшевсего знать как разрезать правильно. Я, например, много



читать далее »

ЖУРНАЛЬНЫЙ СТОЛИК ИЗ КОНСЕРВНЫХ БАНОК

   Идея и исполнение Vanesa Martin. Основание журнального столика создается из 17 жестянных банок следующих размеров: одна - 10 см в высоту и  25см в диаметре, 8 -12 см в высоту и 7 см в диаметре и еще



читать далее »

Что можно сделать из ПВХ труб. Идеи и мастер-классы

1. Багажник для автомобиля. Вот такой багажник для авто можно соорудить из водопроводных труб. Не менее интересно смотрится держатель для велосипеда на автомобиль.   2. Бортик на кровать. Чтобы ребенок ночью не упал с кровати, можно смастерить импровизированный бортик. 3.



читать далее »

Ленточное кружево

 



читать далее »

Вязаная полосатая подушечка (спицы) Мастер класс вязания лицевым джерси

Незамысловатая вязаная подушечка в полоску — вот простое, но эффектное украшение для любой гостиной! Посмотрите, как легко полотно, связанное лицевым джерси, превращается в чехол для подушки! А если его ещё и украсить полосками модной расцветки, будет просто



читать далее »

Мой совет:

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


читать далее »

МОЛОЧНОЕ МЫЛО

Очень интересная задумка. С молоком я ещё не делала мыла. Говорят благодаря ему мыло становится более мягкое и нежное.Состав: - 100 г белой основы - 1 капля красителя «персик» - 1,5 ч.ложки сухого молока - 1 ч. ложка масла


читать далее »

Шикарный самодельный стол, совмещенный с компьютером

Самодельный компьютерный стол с прозрачной столешницей Давненько у нас не было постов, точнее самоделок про компьютер и красоту.Показываю сразу и то и другое — просто шикарный стол совмещенный с системным блоком компьютера.Особо замечателен своей прозрачной столешницей, цветной



читать далее »

Природа

Озеро Байкал можно заполнить 94 водоемами, как Азовское море.


читать далее »

Шьем детские штанишки из рукавов папиной джинсовой рубашки

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



читать далее »

Реклама в сумеречной зоне подсознания

Автор: (c)Крис Касперски ака мыщъх Реклама действует, это факт! Но вот - как именно она действует, не знает никто, поскольку действующая реклама всегда создается по наитию и попытки повторить однажды придуманный рецепт практически всегда заканчиваются провалом. Какие же механизмы


читать далее »

Как сделать сутажную брошь "Моряцкая"

Слова автора:  LoK (ILoK) Данный мастер-класс посвящен ознакомлению с вышивкой в сутажной технике. Я хотела бы рассказать о том, как делаю это я. Возможно, кому-то покажется это интересным – буду рада, а также буду рада и всем тем,



читать далее »

Сшить детские сандалии

  



читать далее »

Мой совет:

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


читать далее »

Анекдот

Вчера на работе искали справедливость. . Сегодня ищем работу


читать далее »

СЕРЫЙ ПУЛОВЕР С КОРОТКИМИ РУКАВАМИ (спицы)

Свободный пуловер с большим открытым сбоку воротником и ажурной вставкой спереди — отличный вариант для комбинирования.Размеры: 40/42 (44/46) 48/50Вам потребуется: 500 (550) 600 г серой пряжи Merino 105 (100% шерсти, 105 м/50 г); спицы №



читать далее »

Тележка - МК

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



читать далее »

Анекдот

Фраза "Мы можем остаться друзьями"-это то же самое, как если бы ваша мама сказала: "Твоя собака умерла, но ты все равно можешь ее оставить".


читать далее »

Анекдот

- Дорогой, дай денег на солярий. - Может уже хватит? На тебя уже скинхеды стали оборачиваться!


читать далее »

Как сшить тапочки эльфа из фетра

3.4.5.6.8.



читать далее »

Делаем подвеску в виде листика из меди в технике wire wrap

Автор мастер-класса:   Татьяна Малейчук ( Wire Wrap) Как напоминание о прекрасной осенней поре, предлагаю сегодня сделать вот такую вот подвеску в виде листика "Очарование осени" в технике wire wrap :) 1. Для работы нам понадобятся: - собственно медная проволока


читать далее »

Анекдот

Иногда мой кот смотрит на меня, как бы говоря: "Вот я – кот. А чего добился ты?"


читать далее »

Модели домашнего фартука.

1.  2. 3. 4. 5. 6. 7. 8. 9. 10.



читать далее »

Космос

В облаках межзвездного газа, находящихся в центре нашей Галактики, обнаружен сахар.


читать далее »

Подборка идей украшений из тыквы своими руками

Предлагаю вашему вниманию подборку того, что можно сделать из тыквы свомим руками) Есть идеи,а есть и мастер классы. Приятного просмотра ;) Можно сделать сказочные домики из тыквы так как это сделала американская мастерица Anne из Sikeston, Missouri.  Небольшой


читать далее »

Анекдот

Деда Афанасия в деревне не любили. Он в 1930 году бутылку водки уронил.


читать далее »

Человек

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


читать далее »

Зонд Dawn приблизился к Весте на минимальное расстояние

Космический посланник снизил свою орбиту до высоты всего в 210 километров. С этой позиции зонд будет изучать небесное тело в течение следующих десяти недель.Аппарат Dawn успешно выполнил серию манёвров, которые учёные окрестили «красивой хореографией». Теперь машина находится в самом



читать далее »

Анекдот

Маленький мальчик написал Деду Морозу:"Пришли мне, пожайлуста, братика".Дед Мороз ответил:"Нет проблем. Пришли мне свою маму".


читать далее »

Гребень из холодного фарфора: мастер-класс

Как вы уже поняли, на страничке этого мастер-класса вы изучите технику изготовления заколки в виде гребня из холодного фарфора. Украшен гребень будет голубыми цветочками. Они немного напоминают крокусы, но как вы знаете у крокусов шесть лепесточков. А в



читать далее »

Кольцо Double

Кольца на всю длину пальца или сдвоенные, кольца-костеты или double (двойные) первоначально были украшениями некоторых субкультур - готы, эмо и т.д. Сейчас такие украшения не вызывают ассоциаций, а просто красивые, необычные и оригинальные.   И нет необходимости



читать далее »

Разное

80% десятилетних девочек в США садятся на диету.


читать далее »

Человек

В возрасте 60, большинство людей теряют половину своих вкусовых рецепторов.


читать далее »

Мой совет:

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


читать далее »

Как вшить молнию при пошиве косметички. Фото мастер-класс

  Russian-Handmade



читать далее »

Анекдот

денег, которые я заработала, хватит мне до конца жизни,если я умру сегодня в 15.00


читать далее »

Анекдот

- Ну что, Маринка , договорились? Первое время у меня поживёшь, а утром домой пойдёшь...


читать далее »

КРЕСЛО! Когда б вы знали, из какого сора...

АВТОР: http://svoimirukami.mirtesen.ru/blog/43673551699/Kogda-b-vyi-znali,-iz-kakogo-sora... Не знаю, пригодится ли кому-то из читателей эта идея. Я совсем не уверена, что кто-то захочет применить ее на практике, и все же. Она вполне может натолкнуть читателей на другие интересные решения. Во всяком случае,



читать далее »

География

10 процентов доходов правительства России поступает от продажи водки.


читать далее »

Веер из джута. Вам понравится...

Продолжение темы про джутовую филигрань.   Здравствуйте!  Недавно я освоила интересную технику, применила ее для небольших пробных работ. А сейчас попробовала соорудить  нечто помасштабнее. Купила бамбуковые шпажки, джутовый шнур, клей и села колдовать! В итоге наколдовала



читать далее »

География

В Исландии давать чаевые воспринимается как оскорбление.


читать далее »

Экономим силы в огороде: лента с семенами своими руками

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



читать далее »

Дом для кошки из газет. Мастер-класс.

1. Вот дом для кошки из газетных трубочек. Донышко овальное 40х35, высота первого этажа 23 см, ширина газетной полоски 9 см. Кручу газетные трубочки на спицу длинную. Если поделка должна быть прочной, то полоска пошире, а если что-то



читать далее »

Животные

У мотылька нет желудка.


читать далее »

Новая жизнь куклы с трудной судьбой

Слова автора:   Оксана Сурова кукольная мастерская Источник  http://www.livemaster.ru/topic/425803-novaya-zhizn-kukly-s-t... Началась эта история очень давно, когда я была ещё совсем маленькой девочкой. Была у меня любимая книжка, " Буратино", большая и красивая, с роскошными иллюстрациями. Ах, какая там была  Мальвина, девочка с



читать далее »

"Милен Фармер"

Хочу показать как я делаю "Милен", думаю новичкам пригодится!Для работы нам потребуется: 1. Мелкие бусины 3 мм (148шт)2. Средние бусины 5 мм (251шт)3. Большие бусины 6 мм (132шт)4. Бусины «рис» (32шт)5. Бисер (~ 20-25 г)6. Игла7.



читать далее »

Мой совет:

От чистки картофеля темнеет кожа на руках. Чтобы этого избежать, необходимо перед работой смочить руки уксусом и дать им высохнуть, а после работы сразу вымыть с мылом и смазать кремом.


читать далее »

Шьем из старого свитера сумочку для девочки. Цветы из фетра

Прежде чем выбрасывать старый свитер, подумайте) А может стоит из него сшить вот такую нежную сумочку для девочки?     Можно украсить и вот такими цветочками   Разрезать старый свитер и вырезать детали сумочки: две половинки и донышко Сшить две детали



читать далее »

Человек

Всех людей на планете можно с комфортом уложить в куб со стороной 1000 метров.


читать далее »

Обновленная сумка из кожи своими руками

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



читать далее »

КАК СДЕЛАТЬ ТАК, ЧТОБЫ СУХОЦВЕТЫ И ДРУГИЕ ДОБАВКИ НЕ ОСЕДАЛИ НА ДНЕ ФОРМОЧКИ? (Совет)

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


читать далее »
Здесь пока пусто

Unauthorized.

Java под атакой

2011.10.08

Java под атакой

Автор: (c)Крис Касперски ака мыщъх

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

Введение

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

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

Однако не все дыры могут быть закрыты заплатками. В отличии от Си, подавляющее большинство ошибок которого носит характер мелкой косметической правки ("^#%! Мы опять забыли проверить длину строки перед ее копированием!"), дефекты виртуальных Java-машин намного более трансцендентальны - дыра не сосредоточенна в какой-то конкретной строчке кода, а представляет собой некоторую комбинацию свойств виртуальной машины, которая при стечении определенных обстоятельств приводит к возможности реализации атаки.

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

Допустим, для реализации атаки необходимо задействовать свойства k, q и e. Допустим также, что подобная комбинация свойств практически не используется в честных программах и потому производитель добавляет фильтр, блокирующий их выполнение, однако если представить свойство k в виде прямых (или побочных) эффектов свойств m и n, то фильтр, очевидно, пропустит такую комбинацию мимо ушей. Отсюда следует важный вывод: даже если производитель рапортует об успешной ликвидации дыры, и даже если пользователи уже установили заплатки, это еще не значит, что дыры действительно нет. Исправляется ведь причина, а не следствие! Хакеры просто находят другой путь для достижения того же самого следствия, "воскрешая" дыры, о которых все забыли.

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

На момент написания данной статьи в Java-машинах было обнаружено свыше трехсот дефектов, связанных с безопасностью, часть их которых давно закрыта, а часть остается актуальной и до сих пор. Рассказать обо всех ошибках мы не можем, да, это, наверное, и ни нужно (достаточно зайти на www.securityfocus.com, набрать в строке запроса "Java" и читать, читать и читать). Мы же ставим перед собой совсем иную задачу: классифицировать ошибки по типам, перечислив основные объекты хакерских атак и источники угрозы.

Нецензурный кастинг или обход системы типов

Жесткая типизация языка Java предотвращает множество непредумышленных ошибок программирования, связанных с присвоением одного типа другому. Защита реализована на уровне виртуальной машины, а не на самом языке программирования (как, например, это сделано в Си++). Попытка совершить выход из функции, подсунув инструкции return массив или символьную строку вместо адреса возврата (типичный сценарий хакерских атак на переполняющиеся буфера), приведет к аварийному завершению Java-приложения. На этом же держится и контроль границ массивов, и доступ к приватным полям классов, и многое другое.

Перехитрив типизацию, мы сломаем всю систему безопасности Java и сможем делать практически все, что угодно: переполнять буфера, вызывать приватные методы защищенных классов и т.д. Естественно, это уже будут умышленные "ошибки", построенные на слабости механизмов контроля типов. Ну, а мы про что говорим?! Хакерская атака есть ни что иное, как умышленный отход от спецификации, то есть, грубо говоря, сознательное преступление.

Далеко не все знают, что на уровне виртуальной машины Java-платформы защищены намного слабее, чем это следует из маркетинговой компании и популярных руководств для чайников, носорогов и прочих парнокопытных. В спецификации на JVM присутствует большое количество документированных(!) инструкций для низкоуровневого преобразования типов: i2b, i2c, i2d, i2f, i2l, i2s, l2i, l2f, l2d, f2i, f2l, f2d, d2i, d2l, d2f и даже пара команд для работы с классами: checkcst, instanceof, описание которых выложено на http://mrl.nyu.edu/~meyer/jvmref/ref-Java.html.

Более того, в пакете инструментария для разработчика Java-программ содержится официальный код, показывающий как "правильно" преобразовать один тип к любому другому (см. рис. 1). Так что, в некотором смысле это и не взлом вовсе, а документированная особенность Java.

Байт-код функции castMyType

Рисунок 1. Байт-код функции castMyType, преобразующий один тип к любому другому.

Как можно использовать эту особенность на практике? Допустим, мы имеем два класса: trusted, исполняющийся в привилегированном интервале (а, значит, владеющий всеми ресурсами виртуальной машины) и untrusted, помещенный в "песочницу". Допустим также, что класс trusted имеет ряд приватных методов, предназначенных строго для внутреннего использования и скрытых от "внешнего мира" системой типизации. На бумаге эта схема выглядит безупречной, но в действительности ее легко обойти путем создания подложного класса (назовем его spoofed) полностью идентичного данному, но только с public-атрибутами вместо private. Явное преобразование экземпляров класса trusted и spoofed позволит обращаться к защищенным методам, вызывая их не только из других классов, но даже из untrusted-кода! (см. рис. 2).

Использование преобразование типов

Рисунок 2. Использование преобразование типов для снятия "блокировки" с приватных методов trusted-класса, вызываемого из untrusted-кода.

Такой беспредел происходит потому, что в JVM отсутствует runtime-проверки атрибутов полей класса при обращении к ним методами getfield/putfield, но если бы они даже и присутствовали (сжирая дополнительные процессорные такты), злоумышленнику ничего бы не стоило хакнуть атрибуты путем прямой модификации структуры класса двумя замечательными инструкциями JVM - getLong и putLong, специально предназначенными для низкоуровневого взаимодействия с памятью виртуальной Java-машины (однако в этом случае атакующему придется учитывать версию JVM, поскольку "физическая" структура классов не остается постоянной, а подвержена существенным изменениям).

Теперь перейдем к переполняющимся буферам. Как уже было сказано выше, Java контролирует выход за границы массивов на уровне JVM и потому случайно переполнить буфер невозможно, однако это легко сделать умышлено - достаточно всего лишь воспользоваться преобразованием типов, искусственно раздвинув границы массива. При записи в буфер JVM отслеживает лишь выход индекса за его границы, но (по соображениям производительности) не проверяет: принадлежит ли записываемая память кому-то еще. Учитывая, что экземпляры классов (они же объекты) располагаются в памяти более или менее последовательно (см. рис. 3), мы можем свободно перезаписывать атрибуты, указатели и прочие данные остальных классов (в том числе и доверенных!).

Естественно, для реализации данной атаки необходимо написать зловредное Java-приложение и забросить его на целевой компьютер. Атаковать уже установленные приложения не получится, поскольку мы не в состоянии осуществлять удаленное преобразование типов. Однако... кое-какие зацепки все-таки есть. Некоторые программисты при переносе Си-программ на Java испытывают потребность в работе с указателями на блок "неразборчивых" данных заранее неизвестной длины. Java таких фокусов не позволяет, вот и приходится выкручиваться путем явных преобразований. Фактически это означает, что программист сознательно отказывается от жесткой типизации и говорит Java-машине: "не надо проверять типы, границы массивов, etc - я и сам знаю, как это делать". Таким образом, нельзя "а приори" утверждать, что Java-приложения свободны от ошибок переполнения буферов. Пускай они встречаются намного реже, чем в Си-программах, но все-таки встречаются...

Приблизительная схема размещения экземпляров объектов

Рисунок 3. Приблизительная схема размещения экземпляров объектов в памяти Java-машины.

Обход верификатора

Верификатор относится к одному из самых разрекламированных компонентов JVM. Весь Java-код (в том числе и добавляемый динамически) в обязательном порядке проходит через сложную систему многочисленных фильтров, озабоченных суровыми проверками на предмет корректности исполняемого кода.

В частности, если тупо попытаться забросить на вершину стека массив командой aload_1, а потом уйти в возврат из функции по ireturn (см. рис. 4), верификатор немедленно встрепенется и этот номер не пройдет.

Пример кода

Рисунок 4. Пример кода, не отвечающего требованиям верификатора (на вершине стека находится массив, в то время как ireturn ожидает увидеть целочисленный тип).

Как и любая другая достаточно сложная программа, верификатор несовершенен и подвержен ошибкам, первую из которых обнаружил сотрудник Маргбурского Университета (Германия) Карстер Зор (Karsten Sohr) в далеком 1999 году, обративший внимание на то, что верификатор начинает конкретно "буксовать" в случае, если последняя проверяемая инструкция находится внутри обработчика исключений, что позволяет, в частности, осуществлять "нелегальное" преобразование одного класса к любому другому (см. рис. 5).

Пример кода

Рисунок 5. Пример кода, "проскальзывающего" сквозь верификатор.

Несмотря на то, что данная ошибка уже давно устранена (и сейчас представляет не более чем исторический интерес), сам факт ее наличия указывает на множество неоткрытых (а, значит, еще неисправленных) дефектов верификатора. Причем, учитывая резкое усложнение верификатора в последних версиях JVM, есть все основания полагать, что безопасность от этого не только не возросла, но даже, напротив, существенно пострадала. Ошибки в верификаторах виртуальных Java-машин обнаруживаются одна за другой - производители уже запыхались их латать, а пользователи - запарились ставить заплатки.

Другой интересный момент - атака на отказ в обслуживании. Обычно для проверки метода, состоящего из N инструкций виртуальной машины, верификатору требуется совершить N итераций, в результате чего сложность линейно растет с размером класса и составляет O(n). Если же каждая инструкция метода взаимодействует со всеми остальными (например, через стек или еще как), то верификатору уже требуется N2 итераций и сложность, соответственно, составляет O(N2), что и продемонстрировано на рис. 6.

Подсунув верификатору метод, состоящий из десятков (или даже сотен!) тысяч инструкций, взаимодействующих друг с другом, мы введем ее в глубокую задумчивость, выход из которой конструктивно не предусмотрен и пользователю придется аварийно завершать работу Java-программы вместе с Java-машиной в придачу. Лекарства от данной "болезни" нет и, хотя компания Sun делает некоторые шаги в этом направлении, пересматривая набор команд JVM и выкидывая оттуда все "ненужное", сложность анализа байт кода по-прежнему остается O(N2). Особенно эта проблема актуальная для серверов, встраиваемых устройств, сотовых телефонов - там, где снятие зависшей Java-машины невозможно или сопряжено с потерей времени/данных.

Приблизительное время верификации функции

Рисунок 6. Приблизительное время верификации функции с невзаимодействующими и взаимодействующими инструкциями (нижняя и верхняя кривая, соответственно), по горизонтальной оси откладываются инструкции, по вертикальной - время в секундах, измерения проводились на 2.53 GHz P4, запущенном под управлением ОС Linux и Sun HotSpot VM 1.41.

Ошибки в JIT компиляторах

Современные процессоры очень быстры (прямо мустанги какие-то!), но Java-машины настолько неповоротливы, что способы выполнять только простейшие приложения, не критичные ко времени исполнения. Например, проверять корректность заполнения web-форм перед их отправкой на сервер, однако попытки создать на Java что-то действительно серьезное наталкиваются на неоправданно низкую производительность JVM для преодоления которой придумали JIT-компиляторы (Just-In-Time), транслирующие байт-код непосредственно в "наивный" (native) код целевого процессора, в результате чего Java-программы по скорости выполнения не сильно уступают своим аналогам на Си, но в некоторых случаях даже превосходят их (впрочем, тут все зависит от того, чей оптимизатор круче).

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

Отсутствие динамического анализа и скрупулезных проверок времени исполнения (их наличие сильно замедлило бы производительность) позволяет злоумышленнику сравнительно честными путями вырываться за пределы виртуальной машины, вызывая произвольные API-функции операционной системы или даже модифицируя саму(!) виртуальную машину по своему усмотрению!

К тому же, JIT-компиляторы при некоторых обстоятельствах сурово ошибаются, генерируя неправильный код. Рассмотрим следующий пример (см. рис. 7), срывающий крышу Symantec JIT-компилятору, используемому, в частности, в Netscape-браузере версий 4.0-4.79 под Windows/x86.

Байт-код забрасывает на вершину стека нулевую константу (команда aconst_null), после чего вызывает локальную подпрограмму командой jsr 1l, где тут же выталкивает двойное слово с вершины стека в виртуальный регистр R1 и возвращается из нее обратно, переходя по адресу, содержащимся в виртуальном регистре R1 (а в нем как раз и лежит адрес возврата из локальной подпрограммы). Так что с точки зрения верификатора все выглядит предельно корректно и у него никаких претензий нет.

Байт-код (слева) и результат его компиляции

Рисунок 7. Байт-код (слева) и результат его компиляции в x86-код Symantec JIT-компилятором.

Что же касается JIT-компилятора, то перед входом в функции он сохраняет регистр EAX в стеке (условно соответствующий виртуальному регистру R1), далее обнуляет его (команда XOR EAX,EAX), но не кладет в стек, а прямо так в регистре и оставляет. Потом вызывает локальную подпрограмму (инструкция CALL l1), забрасывая на стек адрес возврата (т.е. адрес первой следующей за ней команды - инструкции POP ECX). В самой же подпрограмме компилятор стягивает с вершины стека двойное слово, помещая его в регистр EAX (команда POP EAX), что совершенно правильно, а вот затем, отрабатывая RET 1, он вместо того, чтобы сразу прыгнуть на JMP EAX, по совершенно непонятным причинам еще раз лезет в стек и копирует в EAX двойное слово, находящееся на его вершине (инструкция "MOV EAX, [ESP]", в результате чего реальный переход осуществляется по физическому указателю, находящемуся в регистре EAX.

Обычно там находится мусор и программа (вместе с Java-машиной) просто рушится, однако при желании можно воздействовать на EAX, засунув в него указатель на shell-код или что-то типа того. Для этого перед вызовом функции jump() достаточно выполнить следующую последовательность команд виртуальной машины: iload_1/ireturn.

Сейчас эта дыра уже заткнута (и приведена лишь в качестве примера), но свежими уязвимостями всегда можно разжиться на www.securityfocus.com.

Повышение собственных привилегий

Несанкционированное повышение привилегий актуально главным образом для Java-приложений, поступающий из ненадежных источников (например, из сети) и выполняемых в "песочнице" (sandbox), прорыв за пределы которой приводит к полной анархии. Злоумышленник получает возможность исполнять любой код, открывать порты, обращаться к локальным файлам и т.д.

В последних версиях JVM песочницу растащили на стройматериалы, ушедшие на создание новой системы безопасности, обеспечивающей разграничение доступа не на уровне Java-приложений (как это было раньше), а на уровне отдельных классов. Доверенные (trusted) классы могут делать все что угодно (если только не оговорено обратное). Остальные же довольствуются обращением к публичным методам доверенных классов. Если атакующий сможет добраться до приватных (или защищенных) методов доверенного класса, его цель будет достигнута.

В верификаторе Java-машины, встроенной в MS IE версий 4.0, 5.0 и 6.0, присутствовал коварный дефект, позволяющий создавать полностью инициализированные экземпляры классов, даже при возникновении исключения в методе super().

Метод super() похож на указатель this, поддерживаемый Java/Си++, однако в отличии от this, указывающего на экземпляр данного класса, super() вызывает конструктор суперкласса (или базового класса в терминах Си++), к которому принадлежит данный экземпляр производного класса (узнать подробнее о методах this() и super() можно на http://www.faqs.org/docs/javap/c5/s5.html).

Хорошая идея - взять доверенный класс и создать экземпляр производного класса (или sub-класса в терминах Java) и проинициализировать его вызовом super(). Тогда злоумышленник сможет вырваться за пределы песочницы (которой, как мы помним, уже нет). Пример реализации прорывного кода приведен ниже (см. рис. 8).

Исходный код Java-exploit-a

Рисунок 8. Исходный код Java-exploit'а, пытающийся повысить собственные привилегии, но пресекаемый еще на стадии трансляции Java-компилятором.

Единственная проблема, с которой столкнется атакующий - Java-компилятор откажется транслировать такой код (и это, в общем-то, правильно), однако если вручную запрограммировать зловредную программу на Java-ассемблере (в качестве которого можно взять бесплатный транслятор Жасмин - http://jasmin.sf.net), верификатор байт-кода примет ее как родную, поскольку Java-машина, реализованная в IE, выполняет линейный анализ кода, а с этой точки зрения код вполне нормален (см. рис. 9)

Байт-код exploit-a

Рисунок 9. Байт-код exploit'а, повышающего свои привилегии и свободно проходящего через верификатор MS IE версий 4.0, 5.0 и 6.0.

Похожие ошибки содержатся и в других виртуальных машинах. В частности, в Netscape версий 4.0 - 4.79 вообще можно обойтись без вызовов this() и super(), заменив их ветвлениями (jsr/astore/ret). Так что для исследований открыт полный простор.

Дыры в runtime-библиотеках и системных классах

В конце апреля 2007 года в Apple QuickTime Player'e всех версий, вплоть до 7.1.5 обнаружилась огромная дыра, позволяющая Java-приложениям исполнять произвольный код на удаленной системе. Достаточно зайти на Web-страничку злоумышленника и... все. Учитывая огромную распространенность Apple QuickTime Player'а с одной стороны и Microsoft Internet Explorer'а - с другой, произошло своеобразное перекрестное опыление, в результате чего пострадали сразу обе системы: как вся линейка Windows NT (включая Висту), так и Mac OS.

Впрочем, сама Java-машина тут не при чем. Ошибка сидит во внешнем (по отношению к ней компоненте), и потому уязвимость распространяется не только на IE, но и FireFox.

// инициализирует Quick-Time
QTSession.open();

// получаем обработчик, указывающий на что угодно
byte b[] = new byte[1 /* здесь может быть любое число */];
QTHandle h = new QTHandle(b);

// превращаем обработчик в указатель на объект,
// огромное отрицательное значение обходит проверку диапазона

QTPointerRef p = h.toQTPointer(-2000000000 /* смещение */, 10 /* размер */);

// перезаписываем объект
p.copyFromArray(0 /* смещение */, b /* источник */, 0, 1 /* длина */);

Листинг 1. Exploit, пробивающий практически любую Java-машину при наличии установленного Apple QuickTime Player'а с версией 7.1.5 или более ранней.

Этот пример наглядно доказывает, что говорить о безопасности Java в отрыве от надежности всех остальных компонентов операционной системы и ее окружения - наивно. Java должна либо быть "вещью в себе" и не допускать никаких внешних вызовов (так вели себя некоторые диалекты Бейсика на 8-разрядных компьютерах, из лексикона которых были исключены операторы CALL, PEEK и POKE), либо открыто признать, что на шатком фундаменте крепости не построишь и доверять Java-приложениям (даже с учетом всей многоуровневой системы безопасности все равно нельзя).

Microsoft приводит в лагерь Apple троянского коня

Рисунок 10. Microsoft приводит в лагерь Apple троянского коня.

Впрочем, отказ от внешних вызовов ничего не решает, поскольку системные библиотеки, поставляемые вместе с Java-машиной, ничем не лучше прочих компонентов и могут содержать различные дефекты проектирования. Хотите пример? Пожалуйста! В начале 2007 года в Sun JRE 5.0 Update 9 (включая и более ранние версии) была обнаружена грандиозная ошибка, связанная с обработчиком заголовков GIF-файлов и содержащая уязвимость, приводящую к возможности передачи управления на shell-код, расположенный непосредственно в самом GIF-файле.

Технические подробности можно найти на www.securityfocus.com/archive/1/457159, а поживиться exploit'ом - на http://www.securityfocus.com/archive/1/457638. Для нас же важен сам факт небезупречной реализации Java-машины. В то время, как теоретики от программирования старательно выводят запутанные диаграммы, иллюстрирующие "продвинутую" модель безопасности Java с многоуровневой системой защиты, хакеры дизассемблируют библиотечные файлы на предмет поиска реальных уязвимостей.

Военная мудрость гласит - чем больше расставлено линий обороны, тем выше вероятность прорыва противника, ибо надежная линия обороны справляется со своей задачей и одна. Можно сколько угодно укреплять замок крепостными валами и рвами, но это не защитит его от пикирующего бомбардировщика. С "воздуха" (то есть, изнутри системных библиотек) Java вообще никак не защищена. Ошибки там были и будут! Достаточно просто взглянуть на размер дистрибутива (полсотни мегабайт в упакованном виде) и попытаться представить себе - сколько человеко-часов требуется для его тестирования и реально ли собрать такое количество высококвалифицированных специалистов под "одну крышу". А ведь помимо стандартных библиотек общего назначения, есть еще и нестандартные, например, JGL, используемая для отрисовки трехмерных объектов и широко применяемая в задачах на моделирование...

Заключение

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

Как этому противостоять? Увы, универсальных рецептов нет. С другой стороны, эксплуатация Java-приложений ничем не отличается ото всех остальных, написанных на Си/Си++, DELPHI, PHP. Залог здоровья - в своевременной установке заплаток и правильном выборе партнеров - реализация JVM от Sun по многим параметрам лучше, чем у IBM, однако в силу своей огромной распространенности у Sun-машины гораздо больше шансов быть атакованной.

Собственно говоря, никаких поводов для паники у нас нет. Java-технологии оказались уязвимыми? Ну и что?! Ах, реклама вам обещала обратное! Значит, в следующий раз не верьте рекламе. Как говорится, программ без ошибок не бывает. Бывает, просто плохо искали. Просто так исторически сложилось, что хакеры, убежденные в несокрушимости Java-платформы долгое время не уделяли ей никакого внимания. Теперь же лед тронулся, господа!!!

https://nebka.ru/?uid=1&post=20958