Demon 시즌2/linux kernel exploitation

[linux kernel] (3) - task

jir4vvit 2020. 12. 11. 16:25

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 참조 카운터
하나의 cred 구조체는 여러 개의 프로세스에서 동시에 사용될 수 있다.

uid

프로세스를 소유하고 있는 사용자 ID(User ID, UID)를 저장함
0으로 덮어쓰면 해당 태스크는 seteuid(0)로 최고관리자 권한을 획득할 수 있다.

euid 실효적인 사용자 ID(Effective User ID, EUID)를 저장함
권한 검사에 실제 사용되는 값을 저장하며, 0으로 덮어쓰면 해당 태스크는 최고관리자 권한을 획득하게 된다.  일반적으로는 uid와 같은 값을 가짐
gid, egid 각각 Real GID와 Effective GID를 저장함
GID는 group ID의 약자로 사용자 그룹의 식별번호를 의미한다.