검색을 해보면 태스크를 태스크, 스레드, 프로세스로도 표현한다고 한다.
결국 태스크는 작업 실행 단위를 이야기하는 것 같다.
결국 모든 태스크들은 task_struct 구조체를 통해 관리하게 된다.
태스크 또는 스레드가 생성되면 do_fork() 라는 커널 함수를 거치면서 이 task_struct를 생성하는데, 이 때 권한이나 주소 등을 task_struct 구조체에 넣어두게 된다.
즉, fork(), vfork(), pthread_create() 등의 함수를 어플리케이션에서 실행하면 라이브러리에서 해당 함수를 찾아 실행하며,
라이브러리에서는 다시 clone(), vfork() 등의 시스템 콜을 하며,
커널에서는 sys_clone(), sys_vfork(), sys_fork()를 실행하고
결론적으로 do_fork() 함수를 실행하게 되며, 해당 함수 내에서 task_struct를 생성한다.
모두 다 이해하려면 너무 많으니, 중요한 부분만 보자.
해당 부분이 위에서 이야기한 각 주소를 관리하는 영역이다.
이 구조체 내에서 stack, heap, bss, code 등의 영역을 관리한다.
아래 소스 코드를 참고하자
https://elixir.bootlin.com/linux/latest/source/include/linux/mm_types.h#L598
권한을 관리하는 구조체로 kernel exploit에서 가장 중요한 부분이라 생각한다.
통상적으로 uid가 0이면 root이며, kernel exploit에서는 이 부분을 0으로 만드는 것을 목표로 한다.
https://elixir.bootlin.com/linux/latest/source/include/linux/cred.h#L110