더 나은 세상

CVE-11176(1) 본문

컴퓨터 프로그래밍

CVE-11176(1)

leemark 2019. 3. 30. 18:46

처음 써보는 debian

사실 우분투 외의 리눅스는 써보지 않았는데 GUI가 없으니 확실히 어려운 것 같다.

 

1. core concept

  struct task_struct : task 마다 이걸 하나씩 가지고 있다.

multi thread의 경우 thread마다 1개씩 가지고 있다.

7개의 파일 종류 : regular, directory, link, character device, block device, fifo, socket

파일 종류는 file descriptor로(정수로) 표현된다. file descriptor 당 struct file이 있다. (thread는 더 큰 범위)

이 fiile object를 가리키는 포인터를 filp 혹은 file pointer라고 한다.

file descriptor를 file object로 변환 시켜주는 것이 바로 file descriptor table. 1대1대응 아님

여러개의 fd가 하나의 file을 가리킬 수 있다. 이를 위해 file object는 Reference counter를 가진다.

FDT는 struct fdtable에 저장된다.

process에 fdt를 연결시켜 주는 것이 바로 struct files_struct이다.

즉 task(thread 혹은 process)가 struct files_struct를 이용하여 fdt를 볼 수 있고 fd와 fdt를 이용하여 파일을 열 수 있다.

files_struct는 그렇기에 여러 task에게 공유되고 이를 가리키는 pointer는 task_struct에 저장되어 있다.

 

VFT

vft는 function pointer로 구성되어 있는데 그 중 예시는 files_operations(f_ops)이다. 이걸로 read, write, open, release등 가능

Socket, Sock, SKB

struct socket은 network stack에서 가장 top에 위치해있다. socket의 operation은 struct socket_file_ops로 정의된다.

socket도 file이므로 file descriptor를 가짐 (FDT에 있음)

BSD socket API를 구현하기 위해 struct proto_ops이용(struct socket_file_ops를 전문화시킨것)(bind, connect, accept가 있다.)

예를 들어 BSD스타일의 system call이 들어왔다면, descriptor table이 struct file찾고, struct file이 struct socket을  찾고 (struct socket안에 struct sock pointer가 있다.) 

struct sock은 network card driver와 struct socket사이에 존재하는데 buffer를 가지는 역할을 한다. (receive buffer와 sending buffer를 가진다. receive : program -> driver, 정확히 buffer는 아니고 doubled linked list이다.)

driver와 program이 주고 받는 것(buffer에 들어가는 것)은 struct sk_buff이다. (linked list의 요소)

Netlink Socket

Netlink Socket(AF_NETLINK)는 Socket의 종류 중 하나
이건 kernel과 user space간 통신을 가능하게 한다.

routing table변경, SELinux event notification 수신, 다른 user land process와의 통신하는데 쓰인다.(NETLINK_ROUTE, NETLINK_SELINUX, NETLINK_USERSOCK)

그래서 일반적인 socket과 sock과는 다르게 만듬 ->netlink family 함수를 위해 struct proto_ops를 struct netlink_ops로 만듬, sock는 netlink_sock(netlink_sock는 struct sk를 가지는데 둘 주소가 같다.)

여기까지가 data structure에 대한 설명

 

Reference Counters : 앞에서 struct file이 reference counter를 가지고 있고 이는 파일을 참조하는 task가 몇개인지 보여준다고 했다. struct files_struct에도 reference counter를 바꾸는 atomic_t count가 있다. race condition을 없애기 위해 atomic operation을 쓴다. atomic_inc, atomic_add, atomic_dec_and_test가 있다. reference counter가 0이 되면 free가 된다. ref counter를

+1 하는 동작 : "*_get()" : "taking reference"

-1 하는 동작  : "dropping/releasing reference"

object마다 함수 이름이 다른데 sock : sock_hold()/put(), file : fget()/fput(), files_struct : get/put_files_struct()

 

 

 

 

 

 

 

'컴퓨터 프로그래밍' 카테고리의 다른 글

CVE-11176(3)  (0) 2019.03.31
CVE-11176(2)  (0) 2019.03.31
exe파일이란 무엇인가요?  (0) 2018.12.16
object 파일이란  (0) 2018.12.16
virtual address(가상주소)와 physical address(실제주소)  (1) 2018.09.29