Насколько безопасен оператор «если»? - PullRequest
2 голосов
/ 28 октября 2011

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

user = getUserName();
password = getPassword();

if (match(user, password)) {
    print secret information;
}

Так как это всего одна строка, я чувствую, что саботаж может быть относительно простым. Я пропускаю вещи, или один if действительно лучший способ сделать это?

Ответы [ 7 ]

4 голосов
/ 28 октября 2011

Вы правы, if как это легко взломать.Если кто-то обратный проектирует это приложение, вы можете легко изменить несколько инструкций, чтобы пропустить if.

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

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

2 голосов
/ 30 октября 2011

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

Возможно, что используемый вами оператор сравнения ошибочен.Например, оператор == использует нечеткое сопоставление, где принимается диапазон возможных значений .Это может быть не очень хорошо для secuirty, но сложно привести хороший пример, для пароля не имеет значения.Простой $password==$_GET['password'] должен работать просто отлично.

Ваш оператор if может также полагаться на неправильное регулярное выражение, такое как

if(preg_match('/(.+)\\.js/'.$_GET['file'])){
    readfile($_GET['file']);
}

В этом случае регулярное выражение ищет .js в любом месте строки, а не заставляет его бытьконец.

?file=../../.js/../../../../../../../etc/passwd

(И эта уязвимость принесла мне 3000 долларов в программе баунти Mozilla;)

2 голосов
/ 28 октября 2011

В IF есть одна вещь, которую часто упускают из виду.Это называется таймером атаки.Предположим, у вас есть веб-приложение, которое выполняет сравнение на основе прямого сопоставления пароля, отправленного с паролем, хранящимся в БД (да, я знаю, что никто в его уме не будет хранить пароли в БД, но, как сказал Чеширский Кот, «мы все сумасшедшие»Вот").Затем процедура сравнения занимает разное время в зависимости от того, совпадают ли пароли для первого символа, второго или последнего.Хотя может показаться, что разница во времени незначительна, злоумышленнику достаточно попытаться угадать пароль даже через Интернет, не говоря уже о локальном анализе.Атака по времени немного сложнее, чем я описал, но в целом сравнение IF не безопасно на 100%, по крайней мере, не во всех случаях.

2 голосов
/ 28 октября 2011

В конкретном случае, который вы показываете, действительно ли вы беспокоились о том, что посторонние люди видят секретную информацию, выводимую «печатать секретную информацию»; Вы бы зашифровали «секретную информацию» с помощью предоставленного пароля. Это будет гарантировать, что только человек, который смог предоставить правильный пароль, сможет видеть секретную информацию.

1 голос
/ 28 октября 2011

Если это код сервера - это не проблема, если вы поддерживаете свой сервер в безопасности.

Если это код клиента - вы правы. Кто-то может манипулировать вашим кодом - либо бинарный файл, либо образ памяти (после загрузки). Однако это верно для любого клиентского приложения. Вы можете только сделать это сложнее (например, с помощью таких инструментов, как PECompact + Анти-отладочный плагин ), но вы не можете добиться очень сильной безопасности.

0 голосов
/ 28 октября 2011

Нет ничего небезопасного в одной строке с if в ней.

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

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

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

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

0 голосов
/ 28 октября 2011

Я не уверен, что понимаю ваш вопрос.

Методы обеспечения безопасности программного обеспечения несовершенны, и AFAIK предполагают наличие нескольких ошибок в компиляторе и «идеальное» аппаратное обеспечение (то есть процессор правильно интерпретирует машинный код).Я не знаком (но заинтересован) с подходами к несовершенному оборудованию (за исключением, конечно, использования избыточности или других методов, например, ECC, для обнаружения аппаратных ошибок).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...