Task
프로세스랑 쓰레드는 테스크로 관리한다.
테스크는 task_struct라는 구조체로 관리 한다.
task_struct 구조체엔 테스크에 대한 정보가 들어 있다.
이 구조체에 중요하게 생각할만한 것은 권한 정보 이다.
프로세스를 만들 땐 fork 함수를, 쓰레드를 만들 땐 pthread_create 함수를 쓴다.
이 두 함수 다 task_struct를 생성하는 역할을 하고,각 테스크 마다 커널 스택 및 task_struct가 할당이 된다.
결론은 프로세스나 쓰레드 마다 커널 스택과 task_struct가 할당이 된다.
task_struct 구조체
// Permal link: https://github.com/torvalds/linux/blob/219d54332a09e8d8741c1e1982f5eae56099de85/include/linux/sched.h#L624:L1284
struct task_struct {
...
volatile long state;
...
struct list_head tasks;
...
struct mm_struct *mm;
...
/* Effective (overridable) subjective task credentials (COW): */
const struct cred __rcu *cred;
...
char comm[TASK_COMM_LEN];
...
/* Open file information: */
struct files_struct *files;
...
}
이 중에서 신원 정보, 즉 권한 정보를 가지고 있는 필드는 cred이다.
cred 구조체 : 권한 정보 (신원 정보)
// Permal link: https://github.com/torvalds/linux/blob/219d54332a09e8d8741c1e1982f5eae56099de85/include/linux/cred.h#L111:L153
struct cred {
atomic_t usage;
...
kuid_t uid; /* real UID of the task */
kgid_t gid; /* real GID of the task */
kuid_t suid; /* saved UID of the task */
kgid_t sgid; /* saved GID of the task */
kuid_t euid; /* effective UID of the task */
kgid_t egid; /* effective GID of the task */
kuid_t fsuid; /* UID for VFS ops */
kgid_t fsgid; /* GID for VFS ops */
unsigned securebits; /* SUID-less security management */
kernel_cap_t cap_inheritable; /* caps our children can inherit */
kernel_cap_t cap_permitted; /* caps we're permitted */
kernel_cap_t cap_effective; /* caps we can actually use */
kernel_cap_t cap_bset; /* capability bounding set */
kernel_cap_t cap_ambient; /* Ambient capability set */
...
}
usage |
cred 참조 카운터 |
uid |
프로세스를 소유하고 있는 사용자 ID(User ID, UID)를 저장함 |
euid | 실효적인 사용자 ID(Effective User ID, EUID)를 저장함 권한 검사에 실제 사용되는 값을 저장하며, 0으로 덮어쓰면 해당 태스크는 최고관리자 권한을 획득하게 된다. 일반적으로는 uid와 같은 값을 가짐 |
gid, egid | 각각 Real GID와 Effective GID를 저장함 GID는 group ID의 약자로 사용자 그룹의 식별번호를 의미한다. |
'Demon 시즌2 > linux kernel exploitation' 카테고리의 다른 글
[linux kernel] (6) - CSAW 2010 Kernel Exploit (0) | 2021.01.02 |
---|---|
[linux kernel] (5) - 환경 세팅 (0) | 2020.12.30 |
[linux kernel] (4) - Slab Allocator(슬랩 할당자) (1) | 2020.12.26 |
[linux kernel] (2) - kernel land의 메모리 보호기법 (0) | 2020.12.11 |
[linux kernel] (1) - 커널(kernel)이란? (0) | 2020.12.11 |