|
@@ -152,8 +152,10 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr *exec,
|
|
elf_addr_t __user *sp;
|
|
elf_addr_t __user *sp;
|
|
elf_addr_t __user *u_platform;
|
|
elf_addr_t __user *u_platform;
|
|
elf_addr_t __user *u_base_platform;
|
|
elf_addr_t __user *u_base_platform;
|
|
|
|
+ elf_addr_t __user *u_rand_bytes;
|
|
const char *k_platform = ELF_PLATFORM;
|
|
const char *k_platform = ELF_PLATFORM;
|
|
const char *k_base_platform = ELF_BASE_PLATFORM;
|
|
const char *k_base_platform = ELF_BASE_PLATFORM;
|
|
|
|
+ unsigned char k_rand_bytes[16];
|
|
int items;
|
|
int items;
|
|
elf_addr_t *elf_info;
|
|
elf_addr_t *elf_info;
|
|
int ei_index = 0;
|
|
int ei_index = 0;
|
|
@@ -196,6 +198,15 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr *exec,
|
|
return -EFAULT;
|
|
return -EFAULT;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * Generate 16 random bytes for userspace PRNG seeding.
|
|
|
|
+ */
|
|
|
|
+ get_random_bytes(k_rand_bytes, sizeof(k_rand_bytes));
|
|
|
|
+ u_rand_bytes = (elf_addr_t __user *)
|
|
|
|
+ STACK_ALLOC(p, sizeof(k_rand_bytes));
|
|
|
|
+ if (__copy_to_user(u_rand_bytes, k_rand_bytes, sizeof(k_rand_bytes)))
|
|
|
|
+ return -EFAULT;
|
|
|
|
+
|
|
/* Create the ELF interpreter info */
|
|
/* Create the ELF interpreter info */
|
|
elf_info = (elf_addr_t *)current->mm->saved_auxv;
|
|
elf_info = (elf_addr_t *)current->mm->saved_auxv;
|
|
/* update AT_VECTOR_SIZE_BASE if the number of NEW_AUX_ENT() changes */
|
|
/* update AT_VECTOR_SIZE_BASE if the number of NEW_AUX_ENT() changes */
|
|
@@ -228,6 +239,7 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr *exec,
|
|
NEW_AUX_ENT(AT_GID, cred->gid);
|
|
NEW_AUX_ENT(AT_GID, cred->gid);
|
|
NEW_AUX_ENT(AT_EGID, cred->egid);
|
|
NEW_AUX_ENT(AT_EGID, cred->egid);
|
|
NEW_AUX_ENT(AT_SECURE, security_bprm_secureexec(bprm));
|
|
NEW_AUX_ENT(AT_SECURE, security_bprm_secureexec(bprm));
|
|
|
|
+ NEW_AUX_ENT(AT_RANDOM, (elf_addr_t)(unsigned long)u_rand_bytes);
|
|
NEW_AUX_ENT(AT_EXECFN, bprm->exec);
|
|
NEW_AUX_ENT(AT_EXECFN, bprm->exec);
|
|
if (k_platform) {
|
|
if (k_platform) {
|
|
NEW_AUX_ENT(AT_PLATFORM,
|
|
NEW_AUX_ENT(AT_PLATFORM,
|