From 5d4528238c9466e67de95be1201d81d5b621b158 Mon Sep 17 00:00:00 2001 From: "Rustem Gimadutdinov (rgimad)" Date: Mon, 23 Nov 2020 18:52:56 +0000 Subject: [PATCH] SysFn 9 security fix: now apps cannot destroy kernel memory via passing illegal address in ebx Update docs on SysFn 9 git-svn-id: svn://kolibrios.org@8246 a494cfbc-eb01-0410-851d-a64ba20cac60 --- kernel/trunk/docs/sysfuncr.txt | 3 +++ kernel/trunk/docs/sysfuncs.txt | 3 +++ kernel/trunk/kernel.asm | 12 ++++++++++++ 3 files changed, 18 insertions(+) diff --git a/kernel/trunk/docs/sysfuncr.txt b/kernel/trunk/docs/sysfuncr.txt index d057de78dd..b47da8c798 100644 --- a/kernel/trunk/docs/sysfuncr.txt +++ b/kernel/trunk/docs/sysfuncr.txt @@ -293,6 +293,9 @@ picture rb Xsize*Ysize*4 ; 32 бита ecx = -1 - получить информацию о текущем потоке Возвращаемое значение: * eax = максимальный номер слота потока + но, если указатель в ebx недопустимый, например, + регион [ebx, ebx + 0x4C) пересекается с памятью ядра, + то тогда функция возвращает -1 * буфер, на который указывает ebx, содержит следующую информацию: * +0: dword: использование процессора (сколько тактов в секунду уходит на исполнение именно этого потока) diff --git a/kernel/trunk/docs/sysfuncs.txt b/kernel/trunk/docs/sysfuncs.txt index 7e7bf05970..1a1e4e80ff 100644 --- a/kernel/trunk/docs/sysfuncs.txt +++ b/kernel/trunk/docs/sysfuncs.txt @@ -283,6 +283,9 @@ Parameters: ecx = -1 - get information on the current thread Returned value: * eax = maximum number of the slot of a thread + but if pointer in ebx is illegal, for example, + [ebx, ebx + 0x4C) region intersects with kernel memory, + then function returns -1 * buffer pointed to by ebx contains the following information: * +0: dword: usage of the processor (how many time units per second leaves on execution of this thread) diff --git a/kernel/trunk/kernel.asm b/kernel/trunk/kernel.asm index 9a312fdbdf..4778975648 100644 --- a/kernel/trunk/kernel.asm +++ b/kernel/trunk/kernel.asm @@ -3159,6 +3159,14 @@ sys_cpuusage: ; +26 dword used mem ; +30 dword PID , process idenfification number ; + ; if given memory address belongs to kernel then error + push ebx + mov eax, ebx + mov ebx, 0x4C + call is_region_userspace + pop ebx + test eax, eax + jz .addr_error cmp ecx, -1 ; who am I ? jne .no_who_am_i @@ -3249,6 +3257,10 @@ sys_cpuusage: mov [esp+32], eax ret +.addr_error: ; if given memory address is illegal + mov eax, -1 + ret + align 4 sys_clock: cli