Add ELF flag to disable ASLR stack gap.
Also centralize and unify checks to enable ASLR stack gap in a new helper exec_stackgap(). PR: 239873 Sponsored by: The FreeBSD Foundation MFC after: 1 week
This commit is contained in:
parent
c5354d593d
commit
673e2dd652
@ -3424,8 +3424,7 @@ freebsd32_copyout_strings(struct image_params *imgp, uintptr_t *stack_base)
|
||||
destp = rounddown2(destp, sizeof(uint32_t));
|
||||
ustringp = destp;
|
||||
|
||||
if (imgp->sysent->sv_stackgap != NULL)
|
||||
imgp->sysent->sv_stackgap(imgp, &destp);
|
||||
exec_stackgap(imgp, &destp);
|
||||
|
||||
if (imgp->auxargs) {
|
||||
/*
|
||||
|
@ -2818,8 +2818,6 @@ __elfN(stackgap)(struct image_params *imgp, uintptr_t *stack_base)
|
||||
uintptr_t range, rbase, gap;
|
||||
int pct;
|
||||
|
||||
if ((imgp->map_flags & MAP_ASLR) == 0)
|
||||
return;
|
||||
pct = __elfN(aslr_stack_gap);
|
||||
if (pct == 0)
|
||||
return;
|
||||
|
@ -1534,6 +1534,17 @@ exec_args_get_begin_envv(struct image_args *args)
|
||||
return (args->endp);
|
||||
}
|
||||
|
||||
void
|
||||
exec_stackgap(struct image_params *imgp, uintptr_t *dp)
|
||||
{
|
||||
if (imgp->sysent->sv_stackgap == NULL ||
|
||||
(imgp->proc->p_fctl0 & (NT_FREEBSD_FCTL_ASLR_DISABLE |
|
||||
NT_FREEBSD_FCTL_ASG_DISABLE)) != 0 ||
|
||||
(imgp->map_flags & MAP_ASLR) == 0)
|
||||
return;
|
||||
imgp->sysent->sv_stackgap(imgp, dp);
|
||||
}
|
||||
|
||||
/*
|
||||
* Copy strings out to the new process address space, constructing new arg
|
||||
* and env vector tables. Return a pointer to the base so that it can be used
|
||||
@ -1624,8 +1635,7 @@ exec_copyout_strings(struct image_params *imgp, uintptr_t *stack_base)
|
||||
destp = rounddown2(destp, sizeof(void *));
|
||||
ustringp = destp;
|
||||
|
||||
if (imgp->sysent->sv_stackgap != NULL)
|
||||
imgp->sysent->sv_stackgap(imgp, &destp);
|
||||
exec_stackgap(imgp, &destp);
|
||||
|
||||
if (imgp->auxargs) {
|
||||
/*
|
||||
|
@ -797,6 +797,7 @@ typedef struct {
|
||||
#define NT_FREEBSD_FCTL_STKGAP_DISABLE 0x00000004
|
||||
#define NT_FREEBSD_FCTL_WXNEEDED 0x00000008
|
||||
#define NT_FREEBSD_FCTL_LA48 0x00000010
|
||||
#define NT_FREEBSD_FCTL_ASG_DISABLE 0x00000020 /* ASLR STACK GAP Disable */
|
||||
|
||||
/* Values for n_type. Used in core files. */
|
||||
#define NT_PRSTATUS 1 /* Process status. */
|
||||
|
@ -122,6 +122,7 @@ int exec_copyin_args(struct image_args *, const char *, enum uio_seg,
|
||||
char **, char **);
|
||||
int exec_copyin_data_fds(struct thread *, struct image_args *, const void *,
|
||||
size_t, const int *, size_t);
|
||||
void exec_stackgap(struct image_params *imgp, uintptr_t *dp);
|
||||
int pre_execve(struct thread *td, struct vmspace **oldvmspace);
|
||||
void post_execve(struct thread *td, int error, struct vmspace *oldvmspace);
|
||||
#endif
|
||||
|
@ -68,6 +68,7 @@ static struct ControlFeatures featurelist[] = {
|
||||
{ "stackgap", NT_FREEBSD_FCTL_STKGAP_DISABLE, "Disable stack gap" },
|
||||
{ "wxneeded", NT_FREEBSD_FCTL_WXNEEDED, "Requires W+X mappings" },
|
||||
{ "la48", NT_FREEBSD_FCTL_LA48, "amd64: Limit user VA to 48bit" },
|
||||
{ "aslrstkgap", NT_FREEBSD_FCTL_ASG_DISABLE, "Disable ASLR stack gap" },
|
||||
};
|
||||
|
||||
static struct option long_opts[] = {
|
||||
|
Loading…
Reference in New Issue
Block a user