Changeset View
Changeset View
Standalone View
Standalone View
head/sys/kern/imgact_elf.c
Show First 20 Lines • Show All 150 Lines • ▼ Show 20 Lines | SYSCTL_INT(ASLR_NODE_OID, OID_AUTO, pie_enable, CTLFLAG_RWTUN, | ||||
__XSTRING(__CONCAT(ELF, __ELF_WORD_SIZE)) | __XSTRING(__CONCAT(ELF, __ELF_WORD_SIZE)) | ||||
": enable address map randomization for PIE binaries"); | ": enable address map randomization for PIE binaries"); | ||||
static int __elfN(aslr_honor_sbrk) = 1; | static int __elfN(aslr_honor_sbrk) = 1; | ||||
SYSCTL_INT(ASLR_NODE_OID, OID_AUTO, honor_sbrk, CTLFLAG_RW, | SYSCTL_INT(ASLR_NODE_OID, OID_AUTO, honor_sbrk, CTLFLAG_RW, | ||||
&__elfN(aslr_honor_sbrk), 0, | &__elfN(aslr_honor_sbrk), 0, | ||||
__XSTRING(__CONCAT(ELF, __ELF_WORD_SIZE)) ": assume sbrk is used"); | __XSTRING(__CONCAT(ELF, __ELF_WORD_SIZE)) ": assume sbrk is used"); | ||||
static int __elfN(aslr_stack_gap) = 3; | |||||
SYSCTL_INT(ASLR_NODE_OID, OID_AUTO, stack_gap, CTLFLAG_RW, | |||||
&__elfN(aslr_stack_gap), 0, | |||||
__XSTRING(__CONCAT(ELF, __ELF_WORD_SIZE)) | |||||
": maximum percentage of main stack to waste on a random gap"); | |||||
static Elf_Brandinfo *elf_brand_list[MAX_BRANDS]; | static Elf_Brandinfo *elf_brand_list[MAX_BRANDS]; | ||||
#define aligned(a, t) (rounddown2((u_long)(a), sizeof(t)) == (u_long)(a)) | #define aligned(a, t) (rounddown2((u_long)(a), sizeof(t)) == (u_long)(a)) | ||||
static const char FREEBSD_ABI_VENDOR[] = "FreeBSD"; | static const char FREEBSD_ABI_VENDOR[] = "FreeBSD"; | ||||
Elf_Brandnote __elfN(freebsd_brandnote) = { | Elf_Brandnote __elfN(freebsd_brandnote) = { | ||||
.hdr.n_namesz = sizeof(FREEBSD_ABI_VENDOR), | .hdr.n_namesz = sizeof(FREEBSD_ABI_VENDOR), | ||||
▲ Show 20 Lines • Show All 2,547 Lines • ▼ Show 20 Lines | __elfN(untrans_prot)(vm_prot_t prot) | ||||
flags = 0; | flags = 0; | ||||
if (prot & VM_PROT_EXECUTE) | if (prot & VM_PROT_EXECUTE) | ||||
flags |= PF_X; | flags |= PF_X; | ||||
if (prot & VM_PROT_READ) | if (prot & VM_PROT_READ) | ||||
flags |= PF_R; | flags |= PF_R; | ||||
if (prot & VM_PROT_WRITE) | if (prot & VM_PROT_WRITE) | ||||
flags |= PF_W; | flags |= PF_W; | ||||
return (flags); | return (flags); | ||||
} | |||||
void | |||||
__elfN(stackgap)(struct image_params *imgp, u_long *stack_base) | |||||
{ | |||||
u_long range, rbase, gap; | |||||
int pct; | |||||
if ((imgp->map_flags & MAP_ASLR) == 0) | |||||
return; | |||||
pct = __elfN(aslr_stack_gap); | |||||
if (pct == 0) | |||||
return; | |||||
if (pct > 50) | |||||
pct = 50; | |||||
range = imgp->eff_stack_sz * pct / 100; | |||||
range *= pct; | |||||
arc4rand(&rbase, sizeof(rbase), 0); | |||||
gap = rbase % range; | |||||
gap &= ~(sizeof(u_long) - 1); | |||||
*stack_base -= gap; | |||||
} | } |