Уязвимости эксплуатации.
Уязвимости эксплуатации.
Третьим видом уязвимостей являются ошибки, допущенные в процессе эксплуатации информационной системы. Примерами таких уязвимостей являются:
использование конфигураций по умолчанию;
некорректно заданные параметры защитных механизмов;
неиспользуемые сетевые сервисы, доступные удаленно.
Конфигурации по умолчанию могут содержать в себе простые, а главное, широко известные пароли к административным учетным записям. Эти пароли представлены в документации к информационной системе, однако в этих документах категорически рекомендуют сменить данные пароли при первом же подключении. Но многие администраторы игнорируют данное требование, продолжая эксплуатацию систем с паролем по умолчанию.
Аналогично и что касается некорректно заданных параметров защитных механизмов. Здесь примерами могут служить сертификаты, используемые в инфраструктуре открытого ключа (PKI). Многие приложения используют при установке соединения сертификаты, которые поставляются вместе с приложением и не являются доверенными. Использование таких сертификатов может привести к компрометации всей системы. Необходимо заменить их на сертификаты доверенного удостоверяющего центра.
Доступные удаленно неиспользуемые сетевые сервисы - это Telnet, SNMP и другие. Наилучшее средство борьбы с ними - это их отключение.
Основной темой данного поста являются уязвимости реализации, их обнаружить, в отличие от уязвимостей проектирования и эксплуатации, сложнее всего. Они требуют анализа работы приложений и систем.
Для понимания сути уязвимости приведем несколько простых примеров. Типичной уязвимостью, знакомой практически любому студенту, хоть раз писавшему какие-либо программы, является «ошибка плюс-минус один». Как следует из названия, она возникает, когда программист при подсчете итерацийцикла ошибается на единицу. Это происходит гораздо чаще, чем можно было бы предположить, и проще всего проиллюстрировать суть таким вопросом: если вы строите изгородь длиной 30 метров и ставите столбы через каждые три метра, то сколько столбов вам понадобится? Очевидный ответ - 10 столбов, но он не верен, потому что в действительности потребуется 11 столбов. Подобные ошибки происходят, когда программист по ошибке считает предметы вместо промежутков между предметами или наоборот. Другой пример: выбор
программистом интервала чисел или элементов, которые надо обработать, например элементы с номера N по номер М. Если N = 5 и М = 17, то сколько элементов надо обработать? Очевидный ответ M - N, или 17 - 5 = 12 элементов. Но это неправильно, потому что на самом деле элементов M - N + 1, то есть всего 13. На первый взгляд это кажется нелогичным, но именно это и приводит к такого рода ошибкам. Замечу, что многие современные средства разработки, такие как Borland Delphi или Microsoft Visual Studio, содержат в себе средства, предупреждающие программиста о подобных ошибках, однако в общем случае среда программирования не обязана следить за тем, выходит ли цикл, используемый в вашей программе, за свои границы.
Часто такие ошибки остаются незамеченными, потому что программы не подвергаются тестированию для всех возможных случаев, а последствия ошибки могут не сказаться при обычном выполнении программы. Однако если программе передать такие входные данные, которые заставят ошибку проявиться, они могут оказать разрушительное действие на всю остальную логику программы. Правильно построенный на ошибке «плюс-минус один» эксплойт превращает защищенную, казалось бы, программу в уязвимую.
Приведем несколько примеров такой уязвимости.
В качестве примера можно привести OpenSSH - комплекс программ защищенной связи с терминалом, который должен был заменить небезопасные и не использующие криптографии службы, такие как telnet, rsh и rep. Однако в коде, выделяющем каналы, была допущена ошибка обсчета на единицу, которая интенсивно эксплуатировалась. А именно в операторе if был такой код:
if (id < 0 || id > channels_alloc) { Тогда как правильный код должен выглядеть следующим образом:
if (id < 0 || id >= channels_alloc) {
На обычном языке этот код означает: «Если ID меньше 0 или ID больше количества выделенных каналов, выполнить следующее...», тогда как правильным было бы «Если ID меньше 0 или ID больше или равно количеству выделенных каналов, выполнить следующее...».
Эта простая ошибка на единицу позволила создать эксплойт, с помощью которого обычный зарегистрировавшийся в системе пользователь получал в ней неограниченные права администратора. Разумеется, подобная функциональность не входила в намерения разработчиков такой защищенной программы, как OpenSSH, но компьютер может выполнять только те инструкции, которые ему даются, даже если это не такие инструкции, которые предполагались изначально.
Рассмотрим еще одну ситуацию, в которой часто возникают ошибки, становящиеся основой последующих эксплойтов, связанных с поспешной модификацией программы в целях расширения ее функциональности. Такое расширение функциональности увеличивает возможности применения программы для бизнес-задач и ее ценность, но при этом растет и сложность программы, а значит, и вероятность оплошностей и ошибок в ней. Программа веб-сервера Microsoft IIS должна предоставлять пользователям статическое и интерактивное содержимое (веб-контент). Для этого она должна разрешать пользователям читать, записывать и выполнять программы и файлы внутри некоторых каталогов. Такие возможности, однако, должны предоставляться лишь в некоторых выделенных каталогах. В противном случае пользователи получат полный контроль над системой, что, очевидно, недопустимо с точки зрения безопасности. С этой целью в программу был включен код проверки маршрутов, который запрещал пользователям с помощью символа обратной косой черты перемещаться вверх по дереву каталогов и входить в другие каталоги.
Однако с добавлением в программу поддержки кодировки символов Unicode ее сложность увеличилась. Unicode представляет собой набор символов, записываемых двумя байтами, и содержит символы любых языков, включая китайский и арабский. Используя для каждого символа два байта вместо одного, Unicode позволяет записывать десятки тысяч различных символов, а не всего несколько сотен, как при однобайтовых символах. Дополнительная сложность привела к тому, что символ обратной косой черты стал представляться несколькими способами. Например, % 5с в кодировке Unicode транслируется в символ обратной косой черты, но эта трансляция происходит уже после выполнения кода, проверяющего допустимость маршрута. Поэтому ввод символов % 5с вместо \ действительно сделал бы возможным перемещение по дереву
каталогов, что открывало лазейку для злоупотреблений, о которой говорилось выше. Два червя – Sadmind и Code-Red - использовали просмотр в преобразовании кодировки Unicode такого типа для искажения (дефейса) веб-страниц.
Теперь посмотрим, как можно использовать программные уязвимости. Для этого существуют специальные утилиты - эксплойты.
Программный эксплойт - это искусный способ заставить компьютер выполнить то, что нужно взломщику, даже если выполняемая в данный момент программа была разработана с намерением не допустить таких действий. Поскольку в действительности программа может работать только так, как она написана, пробелы в защите фактически представляют собой ошибки или недосмотры, допущенные при разработке программы, или среды, в которой она выполняется.
Рассмотрим основные виды эксплойтов. Два самых распространенных вида обобщенных эксплойтов - это эксплойт переполнения буфера и эксплойт форматной строки. В обоих случаях конечной целью является получение контроля над выполнением атакуемой программы, с тем чтобы заставить ее выполнить вредоносный фрагмент кода, который теми или иными средствами удалось поместить в память. Это называется выполнением произвольного кода, поскольку злоумышленник может заставить программу делать практически что угодно.
Следует заметить, что в интернете можно найти множество различных эксплойтов, доступных для скачивания любому пользователю.
Также имеются бесплатные средства генерации эксплойтов, такие как Metasploit. Подробнее об этом средстве мы поговорим в следующих постах.
Петухов Олег, юрист в области международного права и защиты персональных данных, специалист в области информационной безопасности, защиты информации и персональных данных.
Телеграм-канал: https://t.me/zashchitainformacii
Группа в Телеграм: https://t.me/zashchitainformacii1
Сайт: https://legascom.ru
Электронная почта: online@legascom.ru
#защитаинформации #информационнаябезопасность
Exploitation vulnerabilities.
The third type of vulnerabilities are errors made during the operation of the information system. Examples of such vulnerabilities are:
using default configurations;
incorrectly set parameters of security mechanisms;
unused network services available remotely.
Default configurations can contain simple, and most importantly, well-known passwords to administrative accounts. These passwords are provided in the documentation for the information system, however, these documents strongly recommend changing these passwords at the first connection. However, many administrators ignore this requirement, continuing to operate systems with a default password.
Similarly, with regard to incorrectly set parameters of protective mechanisms. Examples here are certificates used in the Public key Infrastructure (PKI). When establishing a connection, many applications use certificates that are supplied with the application and are not trusted. Using such certificates can compromise the entire system. They must be replaced with certificates from a trusted certification authority.
Available remotely unused network services are Telnet, SNMP, and others. The best way to deal with them is to turn them off.
The main topic of this post is implementation vulnerabilities, which are the most difficult to detect, unlike design and operational vulnerabilities. They require analysis of applications and systems.
To understand the essence of the vulnerability, here are some simple examples. A typical vulnerability familiar to almost any student who has ever written any software is "error plus or minus one." As the name suggests, it occurs when a programmer makes a mistake of one when calculating iterations of a cycle. This happens much more often than one might assume, and the easiest way to illustrate the point is with this question: if you build a fence 30 meters long and put poles every three meters, how many poles will you need? The obvious answer is 10 pillars, but it is not correct, because in reality it will take 11 pillars. Similar errors occur when a programmer mistakenly counts objects instead of the spaces between objects or vice versa. Another example: choice
The programmer is the range of numbers or elements that need to be processed, for example, elements from number N to number M. If N = 5 and M = 17, then how many elements should be processed? The obvious answer is M - N, or 17 - 5 = 12 elements. But this is wrong, because in fact there are M - N + 1 elements, that is, there are only 13. At first glance, this seems counterintuitive, but that's exactly what leads to these kinds of errors. I note that many modern development tools, such as Borland Delphi or Microsoft Visual Studio, contain tools that warn the programmer about such errors, but in general, the programming environment is not required to monitor whether the loop used in your program goes beyond its boundaries.
Such errors often go unnoticed because programs are not tested for all possible cases, and the consequences of the error may not affect the normal execution of the program. However, if the program is given input data that causes an error to occur, it can have a devastating effect on the rest of the program's logic. An exploit built correctly on a plus or minus one error turns a seemingly secure program into a vulnerable one.
Here are some examples of such vulnerability.
As an example, OpenSSH is a set of secure terminal communication programs that was supposed to replace insecure and non-cryptographic services such as telnet, rsh, and rep. However, there was a per-unit error in the channel allocation code, which was intensively exploited. Specifically, the if statement had the following code:
if (id < 0 || id > channels_alloc) { Whereas the correct code should look like this:
if (id < 0 || id>= channels_alloc) {
In ordinary language, this code means: "If ID is less than 0 or ID is greater than the number of allocated channels, perform the following...", whereas the correct one would be "If ID is less than 0 or ID is greater than or equal to the number of allocated channels, perform the following...".
This simple error made it possible to create an exploit with which an ordinary user who logged into the system received unlimited administrator rights in it. Of course, such functionality was not the intention of the developers of such a secure program as OpenSSH, but a computer can only execute the instructions that are given to it, even if these are not the instructions that were originally intended.
Let's consider another situation in which errors often occur, which become the basis for subsequent exploits related to hasty modification of the program in order to expand its functionality. This expansion of functionality increases the possibilities of using the program for business tasks and its value, but at the same time the complexity of the program increases, and hence the likelihood of mistakes and errors in it. The Microsoft IIS web server program should provide static and interactive content (web content) to users. To do this, it must allow users to read, write, and execute programs and files inside certain directories. However, such features should be provided only in some dedicated directories. Otherwise, users will gain full control over the system, which is obviously unacceptable from a security point of view. For this purpose, the program included a route verification code that prohibited users from using a backslash to navigate up the directory tree and enter other directories.
However, with the addition of Unicode character encoding support to the program, its complexity has increased. Unicode is a set of characters written in two bytes, and contains characters from any language, including Chinese and Arabic. By using two bytes instead of one for each character, Unicode allows you to write tens of thousands of different characters, rather than just a few hundred, as with single-byte characters. The additional complexity led to the fact that the backslash symbol began to be represented in several ways. For example, %5c in Unicode encoding is translated into a backslash character, but this translation occurs after executing the code verifying the validity of the route. Therefore, entering %5c characters instead of \ would really make it possible to move through
the directory tree, which opened a loophole for abuse, as mentioned above. Two worms– Sadmind and Code-Red, used browsing in the conversion of this type of Unicode encoding to distort (deface) web pages.
Now let's see how software vulnerabilities can be exploited. There are special utility exploits for this.
A software exploit is a clever way to force a computer to do what an attacker needs, even if the program currently running was designed with the intention of preventing such actions. Since in reality a program can only work as it is written, security gaps actually represent errors or omissions made during the development of the program or the environment in which it is executed.
Let's look at the main types of exploits. The two most common types of generalized exploits are the buffer overflow exploit and the format string exploit. In both cases, the ultimate goal is to gain control over the execution of the attacked program in order to force it to execute a malicious piece of code that has been placed in memory by one means or another. This is called executing arbitrary code, because an attacker can force a program to do almost anything.
It should be noted that on the Internet you can find many different exploits available for download to any user.
There are also free exploit generation tools such as Metasploit. We will talk more about this tool in the following posts.
Oleg Petukhov, lawyer in the field of international law and personal data protection, information security specialist security, protection of information and personal data.
Telegram channel: https://t.me/protectioninformation
Telegram Group: https://t.me/informationprotection1
Website: https://legascom.ru
Email: online@legascom.ru
#informationprotection #informationsecurity




