Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.02.25;
Скачать: CL | DM;

Вниз

Вроде как уязвимость в компиляторах(?)   Найти похожие ветки 

 
ZiTRaX ©   (2007-01-31 00:07) [0]

Если этот код скомпилировать в TurboDelphi (да и в FPC 2.0.4), то получается, что эти компиляторы уязвимы. Вообще-то это был код, проверяющий уязвимости в С(Си) - компиляторах (и борландовский компилятор оказался с этой уязвимостью), но мне захотелось проверить это же на паскалевских( мне доступных ) компиляторах.
program Project1;
{$APPTYPE CONSOLE}
var
 i: Integer;
begin
 i := -1;
 WriteLn("Check compiler whether correct deal with sizeof operator");
 WriteLn(" by alert7@xfocus.org");
 WriteLn(SizeOf(Integer));
 if (-1 > 4)
  then WriteLn("This compiler is not vuln")
  else WriteLn("This compiler is vuln!!!");
 if (i > SizeOf(Integer))
  then WriteLn("This compiler is not vuln")
  else WriteLn("This compiler is vuln!!!");
 ReadLn
end.

Специально проверял условие и с переменными, и с числами. И оба раза выдавалось сообщение об уязвимости(?)
Получается, что условия, в которых идёт сравнение отрицательного с положительным, будут работать неправильно, если не знать этой мелочи? Или я что-то не так понял???


 
Olivetti   (2007-01-31 00:29) [1]

2 ZiTRaX ©

Какой у тебя диагноз?


 
TUser ©   (2007-01-31 00:36) [2]

Полагаю, что оба рааза будет vuln, правда хочу узнать, что такое вульн.


 
Axis_of_Evil ©   (2007-01-31 00:40) [3]


> Полагаю, что оба рааза будет vuln, правда хочу узнать, что
> такое вульн.

vulnerable (уязвимый).
чей-то я не пойму, в чем уязвимость заключается ..


 
Джо ©   (2007-01-31 00:45) [4]

> if (-1 > 4)
>  then WriteLn("This compiler is not vuln")

То есть, надо полагать, автор кода считает, что -1 больше, чем 4?


 
Olivetti   (2007-01-31 00:45) [5]

чей-то я не пойму, в чем уязвимость заключается ..

У меня есть еще одна тестовая программа:

ShowMessage("This compiler is vuln!!!");


 
ZiTRaX ©   (2007-01-31 00:50) [6]

2 Olivetti: Диагноз таков: с таким не живут, но служить можно -))
2 Axis_of_Evil: В чём заключается уязвимость я не знаю (поэтому у меня стоят вопросы), но вот что было написано в исходнике, который проверяется эта уязвимость:
* check_compiler_sizeof_vulnerability.c
*
* Check compiler whether correct deal with sizeof operator,
* which can cause integer overflow if you careless use !!!
*
* note: some old compiler have this vulnerability!!!!
*
* by alert7@xfocus.org
*
* XFOCUS Security Team
* http://www.xfocus.org
*
* already tested:
*
* BCB6+ent_upd4....................................vuln !!!
* gcc version 4.0.0 20050519 (Red Hat 4.0.0-8).....not vuln
* gcc version 2.95.3-4(cygwin special).............not vuln
* gcc version egcs-2.91.66.........................not vuln
* cc: Sun WorkShop 6 2000/04/07 C 5.1 .............not vuln
* VC6+sp5..........................................not vuln ,thank eyas
* lcc version 3.8..................................not vuln ,thank tombkeeper
* evc4+sp4.........................................not vuln ,thank san

2 TUser: А почему оба раза выполняется первая ветка - ведь это вроде как нелогично (отрицательное не может быть больше положительного). Или это какая-то особенная логика компилятора???


 
Kerk ©   (2007-01-31 00:51) [7]

Видимо, некоторые компиляторы воспринимают -1 как High(DWORD)


 
ZiTRaX ©   (2007-01-31 00:53) [8]

2 TUser: А почему оба раза выполняется ВТОРАЯ ветка - ведь это вроде как нелогично (отрицательное не может быть больше положительного). Или это какая-то особенная логика компилятора???
2 Джо: так считаю не я, а компилятор


 
Германн ©   (2007-01-31 00:54) [9]


> TUser ©   (31.01.07 00:36) [2]
>
> Полагаю, что оба рааза будет vuln, правда хочу узнать, что
> такое вульн.


> Джо ©   (31.01.07 00:45) [4]
>
> > if (-1 > 4)
> >  then WriteLn("This compiler is not vuln")
>
> То есть, надо полагать, автор кода считает, что -1 больше,
>  чем 4?
>

См. выше. Поиск по vuln во всех словарях на mail.ru не нашел ничего.
А в TP я проверил. Всё пучком.


 
Olivetti   (2007-01-31 00:56) [10]

То есть, надо полагать, автор кода считает, что -1 больше, чем 4?

Судя по его комментариям, он в этом просто таки уверен.


 
ZiTRaX ©   (2007-01-31 01:04) [11]


> См. выше. Поиск по vuln во всех словарях на mail.ru не нашел
> ничего.
> А в TP я проверил. Всё пучком.

Vuln - сокращённо от vulnerable (как уже тут выше писали). А что именно в ТР пучком?

Хорошо. Объясните мне, какая ветка должна выполняться по условию if (i > SizeOf(Integer)), и я со спокойной душой пойду спать  -)


 
Zeqfreed ©   (2007-01-31 01:04) [12]

> Германн ©   (31.01.07 00:54) [9]

Вводим «vuln» в поле ввода «Стардикта» и первой же строчкой видим вариант «vulnerable» (хотя, все зависит от установленных словарей, конечно).


 
Olivetti   (2007-01-31 01:06) [13]

Объясните мне, какая ветка должна выполняться по условию if (i > SizeOf(Integer)), и я со спокойной душой пойду спать

Если -1 > 4 То Глюк Иначе Норма

P.S. Так все же, какой диагноз? Просто очень интересно...


 
Kerk ©   (2007-01-31 01:12) [14]

Кто-нить на [7] внимание обратит? :)


 
ZiTRaX ©   (2007-01-31 01:17) [15]

2 Kerk: ну, если вместо -1 поставить -2 (-3, -4, ...), то результат такой же.
2 Olivetti: "Если -1 > 4 То Глюк Иначе Норма" - исходя из этого, какой текст должна выдать скомпилированная программа?


 
Zeqfreed ©   (2007-01-31 01:17) [16]

> Kerk ©   (31.01.07 01:12) [14]

Я обратил ;)

Что-то мне подсказывает, что в C (не знаю, как насчет Delphi), sizeof возвращает беззнаковое число (что логично, размер переменной/типа не может быть отрицательным) и -1 берется тоже как целочисленная переменная.

Что подтвержается моим экспериментом:

$ cat ./test.c
#include <stdio.h>

main()
{
printf("%d %d\n", -1 > sizeof(int), -1 > 4);
return 0;
}

$ ./test
1 0


 
Zeqfreed ©   (2007-01-31 01:18) [17]


> берется тоже как целочисленная переменная.

Имел в виду как беззнаковая, разумеется.


 
Olivetti   (2007-01-31 01:18) [18]

Кто-нить на [7] внимание обратит?

Да понятна идея, понятна. Хотя, отказ какого-то компилятора работать с отрицательными числами - не глюк, а, скорее, особенность. Возможно - особенность процессора.

Только и ты на код внимание обрати:

if (-1 > 4)
 then WriteLn("This compiler is not vuln")
 else WriteLn("This compiler is vuln!!!");


 
ZiTRaX ©   (2007-01-31 01:19) [19]

Блин, понимаю, что где-то несу чушь, но не могу понять где. -))


 
Olivetti   (2007-01-31 01:20) [20]

ZiTRaX ©   (31.01.07 01:17) [15]
2 Olivetti: "Если -1 > 4 То Глюк Иначе Норма" - исходя из этого, какой текст должна выдать скомпилированная программа?


"Норму" должна выдавать. А в твоем примере - все наоборот.


 
Германн ©   (2007-01-31 01:21) [21]


> Zeqfreed ©   (31.01.07 01:04) [12]
>
> > Германн ©   (31.01.07 00:54) [9]
>
> Вводим «vuln» в поле ввода «Стардикта» и первой же строчкой
> видим вариант «vulnerable» (хотя, все зависит от установленных
> словарей, конечно).
>

Это да. (Я, кстати, вводил в поле другой программы-переводчика). Но тут налицо некая экстраполяция, которая несовместима с понятием "терминология"! Тут скорее присутствует некая "подначка" от либо автора ветки, либо от авторов вышеуказанного источника!


 
Olivetti   (2007-01-31 01:21) [22]

Блин, понимаю, что где-то несу чушь, но не могу понять где. -))

Должно быть не так:

if (-1 > 4)
then WriteLn("This compiler is not vuln")
else WriteLn("This compiler is vuln!!!");


а вот так:

if (-1 > 4)
then WriteLn("This compiler is vuln!!!")
else WriteLn("This compiler is not vuln");


 
Olivetti   (2007-01-31 01:23) [23]

Но тут налицо некая экстраполяция, которая несовместима с понятием "терминология"!

Скорее - упрощенная форма слова для тех, кто или плохо говорит, или кому лень набирать на клавиатуре.


 
Германн ©   (2007-01-31 01:37) [24]

А!
В сабже то TurboDelphi! А я то говорил про TurboPascal :(
Всё равно, тут дело нечисто :)


 
Zeqfreed ©   (2007-01-31 01:39) [25]

Было бы неплохо увидеть ссылку на оригинальный тест для компиляторов C.


 
ZiTRaX ©   (2007-01-31 01:41) [26]

Я, наверное, путаю праведное с грешным, но вот СИ-шный код:
#include <stdio.h>

int main(int argc, char *argv[])
{
       int i =-1;

       printf("Check compiler whether correct deal with sizeof operator\n");
       printf("  by alert7@xfocus.org \n\n");

       if (i > sizeof ( int ) )
       {
               printf("This compiler is not vuln\n");
       }else
               printf("This compiler is vuln!!!\n");

        getchar();

       return 0;
}

MVS2005 выдаёт первую строку, MinGW 3.4.2 - тоже первую, а BCB6+upd4 и BCB2006 выдают вторую строку. Вот я и решил этот же код в паскалевских компиляторах прогнать. В чём заключается уязвимость (то, что это уязвимость, не моя идея) я не понимаю, но один и тот же код даёт разные результаты. Я вообще запутался, всё в одну кучу смешал и теперь не могу докопаться до истины. Хотя на фиг она нужна, та истина???
Всем спасибо за внимание. Пойду я лучше спать, пока ещё какую-нибудь чушь не сморозил -))


 
Джо ©   (2007-01-31 01:43) [27]

Вероятно, тип возвращаемого значения sizeof в разных компиляторах разный. Бывает беззнаковый (что, в принципе, правильнее), а бывает и со знаком.


 
Zeqfreed ©   (2007-01-31 01:46) [28]

Ну все правильно. -1 интерпретируется по разному в разных компиляторах, только не пойму, почему это «уязвимость»? Да, конечно, можно напороться по незнанию, но, если честно, не могу предложить вариант, когда на практике нужно сравнивать отрицательную величину с размером типа данных.


 
Германн ©   (2007-01-31 01:46) [29]


> Джо ©   (31.01.07 01:43) [27]
>
> Вероятно, тип возвращаемого значения sizeof в разных компиляторах
> разный. Бывает беззнаковый (что, в принципе, правильнее),
>  а бывает и со знаком.
>

А ты хоть когда-то хоть какие-то размеры мерял со знаком? :)


 
Zeqfreed ©   (2007-01-31 01:47) [30]


> -1 интерпретируется по разному в разных компиляторах

Читать как «-1 интерпретируется по-разному в разных компиляторах, потому что см [27]» :)


 
ZiTRaX ©   (2007-01-31 01:51) [31]

http://lists.jammed.com/vulnwatch/2006/02/0006.html - вот одна из ссылок на проверку этой "уязвимости"(?).


 
Джо ©   (2007-01-31 01:52) [32]

> [29] Германн ©   (31.01.07 01:46)
>
> > Джо ©   (31.01.07 01:43) [27]
> >
> > Вероятно, тип возвращаемого значения sizeof в разных компиляторах
>
> > разный. Бывает беззнаковый (что, в принципе, правильнее)
> ,
> >  а бывает и со знаком.
> >
>
> А ты хоть когда-то хоть какие-то размеры мерял со знаком?
> :)

Я говорю о типе возвращаемого значения. Например, в Делфи SizeOf возвращает Integer, т.е., именно тип со знаком.


 
Zeqfreed ©   (2007-01-31 01:54) [33]

Видимо, где-то в каком-то стандарте описано, что sizeof должен быть беззнаковым и компиляторы, в которых это правило не соблюдается, считаются «уязвимыми». Не понимаю, почему это так важно? :) Ну а Delphi тут вообще не при чем.


 
Германн ©   (2007-01-31 02:06) [34]


> Джо ©   (31.01.07 01:52) [32]
>
> > [29] Германн ©   (31.01.07 01:46)
> >
> > > Джо ©   (31.01.07 01:43) [27]
> > >
> > > Вероятно, тип возвращаемого значения sizeof в разных
> компиляторах
> >
> > > разный. Бывает беззнаковый (что, в принципе, правильнее)
> > ,
> > >  а бывает и со знаком.
> > >
> >
> > А ты хоть когда-то хоть какие-то размеры мерял со знаком?
>
> > :)
>
> Я говорю о типе возвращаемого значения. Например, в Делфи
> SizeOf возвращает Integer, т.е., именно тип со знаком.

И я об этом. Но компиллятор в подобных случаях должен быть "умным".
Даже в стародавнем ТР функция SizeOf возвращала Integer, но всегда её результат был положительным!


 
Германн ©   (2007-01-31 02:15) [35]


> Даже в стародавнем ТР функция SizeOf возвращала Integer,
>  но всегда её результат был положительным!

Вот например:
var TT : array[0..33000] of Byte;
begin
WriteLn(SizeOf(TT));

напечатало 33001. А в ТР Integer = (-32768..32767).


 
Джо ©   (2007-01-31 02:27) [36]

Германн ©
> Но компиллятор в подобных случаях должен быть "умным".
Ну вот, наверное, приведенный C-код и тестирует умность некоторых компиляторов :)


 
Германн ©   (2007-01-31 02:31) [37]


> Джо ©   (31.01.07 02:27) [36]
>
> Германн ©
> > Но компиллятор в подобных случаях должен быть "умным".
>
> Ну вот, наверное, приведенный C-код и тестирует умность
> некоторых компиляторов :)

А где тут "приведенный С-код"? Сколь не искал, не нашел:(


 
Джо ©   (2007-01-31 02:32) [38]

> [26]

[26]


 
Германн ©   (2007-01-31 02:42) [39]


> Джо ©   (31.01.07 02:32) [38]
>
> > [26]
>

Не читал ранее сей пост :(
Тогда пусть автор сабжа проспится и повторит свой экс-мент :) Если и завтра всё будет неправильно, тогда продолжим обсуждение.


 
Verg ©   (2007-01-31 06:34) [40]

Константы по умолчанию - int. Т.е. -1 > 4 ->> false
Сравнение int и unsigned int - компилятор обязан преобразовать к наибольшему по знаковости, т.е. к unsigned int, т.о. сравнение i > sizeof(i), где
эквивалентно cardinal(-1) > cardinal(4) ->> true при i = -1

P.S. Wanrnings компилера даны не для того, чтобы их воспринимать как чью-то шутку.



Страницы: 1 2 вся ветка

Текущий архив: 2007.02.25;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.039 c
15-1170395300
ZeroDivide
2007-02-02 08:48
2007.02.25
Какую стоит брать видяху под AGP: 7600GS или 1650Pro=1600XT?


15-1170110927
SkyRanger
2007-01-30 01:48
2007.02.25
Соло на скасофоне


15-1170328942
апмав
2007-02-01 14:22
2007.02.25
stdcall


1-1167637323
tio
2007-01-01 10:42
2007.02.25
Полигоны


6-1157482660
_Sergey_
2006-09-05 22:57
2007.02.25
Логика работы сокетов