Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π—Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ Ρ…Π°ΠΊΠ΅Ρ€ΠΎΠ² ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… сСтСй». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 79

Автор ΠšΠΎΠ»Π»Π΅ΠΊΡ‚ΠΈΠ² Π°Π²Ρ‚ΠΎΡ€ΠΎΠ²

ΠšΠ»Π°ΡΡΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΡƒΠ΄Π°Π»Π΅Π½Π½ΡƒΡŽ ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ строки ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² вСрсиях ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ rwhoisd 1.5.7.1 ΠΈ Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π½Π½ΠΈΡ…. Она позволяла ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΌΡƒ Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΡƒ послС ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ сСрвСру Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄. Π’ΠΏΠ΅Ρ€Π²Ρ‹Π΅ ΠΎΠ± уязвимости стало извСстно благодаря ΡΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΡŽ списка рассылки Bugtraq. Π—Π°Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ сообщСниС ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ ΠΏΠΎ адрСсу www.securityfocus.com/archive/1/222756.

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ строки ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ rwhoisd, слСдуСт Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ Π΅Π΅ исходный тСкст. Π’ Π³Π»Π°Π²Π΅ рассмотрСна вСрсия ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ 1.5.7.1. На ΠΌΠΎΠΌΠ΅Π½Ρ‚ написания ΠΊΠ½ΠΈΠ³ΠΈ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΏΠΎ адрСсу www.rwhois.net/ftp.

Π£ΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ проявляСтся Π²ΠΎ врСмя Π²Ρ‹Π²ΠΎΠ΄Π° сообщСния ΠΎΠ± ошибкС ΠΏΡ€ΠΈ Π½Π΅Π²Π΅Ρ€Π½ΠΎΠΌ Π·Π°Π΄Π°Π½ΠΈΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ – soa Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС.

Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ ΠΎΠ± ошибкС формируСтся ΠΈ выводится Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ print_error(). Π­Ρ‚Π° функция вызываСтся ΠΏΠΎΠ²ΡΡŽΠ΄Ρƒ Π² исходном тСкстС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ сСрвСра для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибок ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π’Ρ…ΠΎΠ΄Π½Ρ‹ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π½ΠΎΠΌΠ΅Ρ€ ошибки Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ Ρ†Π΅Π»ΠΎΠ³ΠΎ числа, Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π°Ρ строка ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ число Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ².

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ тСкст этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π°ΠΉΠ΄Π΅Π½ Π² Ρ„Π°ΠΉΠ»Π΅ common/ client_msgs.c (ΠΏΡƒΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ, созданной Π²ΠΎ врСмя восстановлСния ΠΈΠ· Π°Ρ€Ρ…ΠΈΠ²Π° исходного тСкста ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ вСрсии 1.5.7.1).

/* prints to stdout the error messages. Format: %error ### message

text, where ### follows rfc 640 */

void

print_error(va_alist)

va_dcl

{

va_list list;

int i;

int err_no;

char *format;

if (printed_error_flag)

{

return;

}

va_start(list);

err_no = va_arg(list, int);

for (i = 0; i < N_ERRS; i++)

{

if (errs[i].err_no == err_no)

{

printf(β€œ%%error %s”, errs[i].msg);

break;

}

}

format = va_arg(list, char*);

if (*format)

{

printf(β€œ: ”);

}

vprintf(format, list);

va_end(list);

printf(β€œ\n”);

printed_error_flag = TRUE;

}

Π’ исходном тСкстС ΠΆΠΈΡ€Π½Ρ‹ΠΌ ΡˆΡ€ΠΈΡ„Ρ‚ΠΎΠΌ ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½ΠΎ мСсто ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ vprintf(). ΠŸΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ уязвимости Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ строки являСтся Π½Π΅ функция vprintf(), Π° Ρ‚ΠΎ, ΠΊΠ°ΠΊ Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚. Ѐункция print_ error() полагаСтся Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·Π²Π°Π²ΡˆΠ°Ρ Π΅Π΅ функция пСрСдаст Π΅ΠΉ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅: Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΡƒΡŽ строку ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π΅ΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅.

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ рассматриваСтся функция print_error(), ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° наглядно дСмонстрируСт ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ возникновСния уязвимостСй Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ строки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΠΎΠΌ. Π’ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… Π΅ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΠΎΡ…ΠΎΠΆΠΈΠ΅ Π½Π° print_error(). Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ смыслС функция print_error() ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ syslog() слуТит ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΎΠΉ для Π²Ρ‹Π΄Π°Ρ‡ΠΈ диагностики ΠΎΠ± ошибкС. Π•Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΊΠΎΠ΄ ошибки ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ printf(). Как ΡƒΠΆΠ΅ ΠΎΠ±ΡΡƒΠΆΠ΄Π°Π»ΠΎΡΡŒ Π² Π½Π°Ρ‡Π°Π»Π΅ Π³Π»Π°Π²Ρ‹, ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ программисты ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Π±Ρ‹Ρ‚ΡŒ ΠΎ возмоТности ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ строки Ρ‡Π΅Ρ€Π΅Π· Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹.

Рассмотрим, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡΡ ΠΊ сСрвису ΠΈ попытаСтся ΠΏΠΎΠ΄ΡΡƒΠ½ΡƒΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ vprintf () Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΡƒΡŽ строку, Π²Π·ΡΡ‚ΡƒΡŽ ΠΈΠ· Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ print_error().

Π’Π΅ ΠΈΠ· Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΠ»ΠΈ исходный тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, смогут Π½Π°ΠΉΡ‚ΠΈ Ρ€Π°Π·Π±ΠΈΡ€Π°Π΅ΠΌΡ‹ΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π° Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ soa_parse_args() ΠΈΠ· Ρ„Π°ΠΉΠ»Π° с исходным тСкстом server/soa. ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ дСйствия Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сокращСны Π΄ΠΎ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΠ°. Π’ 53-Π΅ΠΉ строчкС вызываСтся функция print_error() (строка Π²Ρ‹Π΄Π΅Π»Π΅Π½Π° ΠΆΠΈΡ€Π½Ρ‹ΠΌ ΡˆΡ€ΠΈΡ„Ρ‚ΠΎΠΌ), которая ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒ источником ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹Ρ… ошибок:

..

auth_area = find_auth_area_by_name(argv[i]);

if (!auth_area)

{

print_error(INVALID_AUTH_AREA, argv[i]);

free_arg_list(argv);

dl_list_destroy(soa_arg);

return NULL;

}

ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ print_error() Π΅ΠΉ пСрСдаСтся ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ argv[i], ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся Π½Π΅ Ρ‡Π΅ΠΌ ΠΈΠ½Ρ‹ΠΌ, ΠΊΠ°ΠΊ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ строкой. Π’ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ счСтС эта Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π°Ρ строка Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ vprintf() для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, ΠΊΠ°ΠΊ ΠΎΠ± этом ΡƒΠΆΠ΅ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΎΡΡŒ. БрСдствам контроля исходного тСкста ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ это мСсто Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ΄ΠΎΠ·Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΈ подходящим для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ Π°Ρ‚Π°ΠΊΠΈ. Для бСзопасной ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² слСдовало Π±Ρ‹ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ print_error() ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ способом:

print_error(INVALID_AUTH_AREA, Β«%sΒ», argv[i]);

ΠŸΡ€ΠΈ этом способС Π²Ρ‹Π·ΠΎΠ²Π° i-ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ argv[i] пСрСдаСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ print_error() ΠΊΠ°ΠΊ пСрСмСнная, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ спСцификации прСобразования %s. ΠŸΡ€ΠΈ этом ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ всякая Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ print_error() Π·Π»ΠΎΠ½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎΠΉ спСцификации прСобразования, которая ΠΌΠΎΠ³Π»Π° Π±Ρ‹ нСпрСдусмотрСнным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ vprintf(), Π²Ρ‹Π·Π²Π°Π½Π½ΠΎΠΉ print_error(). Π‘Ρ‚Ρ€ΠΎΠΊΠ° argv[i] β€” это Π½Π΅ Ρ‡Ρ‚ΠΎ ΠΈΠ½ΠΎΠ΅, ΠΊΠ°ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ – soa, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ сСрвСру.

Подводя ΠΈΡ‚ΠΎΠ³, слСдуСт ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ соСдиняСтся с сСрвСром rwhoisd ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Π½Π΅Π²Π΅Ρ€Π½ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ – soa, функция print_error() Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ сообщСниС ΠΎΠ± ошибкС. ΠŸΡ€ΠΈ этом выполняСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ дСйствий.

1. Π‘Π΅Ρ€Π²Π΅Ρ€ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ – soa ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ для Π΅Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ soa_directive().

2. Ѐункция soa_directive() ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ soa_parse_args() для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

3. ΠŸΡ€ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠΈ ошибки функция soa_parse_args() ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΠΊΠΎΠ΄ ошибки ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡƒΡŽ строку Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ print_error() Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ строки.

4. Ѐункция print_error() ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΡƒΡŽ строку с содСрТащимися Π² Π½Π΅ΠΉ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ vprintf(), ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡƒΠΆΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΎΡΡŒ, ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π΅Π΅.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ясно, Ρ‡Ρ‚ΠΎ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Π΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ vprintf() Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΡƒΡŽ строку, которая являСтся Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ – soa. ΠŸΡ€ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ ΠΊ сСрвСру ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ Π΅ΠΌΡƒ Π·Π»ΠΎΠ½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ строки Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹Π΅ Π΅ΠΌΡƒ Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ сСрвСра.

ВСстированиС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ способом случайной Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ строки

ΠŸΠΎΠΌΠ΅ΡΡ‚ΠΈΠ² Π² исходный тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΡƒΡΠ·Π²ΠΈΠΌΡƒΡŽ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΡƒΡŽ строку, продСмонстрируСм способы Π΅Π΅ использования Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΠΎΠΌ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ ΠΈΠ·ΡƒΡ‡ΠΈΠΌ Ρ€Π΅Π°ΠΊΡ†ΠΈΡŽ сСрвСра Π½Π° Π½ΠΈΡ….

Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ условия Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΠ³Π΄Π° ΠΎ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ уязвимости Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ строки ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡΡƒΠ΄ΠΈΡ‚ΡŒ ΠΏΠΎ Π΅Π΅ повСдСнию. Если уязвимая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΎΡ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ строку, Ρ‚ΠΎ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π² Π½Π΅ΠΉ уязвимости Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ строки ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ. ΠŸΡ€ΠΈ отсутствии Π²Ρ‹Π²ΠΎΠ΄Π° ΠΎ присутствии Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ уязвимости Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ строки ΠΌΠΎΠΆΠ½ΠΎ ΡΡƒΠ΄ΠΈΡ‚ΡŒ ΠΏΠΎ Ρ€Π΅Π°ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ спСцификации Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ².

Если ΠΏΡ€ΠΈ Π²Π²ΠΎΠ΄Π΅ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… со спСцификациями прСобразования %n%n процСсс Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ, Ρ‚ΠΎ, вСроятнСС всСго, это происходит ΠΈΠ·-Π·Π° Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΡ доступа ΠΊ памяти ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ записи ΠΏΠΎ Π½Π΅Π²Π΅Ρ€Π½Ρ‹ΠΌ адрСсам памяти, ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½Π½Ρ‹ΠΌ ΠΈΠ· стСка. ΠŸΠ΅Ρ€Π΅Π΄Π°Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π΅ прСдусмотрСн Π²Ρ‹Π²ΠΎΠ΄ ΠΎΡ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ строки, Ρ‡Π΅Ρ€Π΅Π· Π΅Π΅ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ спСцификации Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² %n%n, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, уязвима ΠΎΠ½Π° ΠΈΠ»ΠΈ Π½Π΅Ρ‚. Если процСсс Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ, Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ управлСния ΠΈΠ»ΠΈ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ, Ρ‚ΠΎ Π²ΠΏΠΎΠ»Π½Π΅ вСроятно, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ этого являСтся ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ строки.

Π’ рассматриваСмом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ сСрвСр Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ сообщСниС ΠΎΠ± ошибкС Π² Π²ΠΈΠ΄Π΅ ΠΎΡ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ строки. Π­Ρ‚ΠΎ ΠΎΠ±Π»Π΅Π³Ρ‡Π°Π΅Ρ‚ дСйствия Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡ‰Π΅Ρ‚ способ ΠΏΡ€ΠΎΠ½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ Π½Π° хост. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΎΠ±Ρ€Π°Π·Π΅Ρ† Π²Ρ‹Π·ΠΎΠ²Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ rwhoisd, которая дСмонстрируСт ΠΎΡˆΠΈΠ±ΠΊΡƒ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ строкС:

[ [email protected] server]$ nc localhost 4321

%rwhois V-1.5:003fff:00 victim (by Network Solutions, Inc.

V-1.5.7.1)

-soa am_%i_vulnerable

%error 340 Invalid Authority Area: am_-1073743563_vulnerable

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ Π²Ρ‹Π²ΠΎΠ΄Π° сСрвСром ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ†Π΅Π»ΠΎΠ³ΠΎ числа -1073743563 являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π² ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠΉ сСрвису строкС содСрТится спСцификация Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° %i, Π½Π° мСсто ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π² ΠΎΡ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ строку записываСтся содСрТимоС области памяти ΠΈΠ· стСка Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ Ρ†Π΅Π»ΠΎΠ³ΠΎ числа со Π·Π½Π°ΠΊΠΎΠΌ. Ѐункция printf() Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ число послС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ содСрТимого области стСка Π΄Π»ΠΈΠ½ΠΎΠΉ 4 Π±Π°ΠΉΡ‚Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΎΠ½Π° ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚, хранится Ρ†Π΅Π»ΠΎΠ΅ число со Π·Π½Π°ΠΊΠΎΠΌ. Π’Π΅ΠΌ самым подтвСрТдаСтся Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ уязвимости Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ строки Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ rwhoisd.

Π£ΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ строки ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, анализируя исходный тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ Π΅Π΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅. ПослС этого ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚ΡŒ Π½Π°ΠΉΠ΄Π΅Π½Π½ΡƒΡŽ ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ. Π£ΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒΡŽ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ строки ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ сСтСвой ΠΊΠ»ΠΈΠ΅Π½Ρ‚. Для этого аутСнтификация ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π½Π΅ Π½ΡƒΠΆΠ½Π°, ΠΈ Π²ΠΏΠΎΠ»Π½Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎ этим смоТСт Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ Π³Π»Π°Π²Π½ΠΎΠΌΡƒ хосту.

Π’ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Ρ… случаях, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΎΡ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ строку, Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ содСрТимоС стСка памяти ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π΅Π³ΠΎ содСрТимым. Π‘Π»ΠΎΠ²Π° памяти ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½Ρ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ способом:

[ [email protected] server]$ nc localhost 4321

%rwhois V-1.5:003fff:00 victim (by Network Solutions, Inc.

V-1.5.7.1)

-soa %010p

%error 340 Invalid Authority Area: 0xbffff935

-soa %010p%010p

%error 340 Invalid Authority Area: 0xbffff9350x0807fa80