Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2007.02.25;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.056 c
2-1170393137
delphim
2007-02-02 08:12
2007.02.25
графический компонент RSCharts


2-1170856414
zzxc
2007-02-07 16:53
2007.02.25
TIBTable vs TIBDataSet


15-1170402730
Empleado
2007-02-02 10:52
2007.02.25
Всех с Днем Сурка!


2-1170006217
познающий
2007-01-28 20:43
2007.02.25
Русский текст в анг. винде


4-1160495661
Магедон
2006-10-10 19:54
2007.02.25
GetDiBits, где ошибка?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский