Текущий архив: 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 компилера даны не для того, чтобы их воспринимать как чью-то шутку.
← →
pasha_golub © (2007-01-31 10:02) [41]
> Verg © (31.01.07 06:34) [40]
> P.S. Wanrnings компилера даны не для того, чтобы их воспринимать
> как чью-то шутку.
Золотые слова. И хинты тоже не для красного словца.
← →
ZiTRaX © (2007-01-31 10:09) [42]Пинайте автора ветки ногами, чтобы он больше не садился за комп в нетрезвом состоянии и не писал такую чушь. Даже не могу вспомнить, чем я руководствовался, кода писал весь этот бред (особенно интересно, зачем я сюда присобачил паскалевские компиляторы).
Я так точно когда-нибудь попаду в орешник. -))
← →
Desdechado © (2007-01-31 11:49) [43]ZiTRaX © (31.01.07 10:09) [42]
Пинаю.
ЗЫ вот полуночники...
ЗЫ2 поддерживаю Verg © (31.01.07 06:34) [40]
и дополню, что, имхо, в некоторых компиляторах это поведение можно настраивать (что должен осознавать пользователь сего компилятора)
← →
Amoeba © (2007-01-31 16:53) [44]
> ZiTRaX © (31.01.07 10:09) [42]
>
> Пинайте автора ветки ногами, чтобы он больше не садился
> за комп в нетрезвом состоянии и не писал такую чушь. Даже
> не могу вспомнить, чем я руководствовался, кода писал весь
> этот бред (особенно интересно, зачем я сюда присобачил паскалевские
> компиляторы).
> Я так точно когда-нибудь попаду в орешник. -))
>
Чего только не бывает спьяну!
← →
Amoeba © (2007-01-31 16:54) [45]Вся ветка просто достойна орешника, но обязательно целиком. Иначе весь аромат пропадет.
Страницы: 1 2 вся ветка
Текущий архив: 2007.02.25;
Скачать: CL | DM;
Память: 0.57 MB
Время: 0.044 c