[kernel] current 구조체 / cred 수정
struct task_struct current
/v4.13.8/source/include/linux/sched.h#L519
```c
struct task_struct {
#ifdef CONFIG_THREAD_INFO_IN_TASK
/*
* For reasons of header soup (see current_thread_info()), this
* must be the first element of task_struct.
*/
struct thread_info thread_info;
#endif
/* -1 unrunnable, 0 runnable, >0 stopped: */
volatile long state;
.....................................................................
#ifdef CONFIG_CC_STACKPROTECTOR
/* Canary value for the -fstack-protector GCC feature: */
unsigned long stack_canary;
#endif
.....................................................................
/* Process credentials: */
/* Tracer's credentials at attach: */
const struct cred __rcu *ptracer_cred;
/* Objective and real subjective task credentials (COW): */
const struct cred __rcu *real_cred;
/* Effective (overridable) subjective task credentials (COW): */
const struct cred __rcu *cred;
.....................................................................
struct thread_struct thread;
};
```
- `` current`` 구조체는 별 다른 선언 없이 바로 접근 할 수 있다.
cred 수정
```c
asmlinkage void modi_cred(void){
struct cred __rcu *fake_cred = current->cred;
printk("before cred uid : %d\n", fake_cred->uid);
fake_cred->uid.val = 0;
fake_cred->gid.val = 0;
fake_cred->euid.val = 0;
fake_cred->egid.val = 0;
printk("after cred uid : %d\n", fake_cred->uid);
}
```
Note ) ``c sys_write()``같이 다양한 권한의 프로세스에서 매우 빈번하게 호출되는 함수를 hooking해 cred를 수정할 경우, ``c sys_write()``를 호출하는 모든 프로세스의 cred가 변경되기 때문에 hooking 코드에 별 문제가 없어도 Oops가 발생할 수 있다.
real_cred VS cred
real_cred : The objective context of a task. These parts are used when some other task is attempting to affect this one.
다른 task가 이 task에 접근하기 위해서 가지고 있어야 하는 권한을 의미한다.
cred : The subjective context. These details are used when the task is acting upon another object, be that a file, a task, a key or whatever.
이 task가 다른 task에 접근하거나, 특정 작업을 수행할 때 행사하는 권한을 의미한다.
일시적으로 다른 security context를 가리키도록 override 될 수 있으나
기본적으로 ``c current->cred == current->real_cred``다.
따라서, 권한 상승의 경우 cred로 접근해야 하는게 맞지만 일반적인 경우 둘은 같은 구조체를 가리키고 있기 때문에 둘 중 어느 쪽으로 접근해서 수정해도 권한 상승이 가능하다.
'OS > Kernel' 카테고리의 다른 글
Meltdown 정리 (0) | 2018.05.26 |
---|---|
CVE-2017-1000112 : Exploitable memory corruption due to UFO to non-UFO path switch (0) | 2017.11.08 |
[kernel] hook sys_call_table (0) | 2017.10.20 |
[kernel] get sys_call_table (0) | 2017.10.16 |
[kernel] Page Protection (0) | 2017.10.16 |