Вход | Регистрация


Информационные технологии ::

Метки:

Вирусы в картинках - что нас ждет в будущем

Я
   skunk
 
17.02.04 - 18:57
Начало жути связи с кражей исходников положено:


Украинский Антивирусный Центр, разработчик комплексных систем антивирусной защиты, сообщает о возможности появления нового класса вирусов, которые могут использовать уязвимости Windows, обнаруженные после опубликования исходных кодов операционной системы....

читать полностью
http://www.unasoft.com.ua/rus/news.php?id=124&sites=Russian


продолжение следует...
 
  Рекламное место пустует
   romix
1 - 17.02.04 - 19:25
И в Microsoft, и в Intel годами не могут защититься от простейшей вещи - переполнения буфера.

MS еще в феврале 2002 года выпустила компилятор с опцией, которая проверяет целостность адреса возврата и указателей перед переходом (кладут перед уязвимым адресом перехода контрольное значение, и если оно повреждено - аварийно выходят). Патент принадлежит некоему Cowan'у, но MS на него благополучно забили.

void func(){
//выше в стеке лежит адрес возврата
int Canary=GlobalRandomVariable;
//взводим контрольное значение - "канарейку"
...

//проверяем контрольное значение
if (Canary!=GlobalRandomVariable)
// если вирус покоцал канарейку, то аварийно завершаемся
exit(1);
//иначе все ок
}

А Intel не запрещала выполнение кода в буферах до самого последнего момента (несмотря на то что функции WinAPI - VirtualAlloc() и пр. якобы поддерживают защиту от выполнения, на самом деле микропроцессор это не поддерживает, и позволяет выполняться инструкциям в страницах с данными - для всех процессоров, кроме самых последних).

Таким образом, две простейшие меры дают 100% защиту от переполнения буфера вирусом. Или любая из них. А почему это годами не могут сделать - надеюсь, понятно. Про ЦРУ слышали? :-)
   skunk
 
2 - 17.02.04 - 19:44
как все просто то оказывается ;-)

а ты, ни чего если на ты, хоть раз под отладчиком смотрел как происходит срыв стека в живу, советую, посмотри
   romix
3 - 17.02.04 - 19:53
А то нет :-)
Попробуй на функцию поставить фишку которую я написал. Хоть под отладчиком, хоть без - срыв стека не состоится.
Похожие решения (но неявно, т.е. в код не надо явно ничего добавлять) -
Wirex StackGuard
Microsoft Visual C++ .NET
IBM Stack Smashing Protection (ProPolice)
Angelfire StackShield
   skunk
 
4 - 17.02.04 - 21:40
даная фишка по защите от срыва стэка не канает.

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

одна из подобных так называемая return-to-function то есть если система не позволить нам запустить шеллкод, мы можем переписать EIP на адрес какой-либо функции... далее по понятным причинам...
   romix
 
5 - 18.02.04 - 04:49
(4) Именно для защиты стека она и работает. Может я не так подробно ее расписал, чтобы стало понятно. Пытаюсь еще раз.

void func(){
//выше в стеке лежит адрес возврата
int Canary=GlobalRandomVariable; //взводим контрольное значение - "канарейку"
char x[100]; //Это массив, который будет переполняться вверх.
...

x[101]=10; // это повредит канарейку

//проверяем контрольное значение
if (Canary!=GlobalRandomVariable)
// если вирус покоцал канарейку, то аварийно завершаемся
exit(1);
//иначе все ок
}

А вот фишки которые вы упомянули как раз в этом случае и не сработают. Они срабатывают в разного рода "запретах от выполнения кода в стеке". Без аппаратной поддержки такие защиты действительно легко обходятся.

Описанный же трюк с "канарейкой" сразу за массивом (так назвал эту хрень Crispin Cowan) к этим "защитам" не относится, и работает вполне надежно и адекватно.
   skunk
 
6 - 18.02.04 - 05:59
(5)извини, но правила форума накладывают некие ограничения, да и трудно в рамках форума показывать куски дампов... если есть желание кинь на skunk_ <> mail.ru пустышку, а я как будет время покажу тебе фичу с "канарейкой" ;-)

удачи.
   romix
 
7 - 20.02.04 - 20:53
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>

int StaticRandomNumber; //Хранит случайное число.
//Инициализируется один раз при старте программы.


void func(char *s){
   char a[10+4]; //Расширяем массив на 4 байта
   int *canary;
   canary=(int*)&a[10]; //Вешаем ему на хвост канарейку

   *canary=StaticRandomNumber; //Инициализируем ее


   printf("begin %d\n", *canary);
   strcpy(a, s); //Выполняем копирование строки в массив
   //Если в s будет достаточно длинная строка, то произойдет переполнение
   printf("end   %d\n", *canary);

   canary=(int*)&a[10]; //восстанавливаем адрес канарейки
   //(на случай если он был затерт)

   if (StaticRandomNumber!=*canary){ //проверяем, жива ли канарейка?
       printf("canary is dead... exiting before ret\n");
       //если "мертва", то аварийно выходим без ret
       exit(1);
   }
   //Иначе благополучно выходим из функции - стек не поврежден
}


int main(int argc, char* argv[])
{
   if (argc!=2){
       printf("Canary protection sample program.\n");
       printf("Usage: canary.exe <StringLongerThan10Chars>\n");
       exit(0);
   }


   //Устанавливаем начальное значение генератора случайных чисел
   srand(time(NULL)); //это самый простой способ - реально надо
   //исп. более сложный, где инициализацию выполняет системная служба
   StaticRandomNumber=rand();

   func(argv[1]); //Вызываем функцию

   return 0;
}
   fellow
 
8 - 20.02.04 - 22:18
Да, выглядит неплохо. Для массивов ограниченной длины, по крайней мере. И для однопоточного приложения. Предлагаю создать шаблон для стандартных контейнеров в мультипоточном модуле, компонуемом динамически для модели apartment. Разумеется, с гарантированной однократной инициализацией при первом вызове.
   fellow
 
9 - 20.02.04 - 22:44
Да, ещё: а что, strncpy религия запретила?
   skunk
 
10 - 21.02.04 - 02:23
(7)не понял или не хочешь понимать...

лады сделаем так иди туда
http://www.securitytracker.com/archives/summary/9000.html

и подсчитай сколько вывлено дыр связаных с данной ошибкой
 
 
   romix
 
11 - 21.02.04 - 03:15
(8) Эту фишку встраивают в компилятор, чтобы безопасно компилировать устаревший C-код. В шаблоны тоже можно, но стандартные шаблоны STL этой болезнью (переполнением буфера) не страдают. И работают (как утверждает тот же Крис Касперски в книге "Техника оптимизации программ") намного быстрее (за счет отказа от сканирования строки на ее длину). Хотя это смотря где.

(9) Если просмотреть бинарник PHP, то там убрали strcpy, и оставили только strncpy. Но это не все возможные приколы - любая работа с массивами приводит к возможности ошибки переполнения.

(10) Дело в том, что фишку с канарейкой я придумал сначала сам (правда, я не использовал слова канарейка - тут имхо больше подходит  "контрольно-следовая полоса"), а потом прочитал, что годом раньше ее изобрел Crispin Cowan. Если вы находите в ней ошибку, напишите в чем она, или дайте конкретную ссылку (а не на ньюсбоард - это прикол что ли?). Ссылки на занятость - это хорошая отмаза, чтобы прикрыть 3.1416здобольство. :-)
   fellow
 
12 - 21.02.04 - 05:51
(11) Получается, что модернизацией устаревшего С-кода, приведение его в божеский вид, уменьшающий риск переполнения стека, никто заниматься не желает, несмотря на открытый доступ к этому самому коду. Зачем же его было открывать? Для учёбы? Для модернизации? Нет, для цельнотянутых решений. Пусть компилер думает. А если кто-то плохой не хочет делать свой компилер открытым, чтобы туда вставить такую-то фичу, то он плохой.
   skunk
 
13 - 21.02.04 - 08:12
(11)тебе с твоими разводами в адвокаты надо было идти... выдергивать из текста предложения и бить по ним... хотя теперь все стало ясно после (11), у тебя просто больное самолюбие, что тебя гения никак и никто не ценит.
Ссылка на ньюсбоард это просто для того что бы показать, что данный баг, один из само популярных... и по фих кто написал прогу... присуще всем... не смотря на ваше совместно Кованом гениальное изобретение...

да короче чего дальше 3.14......
   romix
 
14 - 25.02.04 - 21:23
(12) Старого кода (в том числе в MS) накопилось очень много, и исправить его сразу весь нереально.

(13) Я извиняюсь за подначки, я просто понял, что Вам тяжело будет реализовать обещание, данное в (6). Неужели уже кто-то нашел способ обойти защиту StackGuard? Или флаг -GS в новых версиях VC++?
   skunk
 
15 - 25.02.04 - 21:30
(14)внимательно прочти, и сделай то о чем я тебя говорил раза два так это точно
   romix
 
16 - 26.02.04 - 01:14
(15) Ушло. Я боюсь что защита не ломается. На всякий случай спрошу на другом форуме.
   skunk
 
17 - 26.02.04 - 01:17
я тебе там стаью кину, посмотришь там есть про это...
   skunk
 
18 - 26.02.04 - 01:22
+17 skunk_ <> mail.ru    "_" - пропустил
   romix
 
19 - 26.02.04 - 01:32
(18) сейчас ок?
   skunk
 
20 - 26.02.04 - 01:37
(19)слил...
   romix
 
21 - 27.02.04 - 02:54
(20) Ой, а я скорее всего не прав!

Я приведу пару других ссылок (хотя и на английском но вроде все понятно)

Multiple vulnerabilities in stack smashing protection technologies

http://www1.corest.com/common/showdoc.php?idx=221&idxseccion=10

Там правда из 4 уязвимостей только одна относится к Microsoft /GS.

int func(char *msg) {
  char buf[80];

  strcpy(buf,msg);
  // toupper(buf);       // here just to give func() "some sense"
  strcpy(msg,buf);
}

Не знаю насколько часто нормальные люди пишут такой код - видимо, это какой-то искусственный пример.

Возможно, Canary ("осведомителя") можно поиметь и через это:
Уязвимость форматной строки
Андрей Колищак
http://diferentz.narod.ru/article/hack/formatstrok.htm

Неизвестная уязвимость printf
Крис Касперски
http://www.osp.ru/os/2000/11/030.htm

Там ухитряются смотреть содержимое стека, манипулируя аргументами printf и иже с ней.



Список тем форума
Рекламное место пустует  
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс, 1996 г.
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Ветка сдана в архив. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует