상세 컨텐츠

본문 제목

3. CPU 예측이 가져올 수 있는 문제(보안사고)/프로세스와 스레드

CS전공 지식/1. OS

by 본투비곰손 2023. 6. 26. 23:11

본문

728x90

CPU안에는 ‘레지스터’라는 것이 있다. CPU는 일을 할 때 임시로 숫자를 여기에 적어둔다.

  1. 각종 프로그램들은 RAM에 자신이 필요한 정보를 적어둔다.
  2. 캐시는 RAM에 비해서 빠르게 정보를 넣었다 뺐다 할 수 있다.

시스템에서 자꾸 검색하면 해당 정보를 Cache를 하게 된다.

CPU 멜트다운 취약점

기술적으로 완벽한 설명을 하기 위해서는 시스템의 비트 상황이나 캐시구조 등 하드웨어의 세부사항까지 이해해야 한다. 다만 진짜 자세히 설명한다면 문서 하나로는 다 끝나지 않을 정도로 방대한 내용이 되므로 여기에서는 대략적인 개요만을 설명한다. 캐시와 타입캐스팅을 어떻게 활용하는지 확인하는 용도로 사용하면 적절하며 그 이상으로 정확하지는 않다. 이 설명은 OS와 메모리 구조, CPU 파이프라인에 대한 전공지식이 있다는 것을 전제로 한다.

공격 프로그램은 커널의 특정 메모리 주소를 읽기 위해 다음의 변수 및 배열을 설정한다.

  1. ka: 값을 읽어올 커널의 메모리 주소.
  2. ua1: L1 캐시 크기 만큼의 배열
  3. ua2: 256 크기 만큼의 배열.

코드의 실행순서는 다음과 같다.
A. ka에 원하는 주소를 세팅한다.
B. ua1의 모든 값을 읽는다.
C. ka의 값을 읽어서 레지스터 al에 저장한다.
D. ua2[al]의 값을 읽는다.
E. 아무 것도 하지 않는 명령어를 적당히 깔아둔다.
F. ua2에서 캐시로 값이 들어온 주소를 알아낸다.

위 코드의 실행 순서를 바탕으로 자세한 동작 원리는 다음과 같다.

첫째. B에서 ua1의 값을 모두 읽었기에, L1 캐시는 ua1의 정보로 가득 차 있다. 따라서 이 시점에서 ua2의 정보는 캐시에 없다는 것이 보장된다.
둘째. C는 항상 실행이 취소된다. 사용자 프로세스가 커널 정보를 읽는 것이기 때문에 보호비트가 발동된다.
셋째. C가 실행이 취소되기 전, C, D는 파이프라인의 execute state를 지난다. 즉, CPU는 ua2[al]의 값을 읽는다. 단지 commit 하지 않을 뿐이다.
넷째. 컴퓨터에서 array에 접근할 때에는 보통 간접적인 방식으로 접근한다. C언어에서 tmp_arr[10]이라고 적는 경우를 생각해 보자. 실제로는 tmp_arr이 가리키는 주소에서 10을 더하는 방식으로 주소를 계산한다. ua2[al]을 읽을 때에도 마찬가지로 계산한다.
다섯째. D는 execute state를 지났으므로, CPU는 실제로 ua2[al]을 읽는다. 따라서 이 값이 ua2 배열 중 유일하게 캐시에 올라와 있다. al이 97 즉, 'a'라면 ua2[97]만 캐시에 올라와 있고 나머지는 캐시에 없다.
여섯째. F단계에서 해커는 ua2[0]~ua2[255]까지를 랜덤한 순서로 전부 읽어본다. 읽을 때마다 읽기 시간을 측정한다. 다른 모든 값은 캐시에 없으니 읽는 데 시간이 걸리지만, ua2[97]은 캐시에 올라와 있으니 읽기 시간이 빠르다. 이를 근거로 ka값이 가리키는 주소에 97이 들어있다는 것을 알 수 있다.
일곱째. E에서 아무 것도 하지 않는 명령어를 적당히 깔아두는 이유는 F가 실행취소되거나 재시도 되는 것을 막기 위한 의도적인 파이프라인 버블이다.

출처: 나무위키

동일 PC를 사용하는 가상머신의CPU인스트럭션으로 다른 가상머신들의 커널메모리를 읽는것!!

프로세스와 스레드

Process - 관리(OS)의 단위(연산)로 실행의 흐름(Thread)을 가지고 있다.

Thread - Process가 존재하면 반드시 Thread도 1 개 존재한다. CPU 주로 사용

한 Process에 n개의 흐름(실행)을 가지게 되면 동시에 각자 실행 되는데 이를 멀티 쓰레딩이라고 한다.

(멀티스레딩이 발생되면 동시성, 동기화가 일어난다.)

프로세스가 여러개면 멀티태스킹(Multi tasking)이라고 한다.

  • 프로세스는 최소 1개의 쓰레드를 가지고 있다.
  • OS는 가상메모리(제한된 공간)를 프로세스에 할당한다.
  • 프로세스(Process)에 속한 모든 스레드(Thread)는 프로세스에 할당된 가상 메모리(Virtual Memory 1차 메모리-RAM+2차 메모리-HDD)의 공간으로 제한 된다.

스레드(Thread)에 할당된 메모리(Thread Local Storage)는 Stack 메모리

스레드(Thread)가 사용 할 수 있는 메모리는 heap 메모리

운영체제(OS)는 프로세스 관리 블록(PCB)와 스레드 관리 블록(TCB)이 있다.

PCB안 정보

  • PID : ID값
  • Text Session메모리의 정보

프로세스는 한정된 CPU를 시분할사용 한다.

Virtual Memory 구조

  • Stack 영역 - 지역변수 사용
  • Heap 영역 - 인스턴스 변수
  • Text Session(Code 저장)
  • Static
    • 읽기전용 : 문자열
    • 읽기 쓰기 가능 : 전역 변수

설치된 프로그램을 메모리에 올린다(인스턴스화 한다.) = 실행 한다. = 프로그램이 프로세스가 되는 과정

728x90

관련글 더보기