2015_лекции / Переполнение буфера
.pdfИнструментальные решения
Специальные структуры Safe Pointer (безопасный указатель),
Таблицы объектов (C Range Error Detector)
Достоинства
Выявляет все виды уязвимостей кроме переполнения на один байт
Недостаток
накладные расходы до 325%
Аппаратные решения
Безопасный cтек для хранения адресов возврата
(Secure Return Address Stack)
Дополнительный флаг процессора (NX-флаг)
Недостаток
Накладные расходы до 65%
Несовместим с непоследовательными вызовами функций, такие как обработка прерывания С++
Блокиратор переполнения буфера
SigFree [Wang et al.]
Достоинства
•Прозрачный подход, который работает на уровне приложений
•Может выявлять неизвестный тип атак
Недостаток
•Не предотвращает переполнения буфера
Уязвимости в управлении кучей
Червь Linux/Slapper
Используемая уязвимость:
пакет OpenSSL - библиотека libssl
Используется в модуле mod-ssl сервера Apache 1.3
Структура протокола SSL
Схема установления соединения по протоколу SSL
Структура SSL_SESSION
struct ssl_session_st { |
|
|
int ssl_version; |
/* SSL версия протокола */ |
|
unsigned int key_arg_length; /* используется только в версии 2 */ |
||
unsigned char key_arg[SSL_MAX_KEY_ARG_LENGTH]; |
/*ключ*/ |
|
int master_key_length; |
/* The pre-master secret */ |
|
unsigned char master_key[SSL_MAX_MASTER_KEY_LENGTH]; |
|
|
unsigned int session_id_length; |
/* длина поля session id, которое |
зависит от версии SSL, (в случае с червем 36 байт)*/ unsigned char session_id[SSL_MAX_SSL_SESSION_ID_LENGTH];
struct cert_st *cert; |
/* сертификат, используемый для |
|
установления соединения */ |
SSLCERT *peer; |
|
…. |
|
….SSL_CIPHER *cipher; /* указатель на шифр, выделяется в куче! */ unsigned long cipher_id;
………}
Алгоритм атаки
I. Типирование сервера Запрос GET червя Linux/Slapper
GET / HTTP/1.1\r\n\r\n
Ответ сервера Apache
HTTP/1.1 400 Bad Request
Date: Mon, 23 Feb 2004 23:43:42 GMT
Server: Apache/1.3.19 (UNIX) (Red-Hat/Linux) mod_ssl/2.8.1 OpenSSL/0.9.6 DAV/1.0.2 PHP/4.0.4pl1 mod_perl/1.24_01
Connection: close Transfer-Encoding: chunked
Content-Type: text/html; charset=iso-8859-1
Код червя Slapper
struct archs { char *os;
char *apache; int func_addr;}
architectures[] = {{"Gentoo", "", 0x08086c34}, {"Debian", "1.3.26", 0x080863cc},
{"Red-Hat", "1.3.6", 0x080707ec}, {"Red-Hat", "1.3.9", 0x0808ccc4}, {"Red-Hat", "1.3.12", 0x0808f614}, {"Red-Hat", "1.3.12", 0x0809251c},
{"Red-Hat", "1.3.19", 0x0809af8c}, {"Red-Hat", "1.3.20", 0x080994d4}, {"Red-Hat", "1.3.26", 0x08161c14}, {"Red-Hat", "1.3.23", 0x0808528c}, {"Red-Hat", "1.3.22", 0x0808400c}, {"SuSE", "1.3.12", 0x0809f54c}, {"SuSE", "1.3.17", 0x08099984}, {"SuSE", "1.3.19", 0x08099ec8}, {"SuSE", "1.3.20", 0x08099da8}, {"SuSE", "1.3.23", 0x08086168}, {"SuSE", "1.3.23", 0x080861c8}, {"Mandrake", "1.3.14", 0x0809d6c4},
{"Mandrake", "1.3.19", 0x0809ea98}, {"Mandrake", "1.3.20", 0x0809e97c}, {"Mandrake", "1.3.23", 0x08086580}, {"Slackware", "1.3.26", 0x083d37fc}, {"Slackware", "1.3.26", 0x080b2100} };
где волшебное число – это адрес таблицы GOT
Алгоритм атаки
II. Установка рукопожатия
1.Slapper → “hello”, поддерживаю 8 различных шифров(на деле -> RSA-128 c MD5)
2.Сервер → сертификат.
3.Slapper → мастер ключ, длина которого превышает
значение SSL_MAX_KEY_ARG_LENGTH (56 байт вместо 8 байт)
4.Сервер выделяет в памяти структуру SSL_Section и копирует ключ в структуру key_arg[]