Skip to content

Commit f2778b3

Browse files
chleroygregkh
authored andcommitted
lkdtm: Add tests for NULL pointer dereference
[ Upstream commit 59a1220 ] Introduce lkdtm tests for NULL pointer dereference: check access or exec at NULL address, since these errors tend to be reported differently from the general fault error text. For example from x86: pr_alert("BUG: unable to handle kernel %s at %px\n", address < PAGE_SIZE ? "NULL pointer dereference" : "paging request", (void *)address); Signed-off-by: Christophe Leroy <[email protected]> Signed-off-by: Kees Cook <[email protected]> Signed-off-by: Sasha Levin <[email protected]>
1 parent b035faf commit f2778b3

File tree

3 files changed

+22
-0
lines changed

3 files changed

+22
-0
lines changed

drivers/misc/lkdtm.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,9 @@ void lkdtm_EXEC_KMALLOC(void);
4545
void lkdtm_EXEC_VMALLOC(void);
4646
void lkdtm_EXEC_RODATA(void);
4747
void lkdtm_EXEC_USERSPACE(void);
48+
void lkdtm_EXEC_NULL(void);
4849
void lkdtm_ACCESS_USERSPACE(void);
50+
void lkdtm_ACCESS_NULL(void);
4951

5052
/* lkdtm_refcount.c */
5153
void lkdtm_REFCOUNT_INC_OVERFLOW(void);

drivers/misc/lkdtm_core.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,9 @@ struct crashtype crashtypes[] = {
220220
CRASHTYPE(EXEC_VMALLOC),
221221
CRASHTYPE(EXEC_RODATA),
222222
CRASHTYPE(EXEC_USERSPACE),
223+
CRASHTYPE(EXEC_NULL),
223224
CRASHTYPE(ACCESS_USERSPACE),
225+
CRASHTYPE(ACCESS_NULL),
224226
CRASHTYPE(WRITE_RO),
225227
CRASHTYPE(WRITE_RO_AFTER_INIT),
226228
CRASHTYPE(WRITE_KERN),

drivers/misc/lkdtm_perms.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,11 @@ void lkdtm_EXEC_USERSPACE(void)
164164
vm_munmap(user_addr, PAGE_SIZE);
165165
}
166166

167+
void lkdtm_EXEC_NULL(void)
168+
{
169+
execute_location(NULL, CODE_AS_IS);
170+
}
171+
167172
void lkdtm_ACCESS_USERSPACE(void)
168173
{
169174
unsigned long user_addr, tmp = 0;
@@ -195,6 +200,19 @@ void lkdtm_ACCESS_USERSPACE(void)
195200
vm_munmap(user_addr, PAGE_SIZE);
196201
}
197202

203+
void lkdtm_ACCESS_NULL(void)
204+
{
205+
unsigned long tmp;
206+
unsigned long *ptr = (unsigned long *)NULL;
207+
208+
pr_info("attempting bad read at %px\n", ptr);
209+
tmp = *ptr;
210+
tmp += 0xc0dec0de;
211+
212+
pr_info("attempting bad write at %px\n", ptr);
213+
*ptr = tmp;
214+
}
215+
198216
void __init lkdtm_perms_init(void)
199217
{
200218
/* Make sure we can write to __ro_after_init values during __init */

0 commit comments

Comments
 (0)