Атака "return to libc": обход защиты NX через использование библиотечных функций. Уязвимость переполнения буфера, не требует инъекции кода. Безопасность.
Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Введение
Атака "возврата в libc" – это компьютерная атака, обычно начинающаяся с переполнения буфера, в которой адрес возврата подпрограммы в стеке вызовов заменяется адресом подпрограммы, уже находящейся в исполняемой памяти процесса. Это позволяет обойти защиту NX (если она присутствует) и избавляет злоумышленника от необходимости внедрять собственный код. Первый пример этой атаки был опубликован Александром Песляком в списке рассылки Bugtraq в 1997 году. В POSIX-совместимых операционных системах стандартная библиотека C ("libc") обычно используется для обеспечения стандартной среды выполнения программ, написанных на языке C. Хотя злоумышленник теоретически может перенаправить выполнение в любую точку кода, libc является наиболее вероятной целью, поскольку она почти всегда подключается к программе и предоставляет полезные функции для злоумышленника, такие как функция `system`, используемая для выполнения команд оболочки.
A "return to libc" attack is a computer security attack usually starting with a buffer overflow in which a subroutine return address on a call stack is replaced by an address of a subroutine that is already present in the process executable memory, bypassing the no execute bit feature (if present) and ridding the attacker of the need to inject their own code. The first example of this attack in the wild was contributed by Alexander Peslyak on the Bugtraq mailing list in 1997. On POSIX compliant operating systems the C standard library ("libc") is commonly used to provide a standard runtime environment for programs written in the C programming language. Although the attacker could make the code return anywhere, libc is the most likely target, as it is almost always linked to the program, and it provides useful calls for an attacker (such as the system function used to execute shell commands).
Защита от атак "возвращения в Либию"
Неисполняемый стек может предотвратить некоторые уязвимости, связанные с переполнением буфера, однако он не может предотвратить атаку типа "возврат в libc", поскольку в этой атаке используется только существующий исполняемый код. С другой стороны, такие атаки могут вызывать только предопределенные функции. Защита от повреждения стека может предотвратить или затруднить эксплуатацию уязвимости, поскольку она может обнаружить повреждение стека и, возможно, очистить скомпрометированный сегмент. "ASCII-бронирование" – это техника, которую можно использовать для затруднения такого рода атак. При ASCII-бронировании все адреса системных библиотек (например, libc) содержат нулевой байт (0x00). Обычно это достигается путем размещения этих адресов в первые 0x01010101 байт памяти (на несколько страниц больше 16 МБ, называемые "зоной ASCII-брони"), поскольку каждый адрес до (но не включая) этого значения содержит как минимум один нулевой байт. Это делает невозможным внедрение кода, содержащего эти адреса, с помощью функций манипулирования строками, таких как strcpy. Однако эта техника не работает, если у злоумышленника есть способ перезаписать нулевые байты в стеке. Если программа слишком велика, чтобы поместиться в первые 16 МБ, защита может быть неполной. Эта техника аналогична другой атаке, известной как "возврат в PLT", где вместо возврата в libc злоумышленник использует функции таблицы связей процедур (PLT), загруженные в позиционно-независимый код (например, system@plt, execve@plt, sprintf@plt, strcpy@plt). Рандомизация адресного пространства (ASLR) делает этот тип атаки крайне маловероятным для успешного осуществления на 64-битных машинах, поскольку адреса функций в памяти случайны. Однако для 32-битных систем ASLR предоставляет мало преимуществ, поскольку для рандомизации доступно всего 16 бит, и их можно преодолеть методом перебора за несколько минут.
A non executable stack can prevent some buffer overflow exploitation, however it cannot prevent a return to libc attack because in the return to libc attack only existing executable code is used. On the other hand, these attacks can only call preexisting functions. Stack smashing protection can prevent or obstruct exploitation as it may detect the corruption of the stack and possibly flush out the compromised segment. "ASCII armoring" is a technique that can be used to obstruct this kind of attack. With ASCII armoring, all the system libraries (e. g., libc) addresses contain a NULL byte (0x00). This is commonly done by placing them in the first 0x01010101 bytes of memory (a few pages more than 16 MB, dubbed the "ASCII armor region"), as every address up to (but not including) this value contains at least one NULL byte. This makes it impossible to emplace code containing those addresses using string manipulation functions such as strcpy However, this technique does not work if the attacker has a way to overflow NULL bytes into the stack. If the program is too large to fit in the first 16 MB, protection may be incomplete. This technique is similar to another attack known as return to plt where, instead of returning to libc, the attacker uses the Procedure Linkage Table (PLT) functions loaded in the position independent code (e. g., system@plt, execve@plt, sprintf@plt, strcpy@plt). Address space layout randomization (ASLR) makes this type of attack extremely unlikely to succeed on 64 bit machines as the memory locations of functions are random. For 32 bit systems, however, ASLR provides little benefit since there are only 16 bits available for randomization, and they can be defeated by brute force in a matter of minutes.