반응형

* 부호버그

부호가 없는 정수를 부호가 있는 정수로 바꾸거나

부호가 있는 정수를 부호가 없는 정수로 바꾸려할 때 발생한다.

 

예시)

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
	char buf[20];
	int i = atoi(argv[1]);
    //atoi는 아스키를 int로 바꾸어준다.
	
    memcpy (buf, argv[2], i*sizeof(int));
	
    printf("the number is:%d=%d\n",i, i*sizeof(int));
    printf("the buffer is: %s\n",buf);
}

 

-----------------------------------------------------------------------------------------

changmin@ubuntu:~/Documents$ ./test3 1 AAAA
the number is:1=4
the buffer is: AAAA�vbV

=> 1 AAAA를 입력하면, 

i는 1이되고 i*sizeof(int)는 4가된다.

"�vbV"는 memcpy가 null을 추가하지 않고 복사하기때문에 그런것같다.

-----------------------------------------------------------------------------------------
changmin@ubuntu:~/Documents$ ./test3 111 AAAA
the number is:111=444
the buffer is: AAAA
*** stack smashing detected ***: <unknown> terminated

Aborted (core dumped) 

111 AAAA를 입력하면

i는 111이되고 i*sizeof(int)는 444가된다.

따라서 argv[2]에서 444만큼 가져와 buf 에 copy하려한다.


---------------------------------------------------------------------------------------
changmin@ubuntu:~/Documents$ ./test3 -1 AAAA
Segmentation fault (core dumped)

-1 AAAA를 입력하면 

i는 -1이되고 i*sizeof(int)는 -4가된다.

memcpy 원형을 보면

#include <string.h>
void *memcpy(void *dest, const void *src, size_t num);

인데 size_t는 unsigned int 타입이다.

따라서 -4가 아니라 언더플로우가 일어나 엄청나게 큰 수로 바뀌게 된다.

따라서 버퍼 오버플로우가 발생한다.

 

gdb를 사용하여 테스트해보면

(위와 같은 코드이다.)

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
	char buf[20];
	int i = atoi(argv[1]);
    //atoi는 아스키를 int로 바꾸어준다.
	
    memcpy (buf, argv[2], i*sizeof(int));
	
    printf("the number is:%d=%d\n",i, i*sizeof(int));
    printf("the buffer is: %s\n",buf);
}

(파이썬을 설치하지 않아 A 44번 B 4번을 일일이 입력했다...)

(gdb) r 12 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBB
Starting program: /home/changmin/Documents/test3gdb 12 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBB
the number is:12=48
the buffer is: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBB
*** stack smashing detected ***: <unknown> terminated

Program received signal SIGABRT, Aborted.
0xf7fd5059 in __kernel_vsyscall ()

 

=> argv[0]에 12, argv[1]에 A*44+B*4를 입력하였다.

=>buf의 크기는 20인데 memcpy에서 12*4(i*sizeof(int))를 하여 48크기만큼 memcpy하려하여 버퍼가 넘치는 버퍼 오버플로우가 발생한다.

 

이번엔 argv[0]에 -1073741810을 입력하였다.

(gdb) r -1073741810 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBB
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /home/changmin/Documents/test3gdb -1073741810 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBB
the number is:-1073741810=56
the buffer is: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBB
*** stack smashing detected ***: <unknown> terminated

Program received signal SIGABRT, Aborted.
0xf7fd5059 in __kernel_vsyscall ()

 

=> -1073741810 * 4 (i*sizeof(int))값이 memcpy의 인자로 들어가는데 usigned int로 바뀌면서 값이 56으로 변환이 된다. 따라서 버퍼의 크기 20을 넘게된다.

 

* CWE-195의 부호변환 에러

=> readdata함수는 unsigend int형을 반환한다.

=> 함수 안에서 if문을 보면, 조건 만족시 amount에 -1을 넣고 그 값을 반환한다.

=> usigned int 형으로 바뀌어 반환되므로 언더플로우가 발생한다.

 

 

 

=> 이 경우 또한 usigned  int형을 반환하는데 amount가 음수값이 된다면 언더플로우가 발생할 것이다.

 

 

=> if문에서 numHeaders가 100보다 큰지 체크한다.

=> 하지만 int형이 numHeaders가 INT_MAX보다 큰값이 된다면 오버플로우로 음수가 될 것이다.

=> 따라서 ExitError를 실행하지 않고 malloc을 한다.

=> 하지만 malloc에서 unsigned int형으로 바뀌면서 언더 플로우가 발생된다.

 

int copy_something(char *buf, int len){
	char kbuf[800];
	
    if(len > sizeof(kbuf)){ /* [1] */
		return -1;
	}
	
    return memcpy (kbuf, buf, len); /* [2] */
}

=> if문에서 len의 값이 음수라면 return의 memcpy에서 언더플로우가 발생된다.

 

 

=> short형으로 선언된 len이 음수라면 if문을 만족하여 memcpy시 언더플로우를 일으키게된다.

=>(len이 SHORT_MAX보다 크면 오버플로우로 음수가 될 것이다.)

 

int table[800];

int insert_in_table (int val, int pos) {
	if ( pos > sizeof(table) / sizeof(int) ) {
		return -1;
	}

	table[pos] = val;
	return 0;
}

 일이 벌어

만약 pos값이 0x8000 0000(0x8 = 1000(2))이거나 0x9000 0000(1001(2))이면

최상위 비트가 1이므로 음수가 된다. 

따라서 table[음수값] =val; 이 되어버린다.

 

 

 

=> 위와 같은 일이 벌어지면 무결성이 깨지게 된다.

 

 

 

728x90
반응형

'공부 > 보안' 카테고리의 다른 글

MyEtherWallet 해킹사건 분석  (0) 2021.04.18
보안개론 정리(2) - software 취약점  (0) 2021.04.16
Int Overflow/Underflow(1) - 예시, 예방법  (0) 2021.04.15
보안개론 정리(1)  (0) 2021.04.13
Role-Based Access Control (RBAC)  (0) 2020.12.08
블로그 이미지

아상관없어

,
반응형

* 64 bit 구조에서 32 bit 프로그램으로 컴파일 하는 법

gcc -m32 -o test test.c

-m32 옵션 컴파일시 bits/libc-header-start.h: No such file or directory 오류

=> sudo apt-get install gcc-multilib g++-multilib

 

* 형식 지정자

%d => 부호가 있는 정수, decimal signed int

%u => 부호가 없는 정수, unsigned int

%i => any integer (decimal, octal, hexadecimal)

 

%hd => half decimal, decimal의 반틈이므로 2byte, short 이다.

%hu => unsigned short(unsigned int의 half)

 

%hhd => char (half의 half이므로 8bit=1byte), 8비트 단위의 부호가 있는 정수 출력

%hhu => unsigned char, 8비트 크기의 부호가 없는 정수 출력

 

%ld => decimal signed long

%lu => unsigned long

 

%o => octal integer, 8진수

%x => hexadecimal integer, 16진수

 

 

* printf (“%d, %u, %hd, %hu, %c\n”, -1, -1, -1, -1, -1);

changmin@ubuntu:~/Documents$ ./test
-1, 4294967295, -1, 65535, � 

 

%d => 부호가 있는 정수이므로 -1이 출력

%u => 부호가 없는 정수이므로 언더플로우 발생하여 큰수가 됨

%hd => 2byte, 부호가 있는 short이므로 -1 출력

%hu => 2byte, 부호가 없는 short이므로 언더플로우 발생하여 unsigned short가 표현할 수 있는 최대 수가 됨

 

 

* 오버플로우 or wraparound

어떤 정수 값이 지정된 16bit 크기에 저장될 수 없게 커지게 되면 overflow가 발생한다.

(매우작은수가 되거나 음수가 되버린다. 0이 되버리기도 한다 (표현할 수 없는 상위 비트는 날려버리기 때문))

 

오버 프로우가 발생하면 자원관리와 실행흐름에 문제가 생긴다.

결과적으로 약점이 생기고 C.I.A(기밀성, 무결성, 가용성)이 깨진다.

 

가용성 : 오버플로우로 인해서 예측하지 못하는 행동으로 연결될 수 있다(crash 유발가능). loop에서 인덱스로 사용될 경우 무한루프가 될 수도 있다. => DoS유발가능

무결성 : 데이터에서 중요한 값이 손상될 수 있다. 또한 buffer overflow를 일으킬 수 있다.(배열의 인덱스가 넘친다거나), 메모리 손상 유발 가능

기밀성, 접근제어 : 약점이 buffer overflow를 유발하고 그로인해 임의의 코드를 실행할 수 있게 된다. 따라서 보안 정책의 범위를 벗어나게 된다.

 

integer 오버플로우는 직접적으로 실행흐름을 바꾸거나 악용될 가능성은 적다.

하지만, 어떤 경우는 heap overflow 즉, 버퍼 오버플로우를 유발 할 수 있다. 

따라서 임의의 코드를 실행할 수 있게 되는 더 나쁜 상황이 된다.

 

오버플로우 예시)

#include<stdio.h>
#include<stdio.h>

void main(void){
	unsigend short us = 65535; //unsigned short max값
    short ss = 32767; // short max값
    
    unsigned char uc = 255; //max
    signed char sc = 127; //max
    
   printf("unsigned_short = %d (%u), signed_short = %d (%u)\n", us, us, ss, ss);
   //unsigned short= 65535 (65535), signed short = 32767 (32767)
   
   //%d, %u 는 signed int, unsigned int범위임으로 short 정상출력됨
   
   printf("unsigned_char = %d (%u), signed_char = %d (%u)\n\n", uc, uc, sc, sc);
   //unsigned char = 255 (255), signed char = 127 (127)
   
   //%d, %u 는 signed int, unsigned int범위임으로 char 정상출력됨
   
   printf("unsigned_short = %hd, %hu, %hhd, %hhu\n", us, us, us, us);
   //unsigned short= -1, 65535, -1, 255
   
   //%hd는 signed int의 절반이므로 2byte, short범위이다. ->
   //->65535가 1111 1111(2)이므로 2의 보수표현으로 생각하여 -1로 출력됨
   
   //%hu는 unsigned int의 절반이므로 정상 출력된다.
   
   //%hhd는 signed int의 절반의 절반이므로 1byte범위이다. ->
   //->16bit를 8bit로 출력하므로 앞으 8bit는 잘리고 1111 1111 1111 1111(2)->
   //->1111 1111(2), 위와 동일하게 2의 보수 표현으로 생각하여 -1이 출력됨
   
   //%hhu는 unsigned int의 절반의 절반이므로 정상 출력된다.
   
   printf("unsigned_short+1 = %hd, %hu, %hhd, %hhu\n", us+1, us+1, us+1, us+1);
   //unsigned short+1 = 0, 0, 0, 0
   
   //unsigned short의 최대값에 1을 더하면 short의 범위를 벗어나게 된다.
   //16bit를 넘어서서 할당된 16bit로 표현이 불가하여 0으로 출력된다.
   
   printf("signed_short = %hd, %hu, %hhd, %hhu\n\n", ss, ss, ss, ss);
   //signed short = 32767, 32767, -1, 255
   
   //%hhd는 signed int의 절반의 절반이므로 1byte(8bit), ->
   //->short(16bit)인데 8bit로 출력하므로 위와 동일하게 앞 8비트가 잘리고 2의 보수표현으로 -1
   
   printf("unsigned_char = %hd, %hu, %hhd, %hhu\n", uc, uc, uc, uc);
   //unsigned char = 255, 255, -1, 255
   
   //%hhd는 부호가 있는 8bit이고, 부호가 없는 8bit를 출력할때 2의 보수 표현으로 -1이 출력
   
   printf("unsigned_char+1 = %hd, %hu, %hhd, %hhu\n", uc+1, uc+1, uc+1, uc+1);
   //unsigned char+1 = 256, 256, 0, 0
   
   //%hhd, %hhu 둘다 8bit인데 unsigned_char+1이 되면 1 0000 0000(2)가 되므로
   // 0000 0000(2)로 0이된다.

}

 

* usigned와 signed 차이

2의 보수를 취하여 최상위 비트가 1이면 음수로 취급한다.

ex) 2+ (-3)

3 => 0011

1의 보수 => 1100

2의 보수 => 1101

따라서 0010 + 1101 = 1111

1111은 -1이된다.

 

8bit의 경우

0111 1111(2) ~ 1000 0000(2)가 범위가 된다 (1111 1111(2) 는 -1 => 위 원형 그림 참고)

127 ~ (-128)

 

- 2의 보수 덧셈

(-4) + (-1)

1100 + 1111 => 1 1011 => 1011 = -5

(-4) + (+4)

1100 + 0100 => 1 0000 = 0

 

(+5) + (+4)

0101 + 0100 => 1001 (-7) =오버플로우발생

(-7) + (-6)

1001 + 1010 => 1 0011 => 0011 (3)= 오버플로우 발생

 

 

* Overflow / Underflow

overflow : INT_MAX = 2147483647 (0X 7FFF FFFF), 값이 INT_MAX보다 크면 segmentation fault가 유발된다.

underflow : INT_MIN = 0x 8000 000 (0x8 = 1000(2)), 값이 INT_MIN보다 작으면 segmentation fault

 

INT_MAX = 2174483647(0x7FFF FFFF)

INT_MIN = -2147483648(0x8000 0000)

UINT_MAX = 4294967295(0xFFFF FFFF)

 

오버플로우 예시) 

#include <stdio.h>
int main(void){
	unsigned int num = 0xffffffff;
    
	printf("num = %u (0x%x)\n", num, num);
	printf("num + 1 = 0x%x\n", num + 1);
    
	return 0;
}


/* EOF */
The output of this program looks
like this:
num = 4294967295 (0xffffffff)
num + 1 = 0x0

num은 INT_MAX이다. 

%u = unsigned int이므로 num = 4294967295 (0xffffffff)

num+1은 INT_MAX 범위를 벗어나므로 0x 1 0000 0000 => 0x 0000 0000 => 0x0이 된다.

 

#include <stdio.h>
int main(void) {
	int n;
	n = 0x7fffffff;
	
    printf(“n = %d (0x%x)\n", n, n);
	printf(“n + 1 = %d (0x%x)\n", n + 1 , n + 1);
	
    return 0;
}

/* EOF */
The output of which is:
n = 2147483647 (0x7fffffff)
n + 1 = -2147483648 (0x80000000)

n은  signed int에서 MAX 양수이다.

%d => 2147483647 (0x7fffffff)

n + 1 => 0x8000 0000가 된다. 이진수로 변환하면 1000 0000 0000 0000 0000 0000 0000 0000(2)이므로 

2의 보수 표현으로 -2147483648이 된다.

 

- 더하기/빼기/곱에서도 발생함

#include <limits.h>

 unsigned int ui1, ui2 , usum ;

/∗ Initialize ui1 and ui2 ∗/

 usum = ui1 + ui2 ;
 
/* ui1 = 0x7FFFFFF2
 ui2 = 0x6FFFAAAA */

0x7FFF FFF2 + 0x6FFF AAAA를 덧셈하면 INT범위를 벗어나 오버플로우 발생

signed int si1, si2, result;

 /* initialize si1 and si2 */

 result = si1 – si2;
 
 /* si1 = 0xFFFFBEEF
 si2 = 0x6ABCCAFE */

0xFFFF BEEF - 0x6ABC CAFE를 하면 음수 - (양수)로 언더플로우가 발생한다.

(0xF = 1111(2) = 15)

signed int si1 , si2 , result;

/∗ Initialize si1 and si2 ∗/

result = si1 * si2 ; 

곱의 경우도 오버플로우가 발생한다

 

#include <limits.h>
	int i;
	unsigned int j;
	
    i = INT_MAX; // 2,147,483,647
	i++;
	
    printf (“i = %d \n”, i);
	
    j = UINT_MAX; // 4,294,967,295
	j++;
	
    printf (“j = %u \n”, j);

출력

i = -2,147,483,648

j = 0

i=INT_MAX의 경우 +1을 하여 오버플로우

j=UINT_MAX의 경우 +1을 하여 오버플로우로 0이됨

 

#include <stdio.h>
	int main(void){
	int l, x;
    
	l = 0x40000000;
	printf("l = %d (0x%x)\n", l, l);
    
	x = l + 0xc0000000;
	printf("l + 0xc0000000 = %d (0x%x)\n", x, x);
    
	x = l * 0x4;
	printf("l * 0x4 = %d (0x%x)\n", x, x);
    
    x = l - 0xffffffff;
	printf("l - 0xffffffff = %d (0x%x)\n", x, x);
    
	return 0;
}

l = 1073741824 (0x4000 0000)

l + 0xc000 0000 = 0 (0x0)

(0xc = 12 = 1100(2) 따라서 최상위 비트가 1이므로 음수임)

 

l * 0x4 = 0 (0x0)

0x4를 곱하면 큰수가 됨

 

l - 0xffffffff = 1073741825 (0x4000 0001)

(0xFFFF FFFF = -1)이므로 +1이 됨

 

 

 

 

언더 플로우 예시)

i = signed int, j = unsigned int

i = INT_MIN;
i--;
printf("i = %d\n", i);

j = 0;
j--;
printf("j = %u\n", j);

INT_MIN에서 1을 빼면 언더플로우로 INT_MAX가 된다.

0x80000000 + 0x7fffffff (-1) = 0x7ffff ffff

( 0x0000 0001 = 1 -> 0xFFFF FFFE (1의 보수)-> 0xFFFF FFFF(2의보수) =-1)

 

CWE-190의 오버플로우 예시)

table_ptr = (img_t*)malloc(sizeof(img_t)*num_imgs);

malloc은 오버플로우 발생 가능성이 있다.

sizeof(img_t)*num_imgs => img_t 구조체의 크기는 10kb이고 num_imgs는 부호가 있는 정수이다.

num_imgs가 큰 수일 경우, 이 둘을 곱하면 오버플로우가 발생할 수 있다. 

 

xmalloc => malloc을 개선함(요청된 메모리의 크기를 할당할 수 없으면 에러를 표시하고 프로그램을 종료함)

xmalloc(nresp*sizeof(char*)) 

만약 nresp 가 1,073,741,284이면

1,073,741,284 * 4 = 4,294,967,296로 

UINT_MAX = 4,294,967,295, 최대범위를 벗어나게 된다.

따라서 오버플로우로 response는 0이 되고,

밑의 for문은 4,294,967,296번 루트를 돌고

response[i] = packet_get_string(NULL)은 실제 할당받은 공간은 작은데 계속 할당을 받게 된다.

while loop에서 bytesRec을 체크하는데

byteRec은 byteRec에 getFromInput(buf + bytesRec)을 더한 값이다.

만약 byteRec이 오버플로우가 일어나 작은 값이 된다면 문제가 발생한다.

 

int myfunction(int *array, int len) {
	int *myarray, i;
	
    myarray = malloc(len * sizeof(int)); /* [1] */
	
    if(myarray == NULL){
		return -1;
	}
    
	for(i = 0; i < len; i++) { /* [2] */
		myarray[i] = array[i];
	}
    
	return myarray;
}

[1]경우 len이 큰 경우 오버플로우가 일어나 작은값이 malloc 될 수 있다.

따라서 [2]에서 len은 크지만 myarray가 작으므로 문제가 발생한다. 

 

int catvars(char *buf1, char *buf2, unsigned int len1, unsigned int len2) {
	char mybuf[256];

	if ( (len1 + len2) > 256 ) { /* [3] */
		return -1;
	}
    
    memcpy(mybuf, buf1, len1); /* [4] */
    
    memcpy(mybuf + len1, buf2, len2);

	do_some_stuff(mybuf);
	
    return 0;
}

[3]경우 len1 + len2가 값이 커서 오버플로우가 발생하면 if문을 통과하고 밑의 memcpy를 수행한다.

buf1에서 len1크기만큼 mybuf로 복사하므로 버퍼 오버플로우가 발생할 수 있다.

첫번째 memcpy를 통과하더라도 두번째 memcpy에서도 위에서 설명한 것처럼 문제가 발생할 수 있다.

만약 len1이 0x0000 0002이고 len2가 0xffff ffff라면 

첫번째 memcpy는 통과하지만 두번째 memcpy에선 len2가 unsigned int로 바뀌면서 큰값이 되어 버퍼 오버플로우가 발생할 수 있다.

* Integer Overflow를 막는 방법 예시

(자바 코드)

int sum(int a, int b) {
	int c = a + b;

	if (a > 0 && b > 0 && c < 0)
		throw new MyOverfowException(a, b);
	return c;
}


int prod(int a, int b) {
	int c = a * b;
	
   	if (a > 0 && b > 0 && c < 0)
		throw new MyOverfowException(a, b);
	return c;
}

c = a+b 연산을 한 후

a>0, b>0이고 c<0이면 오버플로우가 발생한 경우므로 예외 처리한다.

밑의 곱의 경우도 마찬가지이다.

 

static void update_value(char op) {
	if (op == '+') {
		if (value + 1 > value) value ++;
		else printf (“too big! \n”);
	} else {
		if (value - 1 < value) value --;
		else printf(“too small! \n”);
	}
}

int addOvf(int* result, int a, int b) {
	if( a > INT_MAX - b) return -1;
	else {
		*result = a + b;
		return 0;
	}
} 

-덧셈 연산을 한 후 오버플로우가 발생하는지 체크한다.

if (value + 1 > value)

     value ++; 

 

-덧셈 연산전 오버플로우가 발생하는지 확인한다.

a > INT_MAX - b 이면 오버플로우이다.

(max값에서 b를 뺀값보다 a가 크다면 a와 b를 더하면 max값 보다 클것이다.

즉, 현실세계에서 보면  a+b > INT_MAX 이므로, 합이 MAX값을 넘어서 컴퓨터에선 오버플로우가 발생)

(INT_MAX는 limit.h에 선언되어 있다.)

if( a > INT_MAX - b)

     return -1;

 

다른 방법으로 SW개발 전 단계에서 고려하는 것이다.

-요구사항 분석 : 안전한 언어나 안전한 컴파일러를 사용한다.

-설계 : 안전한 라이브러리나 프레임워크를 사용한다(SafeInt or IntegerLib)

-구현 : 사용하는 범수가 범위내에 있는지 확인한다. 최대값과 최소값 범위를 체크한다.

 

#include <stdio.h> /* ex2.c ʹ loss of precision */
int main(void) {
	int m;
	short s;
	char c;
    
	m = 0xcafe76ef;
	s = m;
	c = m;
    
	printf("l = 0x%x (%d bits)\n", m, sizeof(m) * 8);
   	printf("s = 0x%x (%d bits)\n", s, sizeof(s) * 8);
	printf("c = 0x%x (%d bits)\n", c, sizeof(c) * 8);
    
	return 0;
}

changmin@ubuntu:~/Desktop/c$ ./aaa 
l = 0xcafe76ef (32 bits) 
s = 0x76ef (16 bits) 
c = 0xffffffef (8 bits) 

s는 16bit=2byte만을 표현할 수 있고, 0xcafe 76ef가 4byte=32bit이므로  상단 16bit가 날라가고 0x76ef가 남는다.

0x7 => 0111(2)이므로 최상단 비트가 1이 아니여서 양수이다. 따라서 앞자리는 모두 0이된다. (%x시 32비트로 출력이된다. => 이부분은 아직 잘 이해하지 못하엿다....)

따라서 0x000076ef

 

c는 8bit=1byte를 표현할 수 있으므로 0xef만 남게된다.

0xe = 14 = 1110(2)로 최상단 비트가 1이므로 음수이다. 

0xe는 음수임을 나타내므로 결과 값의 나머지 앞 부분도 음수 표시위해 1, 즉 모두 f가 된다.

 

728x90
반응형

'공부 > 보안' 카테고리의 다른 글

보안개론 정리(2) - software 취약점  (0) 2021.04.16
INT OVERFLOW/UNDERFLOW (2) - 부호버그(Signedness Bugs)  (0) 2021.04.15
보안개론 정리(1)  (0) 2021.04.13
Role-Based Access Control (RBAC)  (0) 2020.12.08
Access Control MAC (2)  (0) 2020.12.03
블로그 이미지

아상관없어

,
반응형

* CVS

반점을 구분한 값이라는 뜻

파일의 내용은 데이터가 , 으로 구분된 형식의 문자만으로 이루어져있다.

EX) 

1, A, 55

2, B, 26

3, C, 79

와 같이 데이터는 반점으로 구분되고 한행이 끝날때마다 줄바꿈을 한다.

 

 

 

* 파일 가져오기(LOAD DATA INFILE)

-----------------------------------------------------------------------------------------------------------------------------------

외부 파일을 읽기 위해선 시스템변수 변수를 변경해야한다.

SHOW variables LIKE 'local%';

SET GLOBAL loval_infile = 1;

 

"The MySQL server is running with the --secure-file-priv option so it cannot execute this statement"가 뜰 경우

sssunho.tistory.com/56

 

[MySQL] Load Data 시도 중 secure_file_priv 문제 직면

Load Data를 시도하던 중, The MySQL server is running with the --secure-file-priv option so it cannot execute this statement 문제에 직면하였다. 1. MySQL에 접속하여 변수 상태를 확인한다 mysql> SELECT..

sssunho.tistory.com

-----------------------------------------------------------------------------------------------------------------------------------

LOAD DATA INFILE 파일이름 INTO TABLE 테이블이름 옵션설정;

 

CVS외의 텍스트 파일도 읽을 수 있으며, 데이터간의 구분문자와 줄바꿈문자, ~~행부터 읽기 실행 등 읽어들일 데이터의 형식을 지정할 수 있다.

 

FILEDS TERMINATED BY 구분문자 =>기본설정은 \t (탭)

LINES TERMINATED BY 줄바꿈문자 => 기본설정 \n (줄바꿈)

IGNORE 처음에_건너뛸_행 LINES => 기본설정은 0

 

EX)

LOAD DATA INFILE 'C:\test.csv' INTO TABLE tb1N FIELDS

TERMINATED BY ',';

 

tb1N 테이블에 레코드가 추가됨

 

 

 

* 데이터를 텍스트 파일에 내보내기 (export)

내보낸 파일은 다른 데이터베이스나 시스템에서 사용하거나 백업용으로 사용한다.

 

SELECT * INTO OUTFILE '파일이름' 옵션설정 FROM 테이블 이름;

 

옵션 설정은 내보내기할 텍스트 파일의 형식을 지정한다.

ex)

SELECT * INTO OUTFILE 'C:\datat\out.csv' FIELDS TERMINAGETD BY ',' FROM tb1;

 

 

* 데이터베이스 백업/복원

-백업

dump : 데이터베이스의 모든 내용을 추출함

mysqldump 명령을 사용한다.

덤프로 출력된 정보는 일반 sql문으로 되어있는 텍스트이며, 데이터베이스의 모든 정보를 가져올 수 있다.

 

mysqldump -u 사용자이름 -p비밀번호 데이터베이스이름 > 출력파일이름

ex)

mysqldump -u root -p1234 db1 > db1_out.txt

 

-복원

mysqladmin -u 사용자이름 -p비밀번호 데이터베이스이름 < 백업파일이름

ex)

mysqladmin -u root -p1234 db2 < db1_out.txt

 

728x90
반응형

'공부 > 데이터베이스' 카테고리의 다른 글

데이터베이스 예제 2  (0) 2021.04.20
데이터베이스 예제 1  (0) 2021.04.19
정리  (0) 2021.04.19
트랜젝션  (0) 2021.04.14
SQL JOIN  (0) 2021.03.30
블로그 이미지

아상관없어

,
반응형

* 저장엔진 

  접속기능, SQL문의 내용을 사전에 조사하는 기능 => 상위부분

  상위 부분의 지시를 받아 실제로 검색이나 파일을 조작하는 기능 => 하위 부분 = 저장엔진

  테이블 별로 저장엔진을 지정할 수 있다.

 - 저장엔진확인법

  SHOW CREATE TABLE 테이블이름;

 ENGINE=InnoDB 임을 알 수 있다.

  - 저장엔진 변경

    ALTER TABLE 테이블 이름 ENGINE=엔진이름;

 

 

 

* 트랜젝션

A의 계좌에서 B의 계좌로 10만원을 송금

1. A의 계좌에서 10만원 뺌

2. B의 계좌에 10만원 넣음

 

만약 1번 시점에 오류가 발생하면, 2번이 실행되지 않고 

A의 계좌에서 10만원만 빠지고 그 돈은 사라질 것이다.

따라서 1,2번을 묶어서 하나로 처리한다. 

 

위와 같이 여러 단계의 처리를 하나의 처리처럼 다루는 것이 트랜젝션이다.

트랜젝션의 실행결과를 데이터베이스에 반영하는 것이 Commit이며 

반영시키지않고 되돌리는 것을 RollBack이라 한다.

 

 - 트랜젝션 시작

  START TRANSACTION이나 BEGIN, BEGIN WORK

트랜젝션을 시작하고 tb테이블을 삭제하였다.

이 시점에 테이블의 일부기능에 lock이 걸린다. 

따라서 다른 세션에서 INSERT 등의 명령을 실행할 수 없다.

트랜젝션을 시작한 콘솔창에서 COMMIT이나 ROLLBACK을 해야 다른 명령을 실행 할 수 있다.

ROLLBACK을 하면 삭제된 테이블이 다시 복구되는 것을 알 수 있다.

 

- 자동 커밋 기능

 일반적으로 MYSQL에서 명령을 실행하면 그대로 반영된다.

 명령을 실행하면 그대로 반영되는 기능이 자동 커밋기능이다.

 자동 커밋 기능의 기본 설정은 ON이다.

 자동 커밋 기능을 끄려면

 SET AUTOCOMMIT=0;

 으로 하면 된다.

 

 

 자동 커밋 기능을 끄면 ROLLBACK을 사용할 수 있다.

 SET AUTOCOMMIT=1;

을 하면 다시 자동커밋 기능을 켤 수 있다.

 

자동커밋 기능이 설정되어있는지 확인하려면

SELECT @@AUTOCOMMIT;

을 하면 된다.

0이면 OFF, 1이면 ON

 

트랜젝션을 COMMIT하지 않고 콘솔창을 닫을 경우엔 

트렌젝션을 시작하고 입력한 명령들은 취소된다.

즉, 커밋을 하지 않고 종료하면 그 내용은 파기된다.

 

 

 

728x90
반응형

'공부 > 데이터베이스' 카테고리의 다른 글

데이터베이스 예제 2  (0) 2021.04.20
데이터베이스 예제 1  (0) 2021.04.19
정리  (0) 2021.04.19
파일 사용  (0) 2021.04.14
SQL JOIN  (0) 2021.03.30
블로그 이미지

아상관없어

,
반응형

컴퓨터의 핵심 : 데이터나 정보를 저장하고 처리하는 전자적인 기기

 

  • DATA
    • Raw Data = 가공되지 않음
    • Unorganized = 조직화되지 않음
    • Unprocessed = 처리되지 않음
    • Chaotic or Unsorted = 혼란한 상태
    • Input to a Process = 어떤 Process의 입력

 

  • Information
    • Useful & Relevant = 유익하고 적절한 형태로 되어있음
    • Organized = 조직화됨
    • Processed = 처리되어있음
    • Ordered or Sorted = 정렬되어있음
    • Output of a Process = 어떤 프로세스의 출력

 

많은 조직에서 정보와 데이터는 중요한 자산이다!!

 

  • Information Technology : 데이터나 정보를 처리하거나 배포하기위해서 컴퓨터 시스템이나 네트워크를 개발하거나 사용하는 기술

 

  • SW Engineer
    컴퓨터 소프트웨어에 대해서 설계하고 개발하고 테스트, 유지보수하는 일을 함, 이러한 원칙들을 적용함
    전체 과정에 참여 => 주로 팀단위 활동
    HW 시스템의 구성요소를 알 필요가 있음 => ex) hdd인지 ssd인지 ...등
    SW 개발시 필요한 도구를 만듦
    큰 규모에 관련된 이슈를 해결할 필요가 있음 => 전체과정을 관여하기 때문에

 

  • SW Developer
    다양한 유형의 컴퓨터에 소프트웨어를 빌드함
    전체 과정중에서 한 부분에서 관여함(주로 구현부분) => 주로 개별활동
    완전한 프로그램을 작성
    만들어진 도구를 사용(편집기 컴파일러 디버거...등)
    제한된 규모에 관여를 함 => 한 부분에 관여하므로

 

  • Information System
    Hardware, Software, Networks, Data, People, Processes의 집합
    <-> Information Technoloy : HW, SW, Networks, Data

 

  • Data를 가공하면 정보가됨 => 회사의 절차나 정책은 정보를 어떻게 처리, 배포할것인지 관련됨 따라서 데이터와 정보가 중요함

 

  • Security??
    위협, 위험, 취약점이 없는 안전한 상태, 공격자가 존재하는 상황에서도 원하는 특성을 만족하는 것.

    • Interception : 중간에 가로챔(도청)
    • Interruption : 중간에 막음
    • Modification : 중간에 데이터를 변조함
    • Fabrication : 제 3자가 송신자인척 보냄 (위조) => 인증이 필요 => id/pw, 공인인증서, 생채 인증 등..
    • 기밀성 : 권한을 가진 사람만 정보 접근 => 도청 방지 => 비인가적인 읽기 막아야
    • 무결성 : 인가된 사람만 수정가능, 정보의 출발지 확인(위조 방지) => 비인가적인 쓰기 막아야 =>정보의 정확성, 안정성 보장
    • 가용성 : 인가된 사용자는 그 정보에 항상 접근할 수 있음 => DDoS 방지 => 데이터는 정상적인 사용자가 필요로할때 언제든 이용가능해야한다.

=> 공격자가 존재하는 상황에서 C.I.A를 집행함

 

  • cia로만 충분하지 않음 => 인증필요
  •  
  • 네트워크 보안도 중요 => 네트워크 프로토콜(보안 강화된) 중요, 암호알고리즘
  •  
  • 인증되었어도 허가된 행동만 수행하도록 해야함 => 인가 (authorization)

  • 멀티 유저 시스템에서 인가가 필요함(root, suepr user, normal user, guest)
  •  
  • 부인방지
    You did that => 하지 않았다고 부인하는것을 방지
  •  
  • 책임 추적성(Accountability)
    who, when, where, why, how, what
    모든 transcation에 대해 기록하고 제공해야함
    행동들이 추적간능해야한다.
  •  
  • Information Security
    인가되지 않은 접근, 기록, 수정, 변조, 파괴 등으로부터 정보를 보호
    => 허가되지 않은 공격으로부터 정보를 보호
    (Destruction : 일부 삭제 or 교체)
  •  
  • Computer Security
    적대적인 환경으로부터 컴퓨터 시스템을 보호하는 것
    (계획된 사용은 허용, 불법적인 사용을 막음)
    컴퓨터 시스템 자신과 컴퓨터 시스템이 저장하거나 접근하는 데이터를 보호하는 것.
  •  
  • 컴퓨터 보안과 정보보안의 차이
    컴퓨터보안 : 디지털 형태로 된 데이터나 정보에 초점을 두고 보호, 디지털로 된 정보, 시스템, 네트워크 디지털을 다루는 시스템이나 네트워크를 보호하는 것
    정보보안 : 아날로그, 디지털 정보를 보호, 디지털로된 정보, 디지털로된 시스템 네트워크뿐만아니라 아날로그로 된 정보까지도 보호대상임

공격, 위협으로부터 보호

  • 공통점 : 컴퓨터 시스템이나 네트워크를 보호,

 

  • Software Security
    악의적인 공격하에서도 SW기능이 정상적으로 동작하도록 설계,개발, 테스팅하는 개념
    취약점을 차단하는것과 다름 => 취약점 : 보안상의 허점
    뚫리고 난 후 사후대책을 하는 것은 아님(reacting)안전한 SW를 개발하는 모든 것
    보안을 위해서 SW를 설계 구현 테스트하는 과정
    Pro-Active, 능동적인 접근 방식 : 미리 예방함 => SW를 구성할때 보안을 내재화(각 개발 단계마다, 만들때부터 보안 고려)

 

  • Security engineering과 관련있음 => 모든 과정에 관련, 시스템 설계시 보안 측면에 초점을 둔 엔지니어링의 특별한 분야
    보안 요소 : 문제의 요소가 되는 것을 처리하는데 필요한 보안요소들 => 자연적인 재해, 악의적 공격 등

 

  • SW에 의해서 유발되는 보안 위험을 이해하고 예방하고 보완하는 것임

 

  • Microsoft Security Development Lifecycle
    보안에 관련된 설계 결함, 코딩 단계의 결함을 줄이는 것 => 취약점, 해커에 의해서 악용될 수 있는 취약점을 줄이는것
    (* 공격자가 방어자보다 유리함, 공격자는 취약한 점 하나만 찾으면 되지만 방어는 모든 취약점을 찾아서 막아야함)=> 취약점을 제거, 제거하지 못한다면 심각도를 줄임-Secure by Default
    공격에 문제가 없는 시스템을 만듦

 

  • -Secure in Deployment and Communication
    배치, 설치, 통신시 안전하게 함

 

  • -Secure by Design
    설계시부터 보안 고려

 

  • 남아있는 취약점들의 심각도를 줄임

SDL은 SW 개발 주기에 보안에 관련된 점검과 대책을 추가함
전 과정에서 보안을 고려 + 보안 교육

  • Software Security != Security Software
    Software Security => 어떤 sw를 개발/구현 할 때 모든 단계에서 보안을 내재화
    Security Software => SW로 개발된 보안 도구, 보안제품/서비스가 sw로 개발됨

 

  • Types of Cybersecurity attacks
    -Phising
    범죄자가 희생자를 믿게만들고 범죄를 수행함(주로 링크 클릭)
    -Pharming
    정상사이트를 위조하여 가짜 사이트를 만듦
    -중간자 공격
    송신자가 보낸 내용을 가로채서 변조함, 네트워크 통신을 조작하여 통신 내용을 도청하거나 조작하는 공격기법
    -Drive by download attack
    희생자 모르게 어떤 악의적인 프로그램이 설치되게함(동의없이 다운 or 설치)
    -Malvertising
    인터넷 광고로 위장하여 악성코드를 설치함(광고를 보면 악성코드가 설치됨) malware + advertising
    -Rogue antiviurs
    백신 프로그램을 사칭하여 결제를 유도함

정리)
What is the difference between information security and computer
security?

=> information security : 어떤 형태의 정보든지에 상관없이 관련된것

computer security => 디지털 형태의 정보만 관심을 가짐

 

What is the difference between software security and security software?

software security => 개발 단계에서부터 보안을 신경써서 소프트웨어를 개발하는것

security software=> 악성코드를 탐지하는 소프트웨어

 

What is malvertising?

=>광고처럼 보이는 공격

 

What is rogue software?

=>악성코드가 있는것 처럼 속이고 결제를 요구하는 소프트웨어(가짜백신)

 

  • Good Security Standards follow the 90/10 rule
    보안 문제의 10%는 기술적으로 해결가능하지만, 90%sms 사용자에게 달려있다. 보안 문제는 모든사람의 책임이라는 의미이다.
  • Interruption,Interception, Modification, Fabrication Security threats 예시
    Interruption(가로막기) => TCP flood, Ping flood, DoS DDoS
    Interception(가로챔) => packet sniffing, key logging
    Modification(변조) => android 리패키징 공격, 임베디드 시스템의 펌웨어 변조
    Fabrication(위조, 가장함) => DNS Spoofing, Replay attack

암호알고리즘, 프로토콜, 접근제어는 소프트웨어로 구현이됨
따라서 소프트웨어가 만약에 문제가 생기면 보안취약점으로 연결이되어 보안사고를 유발함

  • 데이터 기밀성을 보장하는 법?
    • 암호기법
      AES(대칭키), RSA(비대칭키)
    • 강한 접근제어사용
      Never access(중요데이터, 관리자가 아닌경우), No read, No view
    • 중요한 데이터가 임의의 장소에서 나타나지 않게 함
  • 데이터 무결성을 보장하는 법?
    • documenting system activity
      로그로 남김
    • 강한 access control
      no write , no append or reald only
    • 암호학적 해쉬함수
      mac, sha-256, md5 => one-way 함수 (역으로 계산 불가) => 해쉬값으로 입력을 찾기 어려움
      출력값의 길이는 같음 => 고정된 길이 출력
      입력의 미세한 변경이 출력에 큰 변화를 끼침
  • 가용성 보장?
    • anti-DDoS system
      Content Delivery Networks(CDNs)
      -> 컨텐츠를 효율적으로 전달하기 위해서 여러 노드를 가진 네트워크에 데이터를 저장하여 제공함
      인터넷 서비스 제공자에 직접연결되어 데이터를 전송하기 때문에 컨텐츠에 대한 병목을 줄일수 있음(분산저장)
      Scrubbing center (scrub => 불순물 제거)
      -> 네트워크 트래픽을 분석하여 악의적인 트래픽을 제거
    • 백업 절차를 잘 만듦
      데이터 삭제 공격을 막기 위해
  • Security Threat
    • 회사나 개인의 자산을 임의로 노출시키거나 변조, 손상, 이용할 수 없게 하는 행동이나 방치해 두는 것
    • 보안 위협의 요소
    • target : 데이터, 정보, sw, hw ... (취약한 자산)
    • agent :의도를 가지고 위협유발 or 비의도적 위협유발을 하는 사람
    • event : 타겟의 취약점을 악용하는 행위 (정보 파괴, 변조, 오남용 등) => 악의적, 우연적
  • 취약점
    계산 로직의 약점, 코드의 약점, 하드웨어 내의 로직 약점 => 악용시 기밀, 무결, 가용성에 영향을 미침
    약점이 발현되면 취약점임
  • => 취약점이 제거되면 위협이 없어짐
  • passive and active attack
  • Passive attack => interception
    시스템 자원에 영향을 주지 않으므로 알아차리기 힘듬
    기밀성 깨짐

Active attack => 시스템 자원을 변경시킴 따라서 탐지하기 용이한 편
변조, 조작 => 무결성 가용성 깨짐

  • Security Threat Model
    보안 운영을 계획하고 최적화 하는 방법 => 조직에서 위협들을 방어하기 위한 방법
    보안 위협(취약한 자산이 타겟)을 없애기 위해서 목적을 제시하고 방어계획을 설계해야함어떤 위협이 있는지, 취약한 자산은 무엇이 있는지 그 위혐들에 대해서 어떻게 우리가 대응할 것인지 이러한 것들을 전반적으로 생각하여 최적화 시키는 것임
    => 위협을 방어하기 위해서 사용할 수 있는 방식이나 수단
    • 위협
      멀웨어 => 바이러스, 스파이웨어, 애드워어
      제로데이 취약점 => 아직 패치가 나오지 않은 새로 발견된 취약점
      DDoS 공격
      Phising
    • 보안 위협 구성요소
      • 타겟
      • agent
      • event
  • 조직이 균형잡힌 방어기법, 끊임없이 진화하느 ㄴ방어기법을 구축할 수 있게 도와줌

 

-해커들의 창은 기업 및 기관의 방패보다 항상 빠르게 진화하므로 피해를 최소화하기 위해서 모의훈련으로 대비를 해야한다. => 모의훈련 (공격자처럼 생각 = 예방을 잘 할 수 있고 취약점을 잘 찾을 수 있다.)

 

-방어보다 공격이 유리하다. => 방어는 보든 부분(서버, pc, 스마트폰, 네트워크..)을 방어해야하지만 

공격은 취약한 부분 하나만 있으면 된다. (취약점 : 공격에 악용될 수 있는 발판, 약점, 결함, 실수..)

728x90
반응형

'공부 > 보안' 카테고리의 다른 글

INT OVERFLOW/UNDERFLOW (2) - 부호버그(Signedness Bugs)  (0) 2021.04.15
Int Overflow/Underflow(1) - 예시, 예방법  (0) 2021.04.15
Role-Based Access Control (RBAC)  (0) 2020.12.08
Access Control MAC (2)  (0) 2020.12.03
Access Control & DAC (1)  (0) 2020.12.03
블로그 이미지

아상관없어

,

SQL JOIN

공부/데이터베이스 2021. 3. 30. 19:27
반응형

예제용 테이블

- 두개의 테이블 결합

SELECT 칼럼이름

FROM 테이블1

JOIN 결합할테이블2

ON 테이블1의 칼럼 = 테이블2의 칼럼

 

EX) tb의 sales 와 tb1의 name(두 테이블은 공통으로 number를 가짐)

 

SELECT * FROM tb

JOIN tb1 ON tb.number = tb1.number;

(number가 공통값이므로 공통키가됨)

 

- 내부조인

일치하는 레코드만 가져오는 결합

 

EX)

SELECT * FROM tb

INNER JOIN tb1

ON tb.number=tb1.number;

(내부조인을 명시적으로 표시하려면 INNER JOIN으로 사용)

 

- 칼럼을 선택해서 표시

EX)

SELECT tb.number, tb1.name, tb.sales FROM tb

JOIN tb1 ON tb.number=tb1.number;

 

- 테이블 이름이 복잡할 경우 별명을 붙이고 사용

테이블 이름 AS 별명

 

EX)

SELECT x.number, y.name, x.sales FROM tb AS x

JOIN tb1 AS y

ON x.number = y.number;

 

- USING을 사용하여 ON 부분을 알기쉽게 표현

USING(키가 되는 칼럼 이름)을 이요하면 간단하게 표현가능

 

SELECT tb.number, tb1.name, tb.sales FROM tb

JOIN tb1ON tb.number=tb1.number;

            ||

SELECT tb.number, tb1.name, tb.sales FROM tb

JOIN USING (number);

 

- 결합한 테이블에 WHERE 조건 설정

WEHRE 조건을 설정하기 위해선 어느 테이블의 어떤 칼럼인지 명시해야한다.

 

EX) WHERE 테이블.칼럼 > 100

 

EX)tb에서 sales가 100이상 것에 한하여 tb1에서 name을 가져와 표시

SELECT tb.number, tb1.name, tb.sales FROM tb1

JOIN tb USING(number)

WHERE tb.sales >= 100;

 

- 여러 테이블에서 데이터 추출

JOIN할 테이블 수에 제한이 없다.

 

SELECT ~ FROM 테이블이름1

JOIN 테이블이름2 결합조건

JOIN 테이블이름3 결합조건

JOIN 테이블이름4 결합조건

.......

EX)

tb, tb1, tb3는 공통 칼럼 number가 있다.

 

number를 키로 사용하여 number, sales, name, city 를 표시하면

 

SELECT tb.number, tb.sales, tb1.name, tb3.city FROM tb

JOIN tb1 USING(number)

JOIN tb3 USING(number);

 

혹은

 

SELECT tb.number, tb.sales, tb1.name, tb3.city FROM tb

JOIN tb1 ON tb.number=tb1.number

JOIN tb3 ON tb.number=tb3.number;

 

- 외부조인

tb에는 tb1에 존재하지 않는 number 'A107'이 있다. 그리고 tb1에는 tb에 존재하지 않는 'A105'가 있다. 따라서

 

SELECT x.number, y.name, x.sales FROM tb as X

JOIN tb1 as y ON x.number=y.number;

 

할 경우 'A107'과 'A105' 레코드는 표시되지 않는다.

경우에 따라 모든 레코드를 표시해야할 경우에는 외부조인을 사용한다.

 

* 외부 조인의 종류

결합하는 레코드 중 어느 쪽의 레코드를 모두 표시할 것인가에 따라 LEFT JOIN, RIGHT JOIN으로 구분된다.

LEFT JOIN : 일치하는 레코드와 왼쪽 테이블의 모든 레코드를 표시

RIGHT JOIN : 일치하는 레코드와 결합할 오른쪽 테이블의 모든 레코드를 표시

 

- LEFT JOIN

SELECT 칼럼이름 FROM 테이블1

LEFT JOIN 결합할_테이블2 ON 테이블1의 칼럼 = 테이블2의 칼럼;

 

EX)

tb에는 있지만 tb1에는 존재하지 않는 number 'A107' 레코드 표함 표시

(tb, tb1을 number를 키로 LEFT JOIN해서 서로 일치하는 레코드와 tb의 모든 레코드를 표시)

(number와 name 만)

 

SELECT tb.number, tb1.name FROM tb

LEFT JOIN tb1 USING(number);

=> 'A105'는 표시되지 않는다. A107의 name 데이터가 존재하지 않기 때문에 NULL로 표시된다.

 

- RIGHT JOIN

일치하는 레코드와 결합할 오른쪽의 모든 데이터 표시

 

SELECT 칼럼이름 FROM 테이블1

RIGHT JOIN 테이블2(결합할) ON 테이블 1의 칼럼 = 테이블2의 칼럼;

혹은 (USING 칼럼이름)

 

EX)

tb1에는 있지만 tb에는 없는 레코드 표시

tb의 number와 tb1의 name 표시

 

SELECT tb.number, tb1.name FROM tb

RIGHT JOIN tb1 USING(number);

 

- 셀프 조인

자기자신, 같은 이름의 테이블을 결합

같은 이름의 테이블을 결합하므로 같은 칼럼 이름이 2개씩 표시됨

 

SELECT 칼럼이름 FROM 테이블이름 AS 별명1 JOIN 테이블이름 AS 별명2;

 

EX) tb1을 셀프조인하고 모든 칼럼 표시

 

SELECT * FROM tb1 AS a JOIN tb1 AS b;

=> 모든 조합이 생김

모든 조합이 생기기때문에 조건을 설정하여 원하는 것만 선택하면된다.

 

EX) 순위 정하기

RANK와 같은 함수가 없으므로 ORDER나 GROUP 등의 조합으로 처리해야한다.

age 순으로 순위를 매긴다면

 

SELECT a.name, a.age, COUNT(*) AS 'RANK' FROM tb1 AS a

JOIN tb1 AS b

WHERE a.age <= b.age GROUP BY a.number;

WHERE a.age <= b.age GROUP BY a.number => b.age가 a.age 이상인 레코드가 추출된다. 이렇게 추출된 레코드의 개수를 count하면 순위가 된다.

GROUP BY a.number를 하였으므로 A101, A102 ... 모두 비교한다.

A101의 경우 a.age<=b.age가 되는 경우는 첫줄의 경우 밖에 없으므로 count가 1이 된다.

 

- 하위 질의 = 서브쿼리

질의를 실행해서 추출한 데이터를 이용해서 다시 질의를 한다.

하위 질의를 사용하는 처리 대부분은 내부조인등으로 대체 할 수 있다. 하지만 단계별로 처리하는 하위질의를 사용하는것이 더 효율적이다.

 

EX 1)

tb테이블에서 칼럼 sales의 최대값이 잇는 레코드를 표시

 

SELECT * FROM tb WHERE sales IN (SELECT MAX(sales) FROM tb);

=> MAX(sales)인 sales가 있는 레코드를 SELECT 함

 

EX 2)

tb1에서 age 평균값을 계산하고 age가 평균값 이상인 레코드 표시

 

SELECT * FROM tb1 WHERE age>=(SELECT AVG(age) FROM tb1);

 

- 칼럼을 반환하는 하위 질의

SELECT 표시할 칼럼 FROM 테이블 이름

WHERE 칼럼이름 IN (SELECT 이용 하위 질의로 추출한 칼럼)

 

EX)

sales가 200 이상인 name을 표시

SELECT name FROM tb1 WHERE number IN (SELECT number FROM tb WHERE sales>=200);

 

- 하위 질의와 내부 조인의 실행 결과 비교

SELECT number, name FROM tb1

WHERE number IN (SELECT number FROM tb);

 

SELECT tb1.number, tb1.name FROM tb1

JOIN tb ON tb1.number=tb.number;

=> 내부 조인은 tb에 있는 모든 레코드를 표시함

=> 모든 레코드를 표시함

 

* IN 대신에 등호를 사용하면 오류가 발생한다.

 

SELECT * FROM tb1 WHERE number = (SELECT number FROM tb WHERE sales>=200);

-> 하위 질의가 1건 이상 검색되었다라는 오류가 뜸

-> 해당 레코드가 1건 밖에 없을 때에는 등호를 사용해도 오류가 발생하진 않음

-> number가 xx와 정확하게 일치한다라는 조건이면 상관이 없지만, 위 예시는 여러 레코드가 추출되므로 ~중에 어느것 이라는 IN을 사용해야한다.

 

SELECT * FROM tb WHERE number = (SELECT number FROM tb1 WHERE sales>=200 LIMIT 1);

 

이렇게 하면 오류는 뜨진 않지만 A101이 나올지 A102가 나올지 알 수 없어서 결국 LIMIT도 도움이 되진 않는다.

LIMIT로 1건만 추출하기 때문에 오류가 발생하지 않는다.

 

- EXISTS = 존재하는 레코드를 대상으로 검색

EX) tb1에는 tb에 존재하지 않는 number를 가진 레코드도 포함되어있음.

 

SELECT * FROM tb1 WHERE

EXISTS (SELECT * FROM tb WHERE tb.number = tb1.number);

tb에는 A105의 number가 존재하지 않으므로 표시되지 않음

 

- NOT EXISTS 

하위 질의로 추출되지 않는 레코드를 대상으로 함

 

EX)

tb 테이블에 존재하지 않는 레코드의 number만 추출하고 테이블 tb1에서 해당하는 레코드 표시

 

SELECT * FROM tb1

WHERE NOT EXISTS (SELECT* FROM tb WHERE tb.number=tb1.number);

 

 

- 순위 정하기(하위 질의 이용)

1. 연속 번호 기능을 설정한 테이블에 sales의 순서대로 정렬한 레코들 삽입한다.

2. 자동으로 입력되는 연속 번호가 순위가 된다.

 

구체적으로 적으면

1. 테이블 tb와 같은 구조의 테이블 tb_rank를 생성한다.

2. 테이블 tb_rank에 연속번호 기능을 설정한 칼럼 rank를 추가

3. 테이블 tb를 대상으로 sales의 순서대로 SELECT 하는 하위질의를 실행

4. 하위 질의의 결과를 tb_rank에 INSERT

 

1. CREATE TABLE tb_rank LIKE tb;

(tb의 칼럼 구조만 복사하여 tb_rank생성)

2. ALTER TABLE tb_rank ADD rank INT AUTO_INCREMENT PRIMARY KEY;

(tb_rank에 연속번호기능을 설정한 rank 칼럼 추가)

3. INSERT INTO tb_rank (number, sales, month) (SELECT number, sales, month FROM tb ORDER BY sales DESC);

(tb를 sales의 내림차순으로 정렬하고 number, saels, month를 tb_rank에 추가한다.)

728x90
반응형

'공부 > 데이터베이스' 카테고리의 다른 글

데이터베이스 예제 2  (0) 2021.04.20
데이터베이스 예제 1  (0) 2021.04.19
정리  (0) 2021.04.19
파일 사용  (0) 2021.04.14
트랜젝션  (0) 2021.04.14
블로그 이미지

아상관없어

,
반응형

기존 DAC 문제점

- 임의접근제어가 너무 유연함

- 정보흐름 통제 어렵다. => 트로이 목마

 

분산 시스템에서의 ACL

 

- ACL은 일반적으로 사용자(목록)와 그룹(목록)으로 구성됨

- 사용자와 그룹이 정의가 되고 관리 도메인 내에서 등록이 됨

- 만약에 ACL에서 그룹이 없으면 관리 하기 힘듬, 사용자들의 긴 리스트를 관리해야됨

- 관리 도메인 안에서 그룹의 이름은 사용자들의 목록으로 확장될 수 있음 => 한그룹에 여러 사용자

 

- 그룹이 등록 되었으나, 도메인 밖(그룹이 등록되지 않은 위치)에서 사용해야 한다면? => ACL은 힘듬

다른방법으로 Capability list가 잇음 or 그룹을 일반화 시킴 

 

따라서 역할기반제어기법

ACL은 사용자에게 바로 권한을 주었다.

 

RBAC은 주체, 객체사이에 역할을 두어 접근 허가의 개수를 줄이고 관리해야하는 자격의 개수를 줄였다.

Vendor Management는 세사람이 하나의 역할을 하게 해준다.

그리고 유저의 권한이 바뀔때 => 대리에서 과장으로 승진되었을때 역할만 바꾸어주면 된다. 

 

RBAC

 

사용자와 자원을 분리시킴 중간에 역할을 추가함

사용자는 자주 바뀌는 반면에 역할은 자주 바뀌지 않음

 

- 서비스 입장에서는 client들은 어떤 이름이 붙여진 역할로 분류할 수 있다.

- 역할에 따라 권한을 할당하는 것이 가능하다.  

- DAC보다 훨씬 더 세밀한 접근제어가 개별적인 객체에 주어질 수 있다. => A는 하나의 role만 가지게하고 그 role의 권한을 줄일 수 있음 

- 역할 범위는 local domain, 분산환경 둘다 가능하다. 

 

* 주체와 객체 분리

- principals -> roles : 주체가 역할에 할당

- roles -> privileges : 역할이 권한가짐

 

- 역할 개념에 따라서 권한을 명시할 수 잇음

- 주체는 역할이 배정되고 실제권한은 역할에 준다. => 관리가 편해짐

 

* 역할 세분화 가능

- fine-grained access control 가능

-

접근을 주거나 접근을 제한할 수 있다

 

ACL은 개인을 상호배타적으로 제외시킬 수 있는가? => 어려움

 

 

RBAC은 Matrix가 두개 필요하다. 

user - role

role -(접근제어)- object 

사용자는 할당된 역할에 기반하여 객체에 접근함

역할은 직무에 따라 정의됨

 

Role : 조직내에서 직무를 나타낸다.

한 유저는 여러 역할을, 여러 유저는 한 역할을 할 수 있다.

 

Session : 일시적으로 어떤 사용자가 어떤 역할을 가지게 될때, session을 통해서 할당이 이루어진다. (동적)

=> 최소 권한 원칙을 집행하는데 의미가 있다, session을 통해 최소권한 원칙 강제 가능

=> 각 세션은 한 유저를 여러역할에 매핑함.. 

e.g A는 대리이면서 TF팀의 팀장이다 => 역할이 두가지

Session을 통해서 동적으로 역할을 할당한다.

사용자와 역할간, 역할과 permission간에는 one-to-many, many-to-many가능

유연성도 제공하고 접근허가 단위 세분화 가능

 

RBAC은 4가지 모델이 있음 

 

Role 계층구조 => 상속

 

RBAC 구성요소 설계할때 혹은 구성할때 제약을 가한다.

e.g 어떤 사용자는 하나의 역할만 가져야한다.        ->이러한 것을들 미리 정해야한다.

     한 역할에 포함 될 수 있는 사람은 00명이다

     이 역할은  ~~한 권한을 가져야한다.

 

SOD => Speration of Duty : 이해 충돌이 나는 절차가 있으면 분리해서 다른사람에게 맡긴다. (시험내는사람, 푸는 사람, 검토하는 사람 다 달라야)

 

RBAC0 = base model

RBAC1 = 역할에 계층적 구조 지원 -> 상속 허용

RBAC2 = 제한가함, -> SOD, Cardinality(한 사용자는 한역할만 or 한 역할에 포함되는 사람의 수는 00이다.), 필수조건(최소권한 원칙을 지정하는데 필요함, 어떤 일을 하기전 어떤 역할을 가져야함) 

RBAC3 = RBAC1+ RBAC2

 

RBAC1

---------------------------------------------------------------------------------------------------------------------------------

상위 역할은 하위역할을 상속받는다. 

e.g Director는 프로젝트 리더1,2의 권한을 다 상속 받음

 

 

RBAC2  - 제약조건

---------------------------------------------------------------------------------------------------------------------------------

1. 상호배타적인 역할 => 유저는 집합안에서 하나의 역할만 가질 수 있다. 어떤 permission은 어떤 역할에만 주어라

 - SOD를 지원하기 위한 것

 - 결탁, 공모 어렵게한다.

 

 - Static Exclusion : 어떤 사용자도 두개 이상 역할을 가질 수 없다. 하나만

 - Dynamic Exclusion : 역할을 활성화 시킬때, 하나의 session에 하나의 역할만 활성화 시켜야한다.

 

2. cardinality => 한 역할에 포함될 수 있는 사용자의 최대수 한정 or 한 사용자가 가질 수 있는 역할 제한

 - 정적 

   역할 최대 사용자

   역할 최소 사용자

   역할에 0명의 사용자만

 - 동적

   session을 통해서 일시적으로

 

3. 선수조건 만족역할 => e.g 과대표가 되려면? 00대학교의 학생이여야한다.

 - 조건이 만족되어야 어떤 역할의 멤버가 될 수 있다.

 

3가지 제약조건이 있음

 

 

Role permission relationship은 미리 정의된다.

 

SELinux에서의 Role(SELinux는 DTE도 지원하고 RBAC도 지원한다.)

seinfo -r명령어로 role정보를 볼 수 있다.

id -Z

system_u:unconfined_r:unconfined_t:s0

system_u : 유저

unconfied_r : 역할

unconfined_r : 타입 => 도메인 (어떤 파일을 접근할 수 있는지에 대한 집합)

역할은 도메인에 연결되어잇음

 

 

NIST RBAC Model

============================================================================

1. 관리자 업무 => RBAC의 구성요소들을 생성하거나 삭제하거나 유지하는 것, 역할과 permission간의 관계를 생성하고 삭제하고 관리하는 역할

 - 유저집합으로부터 유저들을 삭제하거나 추가

 - 사용자와 역할관계 생성하거나 삭제

 - permission과 역할 관계 삭제하거나 생성

 

2. 시스템을 지원하는 업무 => 세션 관리에 관계되는 내용(세션 일시적으로 동적으로 사용자와 역할간의 관계)

 - 사용자 세션생성과 관리

 - 세션에 액티브한 역할 추가

 - 세션에 있는 역할 제거

 

3. 검사하는 업무 

 

object = 자원

operation = 사용자를 위해 어떤 업무를 실행하는 것

operation을 할 수 있는지 허가하거나 불허하는 것

 

계층 RBAC => 상위역할은 하위역할 권한 상속가능

계층에 제약을 줄 수도 있음

 

Dynamic Separation of Dutiys (DSD)

긴급한 일 처리하기위해서 일시적으로 만드는 어떤 역할에 사용자 매핑 = 세션

사용자 세션과 관계된다.

 

SSD모델에서는 이해충돌이 나는 2가지 역할 가지는 것 불가

DSD 모델에서는 2가지 역할을 가질 순 있지만, 같은 시점에 두가지 역할 가지는 것 안됨

다른 시점에 다른 역할 가지는 것 허용

e.g 6개월 전에는 수행자였지만, 6개월 후에는 평가자임. A프로젝트 수행자이면서 B프로젝트 평가자

 

계층이 없으면 정보가 중복되서 관리되고 저장공간도 많이 필요하고 어려워진다.

계층으로 상속을 지원하면 권한을 상속받고 Application도 달라진다.

 

 

RBAC 장점

 - 효율적인 보안 관리 지원

 - 역할의 계층구조 지원

 - 동적으로 역할 상속 지원

 - 역할보다 유저가 자주 바뀜, 권한을 주는 것은 쉬움(역할을 사용하여서 => 역할만 바꾸면 댐)

 - 최소권한원칙 지원 = 역할을 세분화

 - SOD 지원

 - 회사레벨에서 전체적인 관점지원

 - 조직레벨에서 접근제어해결에 도움을 줌

 - 서로다른 플랫폼에서 지원

 - DAC/ MAC 정책 포함가능

 - 정책 검증이 쉬움

 - RBAC을 이용해서 DAC/MAC구현 가능

 

RBAC 단점

 - 최소권한 원칙을 위해서 역할 너무 세분화시 역할이 폭발함 => role explosion

 - 자원에 대한 ownership 표현 불가 (누가 만들었는지)

 - 역할 너무 세분화시 비효율적임

 => RBAC + ownership을 함께 사용함(리눅스 DAC/ RBAC둘다 사용가능 따라서 실용적)

 

SELinux (Role vased Access Control)

SELinux는 DAC/RBAC/MAC 모두 지원한다.

 

 

SELinux 유저는 사용자 세션(로그인 -로그아웃까지 시간) 바뀌지 않는다.

리눅스 유저는 su나 sudo명령어로 바뀔 수 있다.

SELinux 유저는 하나 이상의 역할(정책에 의해 정의)에 할당된다.

object_r : 파일을 위해 사용되는 일반적인 역할

webadm_r : 오직 apache 서버와 관련된 관리를 함

...

각 관리자들을 세분화 하였다. => 전지전능한 권한을 갖는 role은 없다 => SOD, 최소권한 원칙 지원

 

seinfo -r => 이용가능한 역할 보여줌

 

seinfo로 정보 볼 수 잇다.

 

보안 문맥 : 주체와 객체는 보안 문맥을 가진다. => label이라고 한다.

주체(프로세스 일반적으로 os에서) 가 객체를 어떻게 접근할 수 있는지를 결정하는데 사용한다.

프로세스가 갖는 문맥과 file이 갖는 문맥이 다르다.

 

SELinux 보안 문맥은 SELinux user, rol, type은 필수 필드이며, MLS range는 옵션이다.

 

유저 swift는 user_u에 매핑되고 user_u는 user_r에 user_r은 user_t에 매핑된다.

유저는 user_t 도메인안에 있다. 도메인에서 지정된 자원만 접근가능하다.

 

루트 유저는 sysadam_t도메인 안에 있다.

 

일반 유저 도메인 (user_t)는 권한이 낮은 도메인이다.

따라서 어떠한 관리 task도 허용하지 않는다.

sudo나 su 명령 접근 가능해도, 시스템에 손상을 가할 수 없다.

=> user_t라는 도메인 내에서 허용된 일만 한다. 

 - 어떤 사용자가 어떤 역할, 도메인에 할당이 되면, 거기에 국한된다.(할 수 있는일 제한)

=> 사용자가 user_t 도메인에 있기도 하지만, 역할 자체가 user_r이기 때문이다.

 - 두가지 측면에서 나쁜영향을 막는다. 1. 도메인. 2. 역할

DAC에서는 위와 같은 일이 일어날 수 잇지만 SELinux RBAC은 막음

 

SELinux role은 유저가 자유롭게 도메인을 선택할 수 있다는 것을 의미하지 않음 => 관리자가 정한 policy, rule에 따라 결정됨

 

seinfo 툴로 어떤 도메인에 그 역할이 할당될 수 있는지 그역할이 어떤  도메인에 매핑될 수 있는지 알아볼 수 있다.

"user_r이 가질 수 ㅣㅇㅆ는 도메인 은 두가지이다.

 

Switching role

사용자는 역할을 바꿀 수 있다. => SELinux정책에따라 허용 될 때만

semange 명령어는 관리자만이 사용할 수 있고, 어떤 사용자가 어떤 역할을 가질 수 있는지 보여준다.

newrole -r <역할>로 바꿀 수 있다. 

DSD와 같이 예를 들어 staff유저는 A,B역할이 잇을대, A역할 담당자가 휴가를 가면 다른 사람이 A역할을 잠깐 맡아서 할 수 있다.

728x90
반응형

'공부 > 보안' 카테고리의 다른 글

Int Overflow/Underflow(1) - 예시, 예방법  (0) 2021.04.15
보안개론 정리(1)  (0) 2021.04.13
Access Control MAC (2)  (0) 2020.12.03
Access Control & DAC (1)  (0) 2020.12.03
Return-Oriented Progamming  (0) 2020.11.03
블로그 이미지

아상관없어

,
반응형

이전 DAC의 문제점


주체는 중요한 정보를 위부로 유출 시키지 못하게 하여야함.

->어떤 객체에 대해 접근 권한을 가진 주체가 그 객체안에 포함된 정보를 그 객체에 접근 할 수 없는 주체에도 유출 시킬 수 있다.

객체 안의 정보의 의미를 고려하지 않는다. => 객체들 마다 보안에 대한 민감도가 있는 데, 민감도를 표현할 수 없다

e.g open가능한것, A만 볼 수 잇는것, 이사만 볼 수 있는것

 

왜 새로운 접근 제어 모델이 리눅스에서 필요한가?

- 유저가 멀웨어를 실행하면 기밀성과 무결성이 위협받음.

- DAC는 위와 같은 공격에 대해 방어가 불가능하다.

 

따라서 시스템 전반적이고 세부적인 접근제어가 필요하다.

 

만약, local 컴퓨터에서는 읽고 쓰기가 가능하지만 네크워크를 통한 읽기나 쓰기를 막으려면? DAC는 불가능하다.

따라서 MAC이 도입

 

만약 사용자 A가 웹서핑도하고, 레포트도 작성하며, 방화벽을 관리하듯이 다양한 역할을 가질 때?

DAC에서는 어렵다. 어떤 사용자는 owner가 되고 group에 속함 => 다양한 역할을 가지기 어렵다.

 

개인(user) 중심으로, 개별자 중심으로 접근제어를 하기 때문에 다양한 역할에 대한 고려가 부족하다.

따라서 RBAC이 도입

 

 

Mandatory Access Control

운영체제(실질적으론 관리자)가 주체의 능력을 제한 시키는 것이다.

(주체가 어떤 객체에 대해서 어떤 연산을 할 수 있는 지 결정)

 

SELinux는 리눅스에서 돌아가는 보안 프레임워크 중 하나이며, MAC을 집행할 수 있다.

 

DAC => ACL

MAC => SELinux

 

- 전역적인 보안 정책을 집행한다. => 모든 유저에게 (중앙집중식임)

 

- 신뢰되는 관리자가 보안 정책을 정의한다. => 어떤 프로세스가 어떤 파일들을 접근할 수 있는지 혹은 어떤 방식으로 접근 할 수 있는지 나타낸다.

- 접근은 시스템에 의존(kernel governs all access)

 

- 개별 사용자는 이러한 정책에 대해 disable 불가 <=> DAC와 다름, DAC는 소유자가 자기 자신의 파일에 대해 재량권이 많았음

 

- 정책보다 약하게 제어설정이 불가하다.

 

- 객체의 민감도(정보의 민감도)에 따라 객체에 대한 접근을 한정시킨다.

 

- Authorization은 어떤 조건이 만족된다는 필수조건에 근거한다.

 

 

- 관리자만이 보안 정책을 정의할 수 있고 집행할 수 있다. 개별사용자는 그 정책을 무조건 따라야한다.

따라서 보안상 굉장히 안전

=> system이 정책을 정의하므로

 

결론적으로, 오로지 관리자(커널)이 정한 정책을 따르고, 사용자들이 자기 자신이 생성한 자원에조차도 완전한 통제를 할 수 없도록함.

 

DAC와 MAC을 비교하면,

 

DAC:

주체의 재량에 따른다.

다른 주체에게 권한을 줄 수도 있다. (Identity based access Control(IBAC))

 

단점

군대와 같이 user identity와 ownership에 근거한 결정일 경우 부적합

악의적인 소프트웨어에 대한 보호기법이 없다.

각각 사용자가 자신의 객체에 대해 완전한 재량을 가진다.

사용자 주요카테고리가 2개이다. (superuser, other)

superuser가 아니면 시스템 서비스나 특권프로그램이 coarse-grained privilege로 동작한다.

 

MAC : (보안 강함)

운영체제에 의해 통제된다. (Rule-based AC or Policy based AC)

객체에 대한 접근을 통제하는 것은 시스템이 정한 방식임(객체의 민감도나 사용자 승인 여부로)

객체와 주체를 잘 분리해야한다.

자원에 대한 접근이 시스템, 관리자가 정한 보안정책에의해 관리된다.

Strong seperation of security domains (Security domain 은 subject 와 object의 집합 (collection) 으로 같은 보안 정책을 공유하는 도메인이라고 볼 수 있다.)

시스템과 데이터 무결성 제공

변조에 강인한 보호기법(우회도 되지않음)

프로그램에 대한 권한 제한제공

적법한 사용자가 할 수 있는 일 제한가능

 

MAC은 다양한 모델과 연결된다. (multi-level security(MLS) Policy와 같은)

최근 시스템은 유연한 seucrity model들을 제공한다.

 

Security Frameworks

 - SELinux : Security Enhanced Linux on Centos, Red Hat

    SEAndroid

 - AppArmor : Application Armor on Ubuntu, SuSE Linux

 - SMACK : Simplified MAC Kernel on Tizen

 - tomoyo Linux

 

 

 

System Defined Policy

- 고정된 집합의 주체, 객체 lable => 주체나 객체에게 lable이 붙여짐. (e.g 객체일 경우 top secret - secret .....)

- 고정된 개수의 허가할당

- 고정된 label 할당 (e.g file to object label)

- 전이 방식 고정(e.g setUID)

allow user_t(주체) passwd_exec_t:file(객체) execute(operation)

=> 주체는 객체에 대해 실행할 수 있다.

각 문장은 접근 정책이며 3번째 줄을 보면 read/write/exeute에서 getattr, search, lock, ioctl와 같이 접근제어가 세분화 된 것을 알 수 있다.

주체도 owner/Group/Others에 비해 세분화 되었다. 따라서 관리도 더 어려워졌다.

위의 정책을은 SELinux가 활성화 되면 적용이 된다.

- sestatus : SELinux가 활성화 되었는지 확인

- ls -l /etc/selinux : SELinux 설정파일 확인 => SELinux가 설치되어있는지 확인

- getenforce : SELinux disable/enable 확인

- cat /proc/version : /proc/version파일에는 운영체제명, 커널버전, gcc컴파일버전, 생성한 날짜 등 정보 볼 수 있음

- cat /etc/*release : 리눅스 os버전 확인

/etc/selinux/config : SELinux 설정파일 내 SELINUX가 disabled 되었으므로 getenforce할 경우 disabled로 나타남

SELinux 설정

  • enforcing

  • permissive

  • disabled

SELinuxType

  • targeted

  • minimun : only selected process are protected

  • mls : MAC을 나타내는 대표적인 방법중 하나 (DAC 구현시 Capability list와 Authorlization tabel 같이)

 

SELinux Enable

sestatus로 SELinux의 동작모드를 확인 할 수 있다.

 

-z는 SELinux와 관련 있는 옵션이다. SELinux의 보안 문맥을 보여준다.

 

 

 

MAC and Security Policy

----------------

 

보안 정책은 시스템의 상태가 안전한 상태인지 아닌지 나타내는 문장이다.

보안 정책 모델은 정책들의 집합이며, 보안 모델이 따라야하는 룰들의 모음이며, 시스템이 가져야하는 보호 특성을 나타내는 간결한 문장이다.

 

정책의 3가지 분류

1. 기밀성 정책

2. 무결성 정책

3. 가용성 정책

(Allow/ Deny)

 

MAC은 주체와 객체의 레벨에 기반한다. (레벨은 미리 정한다.)(e.g top secret - secret - confiedntial, classified)

 

MAC pattern => multilevel security model = lattice model

MAC pattern은 DAC 문제들(계층적인 구조환경에서 생길 수 있는 문제들)을 해결가능하다 (security level을 할당하여서)

 

 

Information Flow Control

한 객체 안에 있는 정보가 다른 객체로 어떻게 흘러갈 수 있는지 나타낸다. (정보는 객체(file)에 있다)

주체들이 class와 결합하여 일을 한다.

보안정책, 보안 class는 한번 설정되면 잘 변하지 않는다.

 

The Lattice Model

잘 알려진 Information Flow Model이다.

부분적으로 순서가 있는 집합구조를 가지게됨

일반적으로 방향이 있는 비순환 그래프로 표현됨

처음 출발지는 하나 끝나는점도 하나이다.

정보가 낮은 클래스로 부터 높은 클래스로가는것은 허용함

 

보안 정책 모델

1. Multilevel Security(MLS)

  lattice기반의 정보흐름 모델의 특별한 경우임.

  보안등급 : Unclassified -> Confiedntial -> Secret -> Top Secret

  clerance level(승인 레벨) : 주체는 허가 레벨을 가짐

  Classification level : 객체(민감한 정도)

     --> DAC에선 표현 불가

  

  모든 객체와 주체는 Security Level로 라벨되어 있음

     Sensitivity : 계층적 속성 (Unclassified -> Confiedntial -> Secret -> Top Secret)

     Category : 비 계층적 속성(e.g US only, UN, 00과에서만 봐야한다.(범위, 지역적인 것을 나타냄)) 

 

  MLS는 다시 두가지로 나누어짐

  1. Bell-LaPadula Model(BLP) => 기밀성에 중점

      No read up(높은 정보 read X), No write down(등급 낮은 객체 write X)

      => No read up : 객체 level <= 주체 레벨, 주체는 객체를 읽을 수 있음

      => No write down : 주체 level >= 객체 레벨, 주체는 객체에 쓸 수 있음

 

B,C,D read가능

A read불가 write만 가능

B read/write 가능

 

=> 객체와 주체가 같은 label이면 읽고 쓰기 가능

=> 객체가 주체의 label보다 위면 쓰기만 가능

=> 객체가 주체의 label보다 밑이면 읽기만 가능

(군대와 유사)

 

=> 등급이 같고 카테고리도 같음 = read, write

=> 등급이 높고, 카테고리 같음 = read

=> 등급이 낮고, 카테고리도 다름 = X

=> 등급이 낮고, 카테고리 같음 = write만

A의 level이 더 높고 더 큰 카테고리를 가지고 있으면 A,C 는 A',C'를 dom함

 

  2. Biba Model => 무결성에 중점, 권한이 높은 사람만이 정보변경가능

       no write up, no read down

       자기보다 높은 등급 write 불가,

       자기보다 낮은 등급 데이터 신뢰x

       => 높은 등급은 낮은 등급의 객체를 쓸 수만 있다.(무결성, 높은 사람만 정보변경가능)

       => 낮은 등급은 높은 등급의 객체를 읽을 수만 있다.(낮은 등급 데이터 신뢰 X)

 

 

2. Domain Type Enforcement(DTE)

  주체들은 Domain을 가지게 되고, 객체들은 type을 가짐.

  어떤 주체가 어떤 Domain에서 어떤 type의 객체를 어떻게 접근할 수 있는지 집행(강제로)

 

   주체 - 도메인 =>주체에 할당되는 label

   객체 - 타입 => 객체에 할당되는 label

    

   도메인이 어떤 타입을 어떻게 접근할 수 있는지 정의

   주체들은 접근할 수 있는 객체들에 대해서 type이라는 형식으로 나타냄

   어떤 접근이 어떤 객체에 대해서 허용되는지 모델링하는 방식

 

 

주체에 대해서는 도메인(label 붙임)이 할당됨, object는 type 

위 그림은 Type Enforcement이다. 

TE에서는 주체 객체 둘다 Type이다.

 

- 각 객체는 type으로 할당된다.

- 유사한 type의 객체들을 class로 묶는다.

  e.g file, socket, ipc channel, capability

 

- Process는 도메인과 연결된다.

httpd_t, sshd_t ~~~ : 주체에게 해당되는 도메인

 

- rule은 도메인과 타입사이의 권한을 정의한다.

주체 : httpd_t

객체 : httpd_config_t:file

operation : read, getattr, lock, ioctl

 

모든 파일들은 보안 정책에 따라서 타입을 가지게 된다. 어떤 type은 어떤 lable을 접근할 수 있는지 컨트롤한다.

새 객체에 대한 타입은 도메인에 기반하여 lable이 붙여진다.

 

 

Type Enforcemnet 장점

- Application separation - 운영체제의 기능 중 하나

- 슈퍼유저 특권 조절

- 최소권한 원칙

- 시스템콜에 대한 접근을 컨트롤 할 수 있다. ex) ioctl 같은

 

DTE 는 TE의 향상된 버전이다.

 

=> system call에 대한 통제 가능 (기존 DAC는 r/w/x)

=>같은 도메인이더라도 각 타입이 다름 객체에 접근할 수 있는 방식은 다 다름 => 분리가 잘 되어 잇음

 

 

=> entrypoint : 도메인이 변환 될 수 있음, transition이랑 같이 씀

=> user_t에서 passwd_t 도메인으로 변환 가능

-> passwd_exec_t 타입의 객체를 실행함으로써 user_t에서 passwd_t 도메인으로 변환 가능 (DAC에서 setUID 프로그램과 유사)

 

 

DTE 

  암묵적인 typing 지원

  type문장은 하나 이상의 type을 선언할 수 있다.

  주체에 대해선 도메인을 붙임. e.g bin/sh => 객체이면서 주체가 될 수 있음

  Assign statements : 어떤 객체에게는 type 할당가능, 어떤 주체에겐 도메인 할당 가능

 

active entity => domain

passive entity => type

 

entry point 프로그램을 실행함으로써, 한 도메인에서 다른 도메인으로 전이가 가능함.

 

 

-----------------------------------------------------------------------------------------------------------------------------------Security:

 - 루트 프로세스에 대해 접근 제어 (DAC보다 강력한 보안 제공, 루트가 모든것을 하진 못함)

 - 네트워크 daemon들도 제어 가능

 - 시스템 프로세스 보호가능

 - 커널도 보호 가능

 

usability

 - 시스템이 보안 정책을 구동할 수 있도록 enable 시킬 수 있다.

 

일반적으로 MAC은 제한적임. 사용하기 어렵고 불편하다.

 

 

정리

 

장점

 - 트로이 목마 공격 막을 수 있음 (DAC는 정보흐름 통제 어려우나 MAC은 가능)

 - 사용자: 도메인, object: type 중재자(신뢰할만한 사람 = 장단점이 됨)에 의해 중앙집중식으로 함

 - security level에 따라 접근제어 정책 집행(특히 MLS에서는 보안 레벨에 따라 )

 

단점

 - 새로운 사용자/객체가 들어올때 마다 classification을 잘 해야, MLS같은 경우 카테고리도 잘 정해 주어야함=>룰 충돌, 헛점 발생 가능

 

728x90
반응형

'공부 > 보안' 카테고리의 다른 글

보안개론 정리(1)  (0) 2021.04.13
Role-Based Access Control (RBAC)  (0) 2020.12.08
Access Control & DAC (1)  (0) 2020.12.03
Return-Oriented Progamming  (0) 2020.11.03
Return-tol-libc Attacks  (0) 2020.10.17
블로그 이미지

아상관없어

,
반응형

Access Control

  • 접근제어에는 주체(유저, 프로세스 등), 객체(파일, 디렉토리 등), 권한이 있다.
  • 주체가 객체를 어떻게 접근(권한)할 수 있는지 정의하는 것이 접근제어이다.
    (active한 객체가 passive한 객체를 어떤 형태로 접근하는지 통제하는 기능)

Subject ----> Object
           ^
            |
Access

  • Subject : active한 entity 로 객체나 객체안의 데이터에 대한 접근을 요청함 (유저, 그룹, 프로그램, 컴퓨터..)
  • Object : passive한 entity로 정보를 포함하고 있다. (파일, 디렉토리 메모리, IPC ...)
  • Access right : operation(read, write, append ....) = Permission
|참고|

파일의 정보는 inode에서 관리함  
하나의 파일에는 최소 하나의 inode가 존재하며, 하나의 inode가 여러개 이름이 연결되면 Hard link(바로가기 유사)이다.  
active한 inode는 하나의 파일만 연결되어있다.  
파일이 많은 경우 디렉토리로 관리한다. => 같은 부류의 파일들을 같은 디렉토리로 구분하고 어떤 사람이 접근할 수 없는 디렉토리를 만들 수 있음.

SetGID  
해당 파일의 소유자의 그룹의 권한으로 실행함.

Sticky bit  
설정된 디렉토리 밑에 누구나 파일 생성이 가능함.  
해당 파일을 이름을 바꾸거나 이동하거나 삭제하는것은 소유자나 root만 설정 가능하다.

Super user  
접근 제어에 대한 제약이 없다.
  • 자원에 대한 인가되지 않은 사용을 막는다.

|-------------------------Auditing(기록 남김)-------------------------------|
User ---> Authentication function ---> Access Control Function ---> Resource
                                              ^                                     ^
                                              |                                       |
                                           인증                              접근 제어
                               (id/pw , 공인인증서 등)

  • Access control은 사용자가 본인이라고 가정한다.

  • 인증 과정은 접근제어 앞단에서 필요하다.

  • Authorization : 주체가 접근제어 정책에 따라 자원에 접근할 수 있는지에 대한 판단

  • Access : 주체와 객체 사이의 정보의 흐름

Access control이 필요한 이유?

  • 기밀성, 무결성을 지키기 위해서
  • 사용자가 비의도적으로 중요한 시스템 파일을 일거나 변경 하지 못하게 해주거나
  • 사용자가 비의도적으로 중요한 개인 파일에 대한 변경을 막아줌
    • 기밀성 = no read
    • 무결성 = no write

Access Control Requirements

  1. 신뢰되는 입력
    접근 시스템 앞단에 인증 기법이 필요하다. 인증 기법(사용자 인증)을 통과한 주체만이 접근제어의 대상이 된다.

  2. fine, coarse specifications 지원
    coarse => 크기가 큰 단위로 접근제어 수행 (초기 리눅스는 r/w/x)
    fine => 크기가 작은 단위로 접근제어 수행

  3. least privilege 최소권한
    업무를 하는데 필요한 최소권한만을 준다.

    • 일을 하는데 필요한 권한만 가저야한다.
      Ring구조는 HW적으로 최소권한을 제공해준다.

    • SetUID 프로그램들을 적게 만들어야한다.
      SetUID 프로글매이 취약시 문제가 커진다.

    • Need to know
      주체가 일을 하는데 객체에 대한 접근이 필요없다면 권한이 없어야한다.
      만약 append를 해야한다면 write권한이 아닌 append 권한만 주어야한다.
      => fine specification

  1. Separation of duty
    중요 업무를 처리하는 절차를 여러 단계들로 나누고, 각 단계를 서로 다른 주체가 자신의 권한으로 책임지게 한다
    • 거짓행위나 오류를 방어하는것이 목적
  1. open and closed policies
    closed policy : default 접근 허용하지 않고 명시된 접근만 허용한다.명단에 적힌 주체만 허용한다.
    open policy : default는 접근 허용 단 명시된 접근은 불허(블랙리스트와 유사)

  2. policy combinations and confilct resolution
    여러개의 접근 저책이 하나의 자원에 적용될 수 있음.
    한 자원에 대한 접근 권한 충돌이 날 수도 있음. 따라서 충돌이 발생되지 않게 해야함.

  3. 관리적 정책
    보통 super user만이 가능하며, 어떤 주체가 어떤 규칙을 만들거나 삭제, 수정가능한지 명시

  4. dual control
    일을 할때 둘 이상의 주체가 동시게 관여해야한다(특히 중요한일)

  • SOD = 2개 이상의 서로 다른 step에 대해 각각 다른사람이 수행

  • dual control = 한 step에 대해 2 사람 이상이 관여

  • BSD에선 root 계정을 가지게 된다면 1. root 비밀번호를 알고 있으며, 2. wheelgroup(GID = 0)이어여 한다.

=> 접근제어는 어떤 주체가 어떤자원, 어떤객체를 접근할 수 있는지 나타낸 것이다.

-> 비인가 사용자의 자원에 대한 접근을 막는다.

-> 적법한 사용자가 비인가된 방법으로 자원에 대해 접근하는 것을 막는다.

Access Control Models

  1. DAC : 임의 접근 제어
    owner가 알아서 함. 임의로 권한을 주었다 뺏었다 가능

  2. MAC : 강제 접근 제어
    관리자나 super user가 제어 통제한다.
    (e.g 군대 행정병(ovwner)이 문서를 썻다고 해도 마음대로 하지 못한다.)

  3. RBAC : 역할 기반 접근 제어
    역할에 따라 접근 제어
    (e.g 사원, 대리, 과장)

DAC


Discerionary Access Control

  • 자원의 소유주가 주체들이 객체에 접근할 수 있는지 임의대로 정한다.
    객체의 owner가 객체에 대한 허가를 가진다. => UID 기반으로 접근에 대한 허가, 일반적인 사용자가 접근제어 정책을 조정할 수 있음.

  • 사용자 신원과 객체의 소유권, 권한 위임에 기반하여 접근제어를 강제한다.

  • DAC는 security(인터넷이 연결되고 악의적 공격에 방어)보다 protection(멀티유저 - 비의도적 문제방어)에 집중

  • 사용자들은 악의적이지 않고 프로세스(악의적인 프로세스가 아님)는 신뢰한다고 가정함.

  • DAC Model = Access Matrix Mdel = Access control Matrix Model


(* 디렉토리 read = 접근 가능(들어감), execute = 검색 가능)

  • Access Matrix는 빈공간이 많을 수 잇으므로 리스트 형태나 희소행렬 형태 등으로 나타낸다.

1.  Access Control List => ACL : 객체 중심

    -   접근 할 수 있는 사람을 지정  
        \=> 새로운 사람 추가, 권한 위임 다른 사람에게 불가능, 사람 인증해야함

    -   장점 : 접근 가능한 객체 집합의 경계가 지정되지 않음. => object가 새로 생기면 이름을 붙이고 권한을 지정해줌.

    -   단점 : 웜, 바이러스 백도어, 스택 오버플로우, 큰 ACL을 사용할 경우 overhead가 큼, 분산환경에서 확장하기 어려움(  
        사진=>그룹의 사용자 수가 적고, permission bit 가 작으면 ACL이 편리

2.  Capability List : 주체 중심

    -   키를 나누어 키를 가진 사람이 접근 할 수 있게 함  
        => 새로운 사람 추가는 키를 나누어주면됨, 키를 주면 다른사람에게 권한이 위임됨, 키를 돌려받기 어렵고 복제할 수 있음
    -   장점 : 최소 권한 원칙지키기 쉬움 =>주체가 접근할 수 있는 객체들만 나열해서 관리, 확장하기 쉬움(티켓만 확인) => 분산 환경에서 쓰기 좋음(분산환경은 한번만 인증하고 여러 서버에서 접근함)
    -   단점 : 접근 가능한 객체 집합의 경계가 지정됨. => 통제됨

 3. Authorizaion Table
     - DB에서 많이 씀



4. Protection Domains
    - 주체 중심으로 봄, 주로 프로세스
    - 어떤 프로세스가 어떤 객체를 어떻게 접근할 수 있는지 표현한 집합
    - 어떤 프로세스가 어떤 일을 요청할때마다 관리해야할 정보의 양을 줄일 수 있음 => 상속을 하므로 (fork - 부모가 연 파일을 자식이 상속받아 사용가능)
    - 역할 기반으로 protection domain 사용 가능
    - 어떤 프로세스가 접근할 수 있는 자원들의 집합
    - access matrix에선 하나의 행이 protection domain을 정의함
    - capability와 연결되면 protection domain 개념과 가까움(ACL보다 capability가 protection domain 개념에 가까움)
    - 사용자는 프로세스를 생성 하는데, 새 프로세스는 사용자가 갖는 권한의 부분집합을 가지게 됨, 하나의 protectino domain이 생김 => 어떤 프로세스가 접근할 수 있는 자원들의 집합이기 때문에
    - 프로세스가 사용자 모드일 경우 => 일반 명령어(자원 제한)
    - 프로세스가 특권 모드 => 특권 명령어(자원 제한 x)




5. Extended ACL
    - user/group/others 에 named user와 named group을 도입
    - named user와 group을 통제하기 위해 mask entry가 필요하다.
    - mask entry : named user, group이 가질 수 있는 최대 permission
    - 새로운 명령어들을 지원함.
    - getfacl : 확장된 ACL 정보를 가져온다.
    - setfacl : named user, group에 대한 ACL을 수정하거나 추가 => permission 추가
    - chacl : change acl of file or directory



- 임의의 수 naemd user, group이 하나의 파일과 연결될 수 있음. 따라서 추가적인 protection bit가 사용됨
     => 세분화 시켜서 특정인에게 named user라는 권한을 주고, group이 아닌 일반 특정인한테 특정 permission을 줌

 - 다양한 class => named user, group 추가됨

 - ACE => user나 group을 위해서 permission을 정의하는 entry들의 집합

 - ACL Caching을 하여 속도를 높이기도 함

  - 접근 체크
    1. 객체 중심으로 체크 => 소유주 인가? named user인가? 그룹인가? others인가? 체크
    2. 그 후 권한 할당

 

 

 

 * 장점

  • 사용자/소유주가 스스로 접근 권한을 설정할 수 있어서 시스템 관리자의 부담이 작음
    • 개별 사용자의 접근제어, 그룹 단위의 접근 제어도 제공한다.
    • 권한 변경 쉬움 => chmod, setfacl, chacl
    • 새로운 권한 설정도 쉬움
    •  
  • 단점

    • 소유주가 파일에 대해 전체적인 권한을 가짐 => 사용자를 절대적으로 신뢰
      • 사용자가 실행시킨 프로세스는 사용자의 권한을 가진다. (기본적으로 사용자의 EUID로 실행한다.)
      • 만약 사용자가 실행시킨 프로세스가 악성코드에 감염이 되어있으면 문제가 생긴다. 따라서 권한을 분리해야한다.
      • SetUID root 프로그램이 취약점이 있으면 문제가 생긴다.
      • 12개의 bit로 permission 관리시 문제가 있을 수 있다. 따라서 세분화 해야함.
      • 전역적인 접근제어 정책이 있다면, 그 전역적인 접근제어 정책에 대해서 일관성을 유지하는 것이 어렵다.
        => 병원 에서 환자리스트를 주치의만 접근가능하게 했지만, 다른 의사에게 위임이 가능하다. 따라서 전역적인 접근제어 정책 유지가 어렵다.
      • 정보가 한 객체로부터 다른 객체로 임의로 복사 할 수 있다.
        =>원본객체 소유자가 자신이 소유한 객체에 대해서 복제되지 않는 것을 원하지만, 소유자의 동의없이 임의로 복제가 발생할 수있다.
      • 정보흐름 정채긍ㄹ 정확하게 원하는 방향대로 집행하는데 적합하지 않다.
      • 주로 군에서 문제가 발생한다.

    =========================================================================
    만약
    파일 A => a가 소유하고 b가 읽을 수 있음
    파일 B => b가 쓸 수 있고, c가 읽을 수 있음
    => a는 c가 파일 A를 읽지 못하게 함.
    이러한 상황일때
    b가 나쁜맘을 먹고 파일 A를 읽고 파일 B에 쓸 수있다. 그러면 c는 A의 내용을 읽을 수 있게 된다.

    파일 A => a가 소유하고 b가 읽을 수 있음
    파일 B => b가 쓸 수 있고, c가 읽을 수 있음
    트로이 목마 => b가 실행할 수 있다. c가 r/w/x 가능

    b가 나쁜맘을 먹지 않아도, c가 트로이 목마를 만들어 b에게 주면 b가 자신의 권한으로 트로이 목마르 실행하게 되고
    A의 내용을 읽어서 B에 쓰도록 트로이 목마가 작동하면 c가 내용을 알 수 있다.

    ========================================================================
  • 한계

    • 악성 프로그램 :소유주에 의해서 실행된느 악읮거인 프로그램이 그 소유주를 대신해서 DAC정책을 변경할 수 있다.
    • 결함이 있는 프로그램 : 취약한 SetUID 프로그램과 같이 취약점을 이용하여 DAC정책 변경 가능
    • 특정한 권한을 취소하지 않는 이상 그 권한을 제한 시키는 것은 어렵다
    • 사용자나 자원의 수가 증가할수록, 접근 권한을 관리하는 것은 복잡하고 어렵다.
    • 부여한 권한이 합리적인지 판단하기 어렵다
    • 접근 허가에 대한 개별적인 위임으로 인해서 접근제어 정책에 있어 불일치가 발샐할 수도 있다.(e.g 주치의만 환자리스트 접근가능 -> 다른 의사에게 위임)
    • 객체의 소유주가 모르는 어떤 사용자한테 접근이 허용될 수도 있다.
    • 권한을 한정시키는 수단이 비실용적임.

728x90
반응형

'공부 > 보안' 카테고리의 다른 글

Role-Based Access Control (RBAC)  (0) 2020.12.08
Access Control MAC (2)  (0) 2020.12.03
Return-Oriented Progamming  (0) 2020.11.03
Return-tol-libc Attacks  (0) 2020.10.17
Other Overflow Attacks  (0) 2020.10.16
블로그 이미지

아상관없어

,
반응형

Retrun-Oriented Programming (ROP)


이전 return to libc 공격에서는 System함수와 exit함수를 사용하였다. 하지만 System 함수가 라이브러리에 없을 경우에는 어떻게 공격을 하는가? 요즘 시스템들은 취약한 함수들을 제거하기 시작했다.
따라서 code chunk들을 연결하여 원하는 동작을 수행 할 수 있도록 잘 엮어서 공격을 할 수 있다.

Chanining Function Calls (WITHOUT ARGUMENT)

(함수 인자가 없는 경우를 다루겠다. 인자가 있는 경우는 너무 복잡하다.)

아래의 그림과 같이 함수들을 배치해주면 된다.

그러면 어떻게 원하는 동작을 하도록 하게 할까?

return to libc 공격에서는 공격자가 system함수가 수행되길 원한다. 하지만 위험한 함수들은 제거되므로 code chunk를 엮어서 사용하여야 한다.

위 그림과 같이 원하는 글자를 가져와 조합하면 원하는 문장을 만들 수 있다. 이와 같이, 이미 존재하는 코드 조각들을 맞추면 즉, 이미 있는 명령어들의 조각을 찾아서 조합하면 system이나 execve과 같이 구성을 할 수 있다.

따라서

- 코드 주입이 필요없다.

- libc 함수를 호출할 필요가 없다.

- 원래코드를 수정할 필요가 없다.

먼저 명령어들의 조각들을 조합하여 합치기전 instruction sequences와 gadget을 알아야한다.

- intstruction sequences는 작은 명령들의 순차이다. 명령어 순차는 2~5개의 명령으로 구성되어 있다.

- instruction sequences는 반드시 return으로 끝나야한다.

- gadget은 순차들을 체인으로 연결한 것이다.

- 하나의 gadget은 특정한 업무를 수행한다. ( load, store, xor, branch와 같은)

이러한 가젯들을 연결하여 원하는 행동을 할 수 있다. 그리고 또한 ROP역시 Code Reuse Attack이다.

버퍼 오버플로우를 일으키는 프로그램이 있을 때, payload를 다음과 같이 구성한다.

패턴1 (버퍼) + 패턴2 (saved Ebp) + ret_addr1 + ret_addr2 + ret_addr3 + Argument + ret_addr4 + ret_addr_5 + ret_addr+6

그러면 다음과 같이 순차적으로 동작할 것이다.

하지만 3번째 명령어를 보면 pop을 하므로 인자가 필요하다.

따라서 Return Address 3 위에 Argument를 넣어준다.

그리고 순차적으로 6번째 명령어까지 실행이 될 것이다.

Unintended Instruction Sequences


프로그래머가 의도하지 않은 방식대로 명령어 조합이 가능해진다.

valid한 명령어의 중간 부분에 있는 주소로 점프하게 만들면 의도하지 않은 명령어 순차가 실행되게 된다.

의도되지 않은 명령 순차들이 x86 아키텍쳐에서 가능한 이유는

  1. 명령어는 가변이다. (CISC)

  2. unaligned memory access

    N으로 나누어 떨어 지지 않고 임의의 주소로부터 읽기가 가능하다.

    e.g)

b8, 13, 00, 00, 00 중 아무곳부터 읽기가 가능하다.

위의 그림을 보면 mov와 jmp 명령어가 다음과 같은 Byte values를 가지는 것을 알 수 있다. 하지만 여기서 정상적으로 b8부터 읽는 대신에 첫번째 00으로 점프하게 하거나, return을 00으로 한다면 [b8 13] , [00 00], [00 e9]와 같이 되며, add %al, (%eax)와 같이 다른 명령어가 된다.

처음 의도한 move, jump 명령어가 add, add, return으로 바뀌게 된다.

Gadget 예시


0x8010ABCD 주소안의 0xDEADBEEF를 eax 레지스터에 로드하려고 할때.

먼저 가젯을 구성하고, 버퍼 오버플로우를 일으킨뒤 Sequence 1을 가르켜 실행되게 한다.

 

위와 같이 payload를 구성해야한다. 패턴1(버퍼) + 패턴2(saved Ebp) + ret_addr_1 + "\x8D\xAB\x10\x80" + ret_addr_2

 

리틀 엔디안이므로 주소를 반대로 적고 movl 64(%eax), %eax이므로

eax 주소에서 64만큼 더해서 그곳에 있는 값을 eax로 가져오므로 

원하는 DEADBEEF가 있는 주소 0x8010ABCD 에서 64만큼 뺀 주소를 넣어야한다.

 

 

순차적으로 실행이 되며 최종적으로 eax레지스터에 DEADBEEF가 들어가게 된다.

 

 

 

 

ROP 공격은 NX bit(Non executable stack)을 우회할 수 있다.

하지만 이러한 공격을 하기위해 프로그램 언어와 컴퓨터 구조, 함수 동작원리 등을 이해하고 있어야한다.

 

이러한 공격을 막기위해선, 가젯 Free Code를 사용하여 가젯 구성을 막아 공격을 막을 수 있다.

728x90
반응형

'공부 > 보안' 카테고리의 다른 글

Access Control MAC (2)  (0) 2020.12.03
Access Control & DAC (1)  (0) 2020.12.03
Return-tol-libc Attacks  (0) 2020.10.17
Other Overflow Attacks  (0) 2020.10.16
Buffer Over flow 2  (0) 2020.10.16
블로그 이미지

아상관없어

,

딥러닝 4

공부/딥러닝 2020. 10. 29. 01:34
반응형

#Artificial Neural Network

History

  • 1943년 Warren McCulloch, Walter Pitts가 제안
  • 1950년대 Perceptron 나옴(응용 가능할만해짐 하지만 선형분리만 가능
  • 1990년대 Multi-layered Perceptron(선형 분리문제 해결했지만 층을 많이 쌓으면 잘 안되는 문제점)
  • 요즘 Deep Neural Network
  • 거의 산업 전 분야에 적용됨.

개념

입력층, 은닉층, 출력층으로 구분됨

 

은닉층의 개수에 따라 분류 가능

 

층을 많이 쌓을수록 복잡한 문제들을 학습가능하지만 시간이 오래걸림

 

 

에러 : 예측값(0~1사이 값)과 정답의 차이

에러가 발생한 부분만큼을 feedback함

노드의 선들에 weight가 있음

 

모델은 구조 + weight값으로 정의가능

 

 

Perceptron

 

가장 단순한 형태의 신경망

다수의 신호를 입력으로 받아들여 하나의 신호(원하는)를 출력하는 알고리즘

 

 

Machine learning by perceptron

 

다음의 데이터로 가중치, 편항, 활성함수를 구해야함.

 

 

- weight value

 

전기회로의 저항과 유사하지만 인공신경망에서는 weight value가 크면 입력값이 출력에 많이 전달되고, 작으면 입력값이 출력에 적게 전달된다.

만약 x1은 큰값이고, x2는 작은 값일 경우, x1w1 + x2w2할 경우 x2가 잘 반영이 되지 않는다.

 

- 편향

 

b값에 따라 y값이 0또는1에 치우친 값이 나오므로 편향이라고 함.

만약 환자 = 0, 정상인 = 1로 진단하는 인공 신경망이 있을 때, 환자를 정상인으로 오인하는 것을 막기위해 |b|값을 크게 함 => 정상인이라는 증거가 충분히 클때만 정상인으로 판단

 

* weight = 각각의 입력신호가 출력에 영향을 주는 정도 조절

* bias(편향) = 뉴런이 얼마나 쉽게 활성화 되는지를 조절

 

예를 들어 and 연산을 구하는 인공신경망을 어떻게 만드는가?

머신러닝으로 weight, bias, 임계점 구함

 

 

Design of neural network

input node의 수는 feature의 수이다.

output node의 수는 class의 수이다.

 

 

4개의 클래스를 구분하기 위해선

|0|0|1|1|                                    |1|0|0|0| =>1

|0|1|0|1|                                    |0|1|0|0| => 2

 |  |  | |                                     |0|0|0|1| => 3

 |  |  | |                                    |0|0|0|1|  => 4

 v v v v                                   

1, 2, 3, 4

 

처음의 경우가 아닌 뒤의 경우로 4가지 클래스를 구분한다.

 

인공신경망을 설계할때

1. 히든 레이어의 수

2. 히든 레이어 별 노드수

3. 활성함수(모든 레이어마다)

4. bias 값

을 구해야 할 것이다.

 

곱셈연산을 하므로 값이 1 이상이 나오지않게 각 노드들의 값은 0~1사이이다.

 

선형분리 문제만 해결가능한 것을 극복하기 위해 다층 perception을 사용한다.

728x90
반응형

'공부 > 딥러닝' 카테고리의 다른 글

CIFAR-10 의 레이블중 하나를 예측  (0) 2021.05.09
classification 경진대회  (0) 2021.05.03
딥러닝 3  (0) 2020.10.09
딥러닝 2  (0) 2020.09.29
딥러닝 1  (0) 2020.09.25
블로그 이미지

아상관없어

,
반응형

Control Hijacking Attacks


  • control flow
    프로그램이 여러개의 문장 또는 명령어로 되어있는데, 프로그램에 있는 문장, 명령어, 함수 호출들이 실행되는 순서를 의미한다.

  • Control Hijacking Attacks
    프로그램의 에러를 활용한다.
    메모리조작 취약점을 사용한다.(메모리를 깨뜨리는 취약점)
    runtime때 의도된 제어프름을 덮어쓴다.

    • control Hijacking Attacks = Control-flow hijacking attacks
      control flow을 바꾼다.
      code pointer의 위치가 바뀌어진다. => PC(program counter)에 영향을 주는 값이 code pointer이다. 따라서 다음에 실행될 명령어가 달라진다.
      접근하지 못하는 메모리 영역을 바꾼다. => 변조되지 않아야할 영역까지도 달라질 수 있다.

      주로

      1. code injection attack
      2. code reuser attack
        이 있다.

Control Flow Graphs


프로그램들은 basic block들로 구성되어 있다.
CFG는 basic block들이 어떤 순서대로 흘러가는지 보여준다.

 

  • basic block
    프로그램의 일부로, 실행되는 코드영역이다. 차례차례 실행되는 프로그램 영역이다.

    하나의 진입점이 있으면 진출점도 하나밖에 없다.

    basic block 안에서는 모든 명령들이 순차적으로 실행된다.

  • control flow graph
    방향이 있으며 노드는 basic block을 가리키고 엣지는 control flow path를 가리킨다.

Code Injection Attack & Code Reuse Attack


  • Code injection attack 일반적인 방식

    공격자는 새로운 basic block을 추가하고 취약한 노드의 제어흐름을 조작한다.

  • Code reuse attack 일반적인 방식

    공격자가 새로 추가하는 노드는 없다.
    노드의 취약점으로 본래의 다른 노드로 가게 흐름을 바꾼다.

Code Injection Attack

control hijacking 중 하나이며 흐름이 주입된 코드로 덮여쓰여진다.
일반적으로 shell code를 주입한다.

shell code는 주로 버퍼에 저장되며 제어 흐름을 shell로 이동시켜주는 역할을 한다.(새로운 shell이 만들어짐)
shell code는 기계어로써, 프로세서와 운영체제에 따라 다르게 작성되어야한다.

Code Reuse Attack

원래 프로그램 코드를 의도하지 않은 방향으로 조작한다.
일반적으로 실행가능한 코드는 code segment와 library에 존재한다.

예시로 Ret2Libc, Rop, Jop가 있다.

Return-to-libc Attacks


  • Non executable Stack 우회 가능

const char code는 전역변수이다. 전역변수는 Data segment에 위치한다.

 

((void(*)()))buffer)()로 함수포인터로 cast한다.

 

지역변수 buffer의 주소로 함수를 호출한다.

 

buffer가 지역변수이기 때문에 실행되진 않는다.(non executable stack)

하지만 code를 직접실행하면 된다.

 

 

 

** 함수포인터?

 

 

 

어떻게 non executable stack을 우회할 것인가?

 

libc => c는 common으로 모든 프로그램에 연결되는 공통 라이브러리를 뜻한다.

libc 안의 "system" 함수의 취약점을 사용한다.

system함수는 인자로 들어오는 명령어들을 실행해준다.

 

return address를 system함수가 있는 위치로 가게하고 인자로 원하는 명령어를 준다면 공격이 성공할 것이다.

 

 

그림의 경우 버퍼의 크기는 100바이트 이다.

정상적이라면 왼쪽 그림과 같은 상황인데, 여기서 버퍼를 넘치게하여 리턴 주소와 함수 인자를 조작하여야한다.

 

일반적으로 함수가 호출될때 리턴 주소위에 인자가 있다.

 

따라서 이점을 이용한다면 system함수를 호출하고 인자로 원하는 명령어를 넣을 수 있다.

 

1. return address에 system의 주소를 가리키게한다.

2. saved ebp는 아무값이나 주어도된다.

3. system함수의 인자로 /bin/sh의 주소를 준다. => /bin/sh이 있는 환경변수의 위치가 주소일것이다.

4. crash가 나지 않게하기위해 exit를 넣어준다. => 왜냐하면 인자 밑이 리턴주소인데, system 함수 인자인 /bin/sh의 주소 밑이 return address가 되므로 exit가 return address가 된다. 

 

 

일종의 system 이라는 것이 call 되는 것이고, 시스템 함수가 call 되면 arg가 쌓이고 return address가 쌓인다.

따라서 exit가 return address가 된다.

 

-------------------

|  arg = bin/sh   |

-------------------

| ret = exit        |

-------------------

|   addr(system) |

-------------------

 

 

 

따라서 여기서 버퍼의 크기는 80바이트이다. 공격을 위해선 saved ebp, ret(addr(system)), exit, addr(shellcode) 4가지가 필요하므로

32bit 컴퓨터라 가정시 버퍼에 총 96바이트가 들어가야한다.

 

따라서 원래 버퍼에 80바이트 만큼 A를 넣어준다. 그리고 saved ebp에 4바이트의 B를 넣고, system이 있는 곳 0x40058ae0을, 위의 예시에선 exit를 넣어주지 않고 아무값이나 넣었다. addr(shellcode) = system함수의 인자에는 /bin/sh이 있는 곳 환경변수의 주소를 넣었다.

 

728x90
반응형

'공부 > 보안' 카테고리의 다른 글

Access Control & DAC (1)  (0) 2020.12.03
Return-Oriented Progamming  (0) 2020.11.03
Other Overflow Attacks  (0) 2020.10.16
Buffer Over flow 2  (0) 2020.10.16
Buffer Overflow Attacks 1  (0) 2020.10.16
블로그 이미지

아상관없어

,
반응형

버퍼가 heap에 있어야함. => malloc, calloc

heap에는 ret이 없어서 흐름 조작하기 어려움.

 

chunk에는 함수에 대한 포인터 변수 process가 있음

malloc으로 64+4 = 68바이트를 할당함.( 함수 포인터 4byte)

 

showlen을 process로 넘기고 gets를 이용하여 인자를 받음

 

밑의 b코드를 부면 shell code를 넣기 위해 nop를 채우고 쉘코드를 넣는다 (64byte만큼) inp가 64이므로

그리고 64byte 다음에 주소를 넣는다. 이값은 gets를 통해서 전달이 된다.

(리턴 주소는 못 덮어주므로 함수에 대한 포인터 변수를 덮어씀)

 

attack2 | buffer5를 하면  |는 파이프로 프로세스간 통신이 가능하게 해준다.

떠라서 attack2의 값이 넘어간다.

64byte를 넘어 주소값이 포인터 변수를 덮어 쓰게 된다. 주소값은 inp[0] ~[17]사이의 아무 주소이다.

nop을 실행하게 한다.

 

 

 

 

*방어법

 

 

함수 포인터 위치를 inp위로 =>inp가 넘쳐도 함수 포인터는 영향이 없다

또는 힙에서 명령어가 실행되지 않게 한다.

 

 

 

 

 

 

***전역변수 공격

 

heap과 동일한 방법임

 

728x90
반응형

'공부 > 보안' 카테고리의 다른 글

Return-Oriented Progamming  (0) 2020.11.03
Return-tol-libc Attacks  (0) 2020.10.17
Buffer Over flow 2  (0) 2020.10.16
Buffer Overflow Attacks 1  (0) 2020.10.16
set-UID Privileged programs  (0) 2020.10.15
블로그 이미지

아상관없어

,

Buffer Over flow 2

공부/보안 2020. 10. 16. 22:00
반응형

버퍼 오버플로우 => 버퍼가 수용할 수 있는 것보다 더 많이 입력을 받아 주변에 있는 다른 정보를 덮어쓸 수 있는 조건이다.

 

c언어에서 많이 발생한다. c언어는 쓰기 연산이 주어진 범위 내에서 일어나는지 체크하지 않는다.

 

 

 

버퍼 오버 플로우 공격 준비

 

1. 프로그램 내에 버퍼오버 플로우가 존재하는지 확인한다.

2. 실행 중인 프로세스에 굉장히 큰 입력을 주어서 그 프로그램의 실행을 추적한다.

3. fuzzing = 잠재적으로 취약하다고 생각되는 프로그램이 실제로 취약한지 아닌지를 임의의 입력을 주어서(자동으로 주입)어떻게 반응하는지 관찰하는 기법

 

메모리에 버퍼가 어떻게 저장되는지을 알아야 공격 방법을 이해할수 잇다.

 

결과로 공격자가 제어 이동이 가능하고 메모리 접근 위배를 할 수 있고 공격자가 원하는 코드 실행이 가능하다.

메모리 접근 위배 => 예로 stack에 악성 코드를 주입해서 실행한다면, 이것은 메모리 접근을 위배함. 본래 메모리 접근상 스택은 읽고 쓸 수만 있기 때문이다.

 

*버퍼 오버플로우는 스택만이아니라 다른 곳에서도 가능하다.

 

 

- 기계어 수준 : 모든 데이터는 바이트의 배열이다. 사용하는 명령어에 따라 해석된다.

- 현대 고급언어 : 대부분 strong type을 씀. 자바나 파이썬은 버퍼오버플로우에 취약하지 않음 하지만 JVM이 필요하고 속도가 느림

- c언어 : 메모리 직접접근 가능 따라서 권한이 막강하지만 버퍼오버플로우에 취약함.

 

 

버퍼 오버플로우를 막기위해 안전한 함수들을 사용함.

strncpy는 마지막에 null을 포함하지 않으므로 strlcpy를 사용하는 것이 좋다.

 

 

* strings 명령어

 

strings 명령어를 사용하면 프로그램에 있는 모든 문자열을 볼 수 있다.

따라서 실행 파일 내에 어떤 취약한 라이브러리가 있는지 확인 가능하다.

 

 

 

 

 

 

 

 

 

 

 

 

 

공격을 하기 위해선 AT&T syntax인지 Intel syntax인지 고려하여야 된다.

또한 Big, Little endian인지도 고려하여야 된다.

 

버퍼 오버플로우는 효과적이고 원격으로도 공격이 가능하다.

 

하지만 아키텍쳐에 의존적이고 (at&t, intel or big little endian) 

운영체제에 의존적이다 => 취약한 라이브러리나 시스템콜을 사용하는가

주소를 추측해야한다. 

 

오버플로우는 ret이나 saved ebp 등을 바꾸어 공격할 수 도 있다.

 

 

 

 

 

 

방어기법

==========================================================

 

프로그래밍 언어를 자바나 파이썬을 사용한다. -> 경계체크를 하기 때문에

 

프로그램 정적 분석기를 사용한다. => 여러 개발자들이 함께 큰 프로그램을 만들었을때 사용이 편함

(SDLC => 소프트웨어 개발 생명 주기를 늘려줌)

 

 

컴파일러 수준에서는 스택가드를 사용하거나 스택 쉴드를 사용한다.

함수가 호출 될때 가드를 설정하고 함수를 리턴할때 가드가 제대로 남아있는 지 확인 한다.

(가드는 함수 호출할때 미리 설정한다.)

 

스택 쉴드는 2개의 스택을 사용한다.

리턴 주소만 저장하는 shadow 스택을 사용하여 함수가 리턴될때 call stack, shadow stack을 비교하여 일치하지 않을 경우 종료 시킴

 

 

** 스택 보호기법 해제법

 

 

 

 

 

특정한 영역을 실행 불가능하게 한다.

stack이나 heap아니 global data에 명령어가 있으면 실행하지 못하게 함(code segment는 당연히 실행해야함)

메모리 관리 장치의 도움이 필요하다.

 

 

하지만, LISP과 같이 stack에서 실행해야하는 언어들은 사용이 불가능함.

 

 

어떤 메모리 영역은 w나 x둘중 하나만 제공해줌

그것을 하버드 아키텍쳐라고 부름 코드와 데이터를 엄격히 분리 시켜줌

 

하지만 JIT과 같이 heap에서 실행해야하는 경우가 있다.

return to libc 공격을 막을 수 없음

 

 

data 영역으로 바뀔 경우 DEP가 막아주어 d 코드가 실행되지 않게 해줌

 

 

주소를 랜덤화시킴

 

 

728x90
반응형

'공부 > 보안' 카테고리의 다른 글

Return-tol-libc Attacks  (0) 2020.10.17
Other Overflow Attacks  (0) 2020.10.16
Buffer Overflow Attacks 1  (0) 2020.10.16
set-UID Privileged programs  (0) 2020.10.15
운영체제보안 4  (0) 2020.09.22
블로그 이미지

아상관없어

,
반응형

Stack 기본 개념

====================================================================

Data segment에는 초기화된 전역변수가 들어가고, BSS segment에는 정적변수, 초기화되지 않은 전역변수가 들어간다. (BSS = Block Started by Symbol)

ptr 안의 값은 Heap 영역에 있게 된다.

 

ebp는 stack의 base pointer이다. 

b는 ebp에서 12byte 위에 저장이 되는 것을 알 수 있다.

 

PC는 다음에 실행할 명령어의 위치를 가리키며, Text segment에 있다.

f가 호출되면 f의 stack frame이 push된다.

 

ebp는 하드웨어적으로 하나 밖에 없음.

가장 마지막에 stack에 push된 프레임을 가르킴.

 

 

fopen을 하여 read로 badfile을 open하고, open한 파일의 포인터를 변수badfile에 줌

그리고 badfile 변수가 가르키는 포인터로부터 300바이트를 읽어서 str로 가져옴.

 

 

foo는 300바이트를 받아서 strcpy를 함.

foo에 대한 스택 프레임이 생성됨.

 

300바이트를 100바이트에 카피하게됨 => 넘치게됨.

 

버퍼가 넘치게 되면서 return 주소가 덮여쓰여지게 된다. 

 

정상적인 명령들은 code segment에 잇음

 

return주소가 커널 영역을 가리키면 Access violation이 일어난다.

 

공격에 성공하면 공격자의 코드가 실행됨

 

버퍼에 300바이트를 주면 ret이 바뀌게 되고 ret이 악의적인 실행코드를 가리키도록 함.

 

실습하기 위해선 설정을 해야함.

 

1. 주소를 랜덤화하는 방어기법을 끈다.

2. 스택에서 명령어가 실행되도록 하고, stack protector를 끈다.

3. owner를 root로 하고, setUID bit를 설정한다.

 

공격자 입장에서는 두가지 문제점이 있음.

 

1. 버퍼와 리턴 주소의 차이 거리(offset)를 알아야함. => 그래야 리턴 주소 변경가능

2. 쉘코드를 어디에 넣을 것이냐? => 리턴 주소가 쉘코드를 가리키게 해야함

 

디버깅을 하여 foo를 break함

ebp를 보면 0xfffeaf8임을 알 수 있고 buffer의 시작주소가 0xbfffea8c임을 알 수있다.

그 차이는 108byte임을 알 수 있다.

saved ebp 4byte를 더하면 버퍼 시작으로부터 리턴 주소가 112바이트 만큼 떨어져잇음을 알 수 있다.

 

인자가 어디에 전달되는지 봐야함.

인자의 주소를 확인하면 0xbffff370임을 알 수 있다.

 

리턴 주소위에 인자가 쌓이므로 악의적 코드는 인자보다 위에 쌓으면 됨.

NOP을 넣어서 아무것도 실행하지 않는 코드를 넣는다

NOP는 다음 NOP로 다음 명령어를 넘기므로 계속해서 넘기다보면 악의적인 코드를 실행하게 됨.

 

디버깅을 통해 버퍼의 시작주소 리턴 주소간의 간격을 알았고, 리턴 주소에는 nop중 하나의 위치를 가리키게함.

 

파이썬으로 badfile을 만드는 것이다.

300 바이트를 nop로 채우고 쉘코드를 젤 뒤에 넣는다.

리턴주소는 버퍼의 시작주소에서 112만큼 뒤에 있다.

 

euid가 root로 바뀐것을 볼 수 있다.

 

dash는 보호기법이 있기때문에 zhs를 사용해야한다.

dash는 setUID 프로세스 내에서 실행될때 권한이 내려간다(real user)

 

기계어를 사용해야하지만 컴파일러를 통해서 만듬

name[0]  => bin/sh의 주소

name의 주소, NULL

 

execve는 11번임

주소값 bin/sh의 주소

argv의 주소

int 0x80 => 소프트웨어 인터럽트를 검

al에는 execve 콜 번호 11이 들어감

 

 

ebx 첫번째 인자 => bin/sh의 주소

eax => execve 번호 11

ecx => argv 주소

edx => 0

 

 

 

 

 

대응책

==================================================

1. 안전한 함수 사용

2. 안전한 라이브러리 사용 => 경계를 체크하는 함수

 

운영체제 => ASLR

 

컴파일러 => 스택가드

 

HW => NX bit

 

 

ASLR

---------------------

스택의 위치를 랜덤화 시킨다. => 코드가 메모리에 적재될 때 마다

공격자는 주소를 모르게 되고 ret과 shell code의 위치를 알기 어려움

 

sysctl -w kernel.randomize.va.space => 0,1,2 

 

2로 하였을때 완벽하진 않음

 

 

./stack을 12524번 실행하면 공격이 된 것을 알 수있음

 

 

 

 

 

Stack Guard

---------------------------------------------------------------------------------------------------------------------

 

guard를 0x00이나 NULL을 쓰면 ret을 덮어쓸수 없다 => NULL에서 끝나기 때문에

guard가 덮여쓰여지지 않으면 실행하고 덮여쓰여지면 중지함, canary라고도 함

 

dash는 EUID와 RUID가 다르면 setUID 프로그램을 non setUID프로그램으로 만듬

 

따라서 RUID를 높여야한다.

그러므로 복잡해진다 공격코드가

dash도 안전하진 않음

 

 

NX bit

----------------------------------------------------------------------------------------------------------------

메모리 영역 중 일부를 명령어가 실행되지 않도록 한다.

공격 코드가 들어가더라도 실행이 되지 않도록한다.

 

 

 

728x90
반응형

'공부 > 보안' 카테고리의 다른 글

Other Overflow Attacks  (0) 2020.10.16
Buffer Over flow 2  (0) 2020.10.16
set-UID Privileged programs  (0) 2020.10.15
운영체제보안 4  (0) 2020.09.22
운영체제보안 3  (0) 2020.09.16
블로그 이미지

아상관없어

,
반응형

Set- UID Privileged Programs


Need for Privilieged Programs

예를 들어 /etc/shadow 파일의 권한을 보면

-rw-r----- 1 root shadow 1443

=> 오직 오너만이 write할 수 있다.

하지만 일반 유저들이 그들의 비밀번호를 바꿀때 어떻게 바꿀 수 있을까? 특권 프로그램을 이용해서 바꾼다

일반적으로 운영체제 내에서 세부적으로 접근 제어를 하는 것은 굉장히 복잡하다.
rwx 3가지 권한을 세부적으로 할 경우 write를 1. 앞에 2. 중간에 3. 뒤에 와 같이 3가지로 나눌 수 있다. 하지만 복잡해진다.

따라서 rwx + 3bits 총 12비트로 permission을 나타낸다.
(확장, fine-grained access control을 위해 3bits를 추가한다.)

일반적으로 OS가 제공하는 접근제어를 바로 사용가능하지만 (e.g system call)
특별한 경우(e.g root가 가진 파일 수정)는 특권 프로그램이 필요하다! => setUID가 설정된 프로그램이 필요하다! 혹은 daemons
(관리자(super user)를 믿는다고 가정한다. 일반 사용자들은 특권 프로그램을 이용해서 바꿀 수 있다)

Different Type of Privileged Programs

  1. Daemons in Linux (MS Windows 에서는 services)
    백그라운드에서 계속 수행된다. 따라서 키보드로 부터 입력을 받을 수 없다.
    root나 특권을 가진 유저의 권한으로 실행해야한다.

    • 만약 daemon에게 요청을 하고 요청이 타당하면 daemon이 수행한다.
      (특히 Network는 Service를 위해 daemon들을 많이 사용한다.
      ps - af, ef, af 등을 통하여 모든 프로세스들을 보면 d로 끝나는 것들이 있다.
      Network daemon을 뜻한다. => 중요한 일을 하므로 root의 권한을 주던지 어떤 특권이 있는 사용자의 권한으로 돌아간다.
      중요한 일을 하므로 daemon을 임의로 만들지 못한다.
  2. Set-UID Programs
    Unix 시스템에서 사용된다.
    특정한 비트가 표시되어있는 프로그램이다.

Set-UID Concept

  • superman story

    1. Power suit 1.0
      Super man은 자신의 모든 권한을 superpeople 준다.
      문제점 : superpeople중 나쁜 사람이 있을 수 있다.

    2. Power Suit 2.0
      주어진 일만 가능하게 한다.
      특정한 일을 위한 컴퓨터 칩을 같이 내장한다. => chip에서 시킨 일만 함
      미리 프로그래밍이 되어 있어 프로그래밍된 일만 한다.

setUID는 위와 같은 매커니즘을 리눅스 운영체제에 구현한 것이다.
  • 프로그램의 소유자 권한으로 실행을 할 수 있게 해준다.

  • 일시적으로 권한을 상승시켜준다.

    예시)
    $ ls -l /usr/bin/passwd

    -rwsr-xr-x 1 root root 41284 Sep 12 2012 /usr/bin/passwd

    • s : setUID가 설정되었다.
    • others가 r-w로 누구나 실행가능하다. => 실행하는 동안 권한이 root로 상승된다.
    • /usr/bin/passwd : pw 변경 명령어 이다.

root가 실행? => RUID == EUID
seed가 실행? => RUID != EUID
(EUID = 현재 명령을 수행하는 주체의 UID, RUID : real UID 프로세스의 주인)

  • 일시적으로 권한을 상승시켜주기위하여 프로세스들은 사용자 ID를 두가지 가진다.

  • Real UID : 프로세스의 실제 주인

  • Effective UID (유효 사용자 아이디) : 권한 식별
    (권한 제어는 EUID에 기반한다.)

  • 일반 프로그램이 실행되었을때 RUID와 EUID는 같지만, setUID 가 실행되었을때는 다르다.

mycat의 owner를 root로 변경하였다.

mycat으로 /etc/shadow를 보려하면 권한이 없는 것을 볼 수 있다.

chmod로 "4"775로 setUID를 설정하였다. (setUID bit 설정)

그러자 /etc/shadow를 볼 수 있다.

setUID bit를 설정하였을 때, euid가 root가 됨을 알 수 있다.

exec전에는 RUID=EUID=25

exec을 하면서 owner가 17이고 setUID가 설정된 program을 실행함.

그러면 EUID가 17로 변경이 됨

i=getruid => ruid를 가져와서

setuidI(i) => euid를 이전의 상태로 돌림

Unix setuid그림을 보면

setuid bit가 0, 1일때 각각 euid를 보면 201, 100인 것을 볼 수있다.

pid1 = 모든 사용자 프로세스의 조상 (처음에 만들어지고 1번으로 계속 남아있음)

pid 523 ruid 0 euid 0 => pid 523 ruid 42 euid 42

setgroups, setgid, setuid를 실행하면 변경됨을 알 수 있다.

다시한번 예시를 보면

setUID bit를 설정해주면 일시적 권한 상승으로 소유자 권한으로 실행되는 것을 볼 수 있다.

setUID 보안?

  • 일반 유저들에게 권한을 상승시켜준다.

    • 슈퍼맨의 컴퓨터 칩처럼 행동이 제한되어있다.
    • setUID 내 포함된 행위만 가능하다
  • sudo command와 달리 직접 권한을 주는것은 아니다.
    (sudo => 1. root의 pw 아는 경우

         2. 다른 user(권한이 있는) pw 아는 경우
       3. /etc/shadow file에 사용자가 등록되어 있는 경우
       )
  • 만약 superman이 "북쪽으로 가서 왼쪽으로 틀고 성벽을 부셔라"라는 명령을 할때, 만약 명령을 받는 Mallory가 지구 반대편에 있고, 성벽의 반대쪽에 은행이 있다고 할 경우, Mallory의 기준에서 북쪽으로 가서 왼쪽으로 틀면 은행이 나올것이다. 그러면 Mallory는 은행을 털 수 있다.
    따라서 chip안의 SW구현도 중요하다!

Attack Surfave of Set-UID Programs

  1. 사용자의 입력으로 부터
  2. 사용자가 제어할 수 있는 시스템 입력을 통해서
  3. 환경변수
  4. 사용자에 의해 제어되는 비특권 프로세스 이용

1. 사용자의 입력

  • 버퍼 오버플로우

  • Format String Vulerability ( string형태로 유저입력을 받았을 때 프로그램을 바꿈)

  • chsh 명령어

    default shell을 바꾸는 명령(setUID 프로그램이다)

    shell 프로그램은 /etc/passwd 파일의 마지막 filed에 표시되어 있음.

입력값은 두개의 줄을 포함할 수 있다. 따라서 첫번재 라인은 정상적이고 두번째 라인에 root 계정을 만들도록 할 수 있다.  
혹은 만약 공격자가 3, 4번째 필드(UID, GID)에 0을 넣는다면 root 계정을 만들 수 잇다.
  • 시스템 inputs (사용자가 통제 가능한 시스템 input을 통해서도 setUID 프로그램 공격이 가능하다.)
    경쟁 조건

2. 환경변수

  • 환경 변수를 사용해서 setUID 프로그램 공격이 가능하다.

  • 환경 변수는 printenv나 env명령어를 통해 확인 가능하다.

  • 등호 앞에 있는 것이 환경변수이고 오른쪽이 환경변수에 들어있는 값이다.
    (PWD = /home/scho)

일반적으로 파일의 경로를 지정할때 절대 경로나 상대 경로를 지정할 수 있다.
모든 명령들은 어떠한 폴더 아래에 존재한다.

system("/bin/sh") => 값을 입력받아 명령을 수행함을 알 수 있다.
system(ls)를 할 경우 운영체제가 알아서 경로를 찾아서 ls를 실행한다.
이때 환경변수를 사용하여 알아서 경로를 찾음
echo path를 하면
:로 경로가 구분되어있고 처음 경로부터 해당 경로에 파일이 있는지 찾는다.
path라는 환경변수에 등록된 경로들 순서대로 명령을 찾는다.

cd /home/attacker
vi attack.c
gcc -o ls attack.c
export PATH=/home/attacker/:$PATH:/home/user1/bin

이러한 상황에서 공격자가 home 밑의 attack 파일을 만든다.
그리고 실행파일을 ls로 하고 환경변수를 바꾼다.
그러면 ls를 명령으로 입력하였을때 /bin/ls가 아닌 /home/attacker/ls가 실행된다.

  • Capability Leaking

    자격 유출
    어떤 특권 프로그램은 실행 중에 자기 자신의 권한을 다운그레이드한다.
    대표적으로 su라는 명령어는 switch user로 사용자를 바꾸는 명령어다.
    setUID프로그램이다.

    예시로 user1에서 user2로 바꿀때, EUID는 root이고 RUID는 user1이다.
    그리고 비밀번호가 확인되었을때 RUID와 EUID는 동일하다. 그리고 EUID는 root에서 user2로 내려간다.

<set UID 프로그램의 소스>

/etc/zzz의 owner는 root이고 root만 writable하다.

fd 0은 표준입력 , 1은 표준 출력, 2는 표준에러이고 프로세스가 생성되자마자 default로 open된다.

따라서 open성공시 fd는 3이된다.

setuid(getuid()) => real uid를 가져와서 euid로 설정한다. (실행하는 사람은 root가 아님)

새로운 shell을 실행한다. 그 프로세스는 이전에 open된 파일을 그래도 상속한다. (fd 0, 1, 2, 3)

cap_leak을 owner를 root로 하고 setUID bit를 설정한다.

/etc/zzz에 쓰기를 할 수없다.

하지만 cap_leak을 실행하면 파일의 owner인 root의 권한으로 상승되고, fd를 상속받았으므로 fd 3이 open된 /etc/zzz이고 그곳에 ccccccccccc가 적혀진다.

그리고 새로운 쉘을 빠져나오면 ccccccccccccccc가 쓰여진 것을 알 수 있다.

높은 권한을 가진 EUID가 중요한 파일을 open한 상태로 새로운 shell이 상속받아 문제가 발생하였다.

getuid : real user ID

geteuid : effective user ID

setuid : set effecitive user ID

3. Invoking Programs

  • 하나의 프로그램 내에서 외부 명령어 수행

  • 외부 명령어가 setUID 내에서 실행된다면 안전하지 않거나 엉뚱한 결과를 보여줌

  • 공격 : 사용자는 명령에 대한 입력 데이터를 줌, 명령이 제대로 호줄 되지 않으면 유저 입력 데이터는 명령어 이름으로 될 수 있음.

system은 외부 명령어를 호출하는 함수이다.

root소유 setUID프로그램이다. 따라서 프로그램은 모든 파일을 볼 수 있지만 쓰기는 하지 못한다.

 

실행권한이 마지막 r-x이므로 누구나 실행이 가능하다.

';'은 shell에 두개 이상의 명령어를 줄 수 있게 한다. 예시) ls;ps ls;cp a b

(root가 owner인 setUId프로그램이기 때문에 shell이 뜰때 root shell이 뜬다. => $가 아니라 #)

aa를 입력하고 그 뒤 /bin/sh를 입력한다.

그러면 uid는 1000이지만 euid가 0임을 알 수 있다.

 

execve을 사용하여 명령어 + 인자로 나누어주면 안전해 질 수 있다.

 

"aa;/bin/sh"를 하나의 인자로 인식힌다.

 

 

Principle of Isolation

 

system() 사용 줄임

권한이 필요할 때만 잠시 상승 하지만 그 권한이 더이상 필요없을땐 권한을 다시 낮춘다.

 

728x90
반응형

'공부 > 보안' 카테고리의 다른 글

Buffer Over flow 2  (0) 2020.10.16
Buffer Overflow Attacks 1  (0) 2020.10.16
운영체제보안 4  (0) 2020.09.22
운영체제보안 3  (0) 2020.09.16
운영체제 보안 2  (0) 2020.09.10
블로그 이미지

아상관없어

,

딥러닝 3

공부/딥러닝 2020. 10. 9. 17:12
반응형

Learing for classification => class를 나누는 경계선을 찾는 문제였음

경계선을 직선으로 할 경우 오류가 많지만 곡선으로 할 경우 오류가 줄어들음

Scikit-learn classifiers

  • Logistic regression
  • KNN'
  • Support Vector Machine (SVM)
  • Naive Bayes
  • Decision Tree
  • Random Forest
  • AdaBoost
  • xgboost(Not in scikit-learn)

여러 classifier들이 있지만, 어떤 방법이 현재 가지고 있는 데이터에 대해 가장 효과적인지 사전에 알 수 없다. 따라서 모든 방법을 해보고 그 중에 좋은 것을 선택해야한다.

1. Decision Tree


  • 큰 문제를 작은 문제들의 조각으로 나누어 해결한다.
  • 예측을 위한 모델이 만들어졌을때, Tree의 형태로 나온다.
  • Tree형태이기때문에 결론이 나온 이유를 이해하기 쉽다. => 예측 결과에 대해서 근거가 명확하다
  • 예를 들면 의료분야에서 질병진단시 근거가 명확해야한다.

1.1 Decision Tree 예시


  • 영화 대본 및 기본 정보를 이용하여 영화가 흥행할지 예측하는 모델
  • 유명 배우수와 추정 제작비로 예측
  • 결과는 매우흥행, 어느정도 흥행, 폭망으로 3가지로 구분

  1. 특정 class와 다른 class를 가장 잘 구분할 수 있는 선을 찾는다. 하지만, 잘못 예측한 경우도 있다.

  1. 다른 class를 다시 구분하는 선을 찾는다. 잘못 예측한 것들이 있지만 최선이다.

  1. 결과

1.1.1 문제점


  • 트리의 node를 선택 할 때 데이터 셋에서 어떤 속성을 선택할 것인가?
    => 이전 영화문제에서는 유명배우가 많으면서 예산이 적어야 성공한 영화였다. 그러면 스타급 배우수가 먼저인가? 예산이 먼저인가?

사진과 같이 class가 겹치는 부분이 적은 것을 선택한다.

  • 트리를 split할 때 언제 중단할 것인가?
    => 트리의 가지를 계속 뻗어나가면 모든 instance를 100%t식별 할 수 있다. 하지만 overfitting발생

적당할 때 트리생성을 중단 해야한다. -> 가지치기(pruning)
경계선을 많이 나누면 이론상으로 100% 예측 가능한 tree를 만들 수 있다. 하지만 test 정확도는 낮다.

1.1.2 장점


  • 모든 문제에 적합
  • 결측치, 명목속성(범주), 수치속성을 처리하기에 용이
  • 여러 속성중 중요한 속성들만 사용하여 예측
  • 매우 많은 수 또는 상대적은 훈련 데이터로도 모델 구축 가능
  • 수학적 배경이 없이도 해석이 가능한 모델
  • 단순한 이론적 근거에 비해 높은 효율성

1.1.3 단점


  • 결정 트리는 다수의 레이블을 가진 속성쪽으로 구분하는 경향이 잇음
  • 모델이 쉽게 과적합(overfitting)하거나 과소적합(underfitting) 됨
  • 축에 평행한 구분선을 사용하기 때문에 일부 관계를 모델화 하는데 문제가 있다.
  • 훈련 데이터에 대해 약간의 변경이 결정 논리에 큰 변화를 준다.
  • 큰 트리는 이해하기 어렵고 직관적이지 않다.

1.1.4 코드


예시) liver.scv (간 장애 자료, 레이블 + 혈액검사 결과(6개 변수))

category
mcv
alkphos
sgpt
sgot
gammagt
drinks

category = 클래스 정보. 0 : 정상 1 : 간장애

  1. 데이터 셋 준비
  2. 설명변수/반응변수 구분
  3. train/test 셋 나눔
  4. 모델 만듬
  5. 모델 training
  6. 튜닝
from sklearn.tree import DecisionTreeClassifier, export_graphviz //export_graphviz는 tree시각화에 필요
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix
import pandas as pd
import pydot # need to install

#1. 데이터 셋 준비
# prepare the iris dataset
df = pd.read_csv('D:/data/liver.csv')
print(df.head())
print(df.columns) # column names

#2. 설명변수/반응변수 구분
df_X = df.loc[:, df.columns != 'category']
df_y = df['category']

#train/test 셋 나눔
# Split the data into training/testing sets
train_X, test_X, train_y, test_y = \
train_test_split(df_X, df_y, test_size=0.3,\
random_state=1234) 
#4. 모델 만듬
# Define learning model (basic)
model = DecisionTreeClassifier(random_state=1234)

#5. 모델 학습
# Train the model using the training sets
model.fit(train_X, train_y)

# performance evaluation
print('Train accuracy :',model.score(train_X, train_y))
print('Test accuracy :',model.score(test_X, test_y))

#6. 튜닝
# Define learning model (tuning)
model = DecisionTreeClassifier(max_depth=4, random_state=1234)

# Train the model using the training sets
model.fit(train_X, train_y)

# performance evaluation
print('Train accuracy :',model.score(train_X, train_y))
print('Test accuracy :',model.score(test_X, test_y))

### 튜닝 후 test 정확도가 69%로 더 좋아진 것을 알 수 있다. 그러므로 매개변수를 잘 조절하면 모델의 성능이 좋아진다.

 visualize tree
export_graphviz(model, out_file='tree_model.dot', feature_names =
train_X.columns, class_names = 'category’, rounded = True,
proportion = False, precision = 2, filled = True)
(graph,) = pydot.graph_from_dot_file('tree_model.dot’,
encoding='UTF-8')
graph.write_png('decision_tree.png') # save tree image

#from IPython.display import Image
#Image(filename = 'decision_tree.png')

1.1.5 Hyper parameters


모델을 만들 때, 모델의 성능에 여향을 끼치는 매개변수들이다.
따라서 Hyper parameter를 어떻게 조절하냐가 중요하다. 그러나 매개변수가 20개 가까이 되므로 다 조절하기는 힘들다.
그러므로 몇개의 자료로 추린다.

  • criterion : String, optional (default = "gini")
    Decision Tree의 가지를 분리 할 때, 어떤 기준으로 정보 획득량을 계산하고 가지를 분리 할 것인지 정함
    gini = entropy보다 빠르지만 한쪽으로 편향된 결과를 낼 수 있음
    entropy = gini에 비해 조금 더 균형잡힌 모델을 만들 수 있다.
  • max_depth : int or None, optional(default = None)
    Decision Tree의 최대 깊이 제한을 줄 수 있음
    사전 가지치기를 하고 voerfitting을 방지 할 수 있음
  • min_sample_split : int, float optaional(default = 2)
    노드에서 가지를 분리할 때 필요한 최소 sample 개수에 대한 제한을 줄 수 있음. 주어진 값에 type에 따라 다음과 같이 기능함
    int -> 주어진 값 그대로 사용
    float -> 0,1사이의 값을 줄 수 잇음,. cell(전체 데이터수 * min_sample_split)의 값을 사용함
  • min_sample_leaf : int, float optaional(default = 2)
    한 노드에서 가지고 있어야 할 최소 sample 개수에 대한 제한을 줄 수 있음.주어진 값에 type에 따라 다음과 같이 기능함
    int -> 주어진 값 그대로 사용
    float -> 0,1사이의 값을 줄 수 잇음,. cell전체 데이터수 * min_sample_leaf)의 값을 사용함
  • max_features : int, float, string or None, optional(default = None)
    Decision Tree model을 만들 때 사용할 수 있는 변수의 개수를 제한을 줄 수 있음
    int -> 주어진 값 그대로 사용
    flaot -> int(max_features * 총변수 개수) 사용
    None -> 총 변수 개수 사용
  • class_weight : dict, list of dict or "balanced", default=None
    예측 할때 두개의 class의 중요도가 다른 경우가 있다.
    예로 환자 판단시, 정상을 정상으로 진단하는 것보다 환자를 환자로 진단하는 것이 더 중요하다
    그러므로 정상:환자 = 6:4 와 같이 비율을 정한다.
    class_label: weight

1.2 Random Forest


  • N개의 Decision Tree가 투표를 통해 결정하는 방식이다.
  • Bagginf approach중 하나임. -> 여러 모델을 합쳐서 결론냄
  • 주어진 데이터에서 랜덤하게 subset을 N번 sampling해서(좀 더 정확하게 observations와 features들을 랜덤하게 sampling) N개의 예측 모형을 생성
  • 개별 예측 모형이 voting하는 방식으로 예측결과를 결정하여 Low Bias는 유지하고 High Variance는 줄임
  • Random Forest는 이런 Bagging 계열의 가장 대표적이고 예측력 좋은 알고리즘

1.2.1 코드


from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix
import pandas as pd

# prepare the iris dataset
df = pd.read_csv('D:/data/liver.csv')
print(df.head())
print(df.columns) # column names
df_X = df.loc[:, df.columns != 'category']
df_y = df['category']

# Split the data into training/testing sets
train_X, test_X, train_y, test_y = \
train_test_split(df_X, df_y, test_size=0.3,\
random_state=1234) 

 

# Define learning model (# of tree: 10) #################
model = RandomForestClassifier(n_estimators=10, random_state=1234) # n_estimators = 트리 수

# Train the model using the training sets
model.fit(train_X, train_y)

# performance evaluation
print('Train accuracy :', model.score(train_X, train_y))
print('Test accuracy :', model.score(test_X, test_y))
pred_y = model.predict(test_X)
confusion_matrix(test_y, pred_y)

 

# Define learning model (# of tree: 10) #################
model = RandomForestClassifier(n_estimators=10, random_state=1234)

# Train the model using the training sets
model.fit(train_X, train_y)

# performance evaluation
print('Train accuracy :', model.score(train_X, train_y))
print('Test accuracy :', model.score(test_X, test_y))
pred_y = model.predict(test_X)
confusion_matrix(test_y, pred_y)

 

# Define learning model (# of tree: 50) #################
model = RandomForestClassifier(n_estimators=50, random_state=1234)

# Train the model using the training sets
model.fit(train_X, train_y)

# performance evaluation
print('Train accuracy :', model.score(train_X, train_y))
print('Test accuracy :', model.score(test_X, test_y))
pred_y = model.predict(test_X)
confusion_matrix(test_y, pred_y)

tree 수를 50으로 늘리니까 정확도가 올라갔다.

 

 

Hyper parameters

  • n_estimators : 생성하는 트리의 개수, 많을수록 성능이 좋아짐 이론적으론 500, 1000이면 충분
  • max_feautures : 좋은 split을 하기위한 features의 개수
  • Criterion : measure the quality of a split

1.3 Support Vector Machine


이때까지는 tree 형태의 모델로 접근을 했다.
Support Vector Machine은 접근법이 다르다.

idea 1)

  • finding maximum-margin hyperplane
    모든 점 정보를 가지고 경계선을 찾는게 아니라 class 경계면에 있는 몇개의 점들로 경계선을 찾는다.
  • 데이터의 차원을 높이는 방법
    차원을 높여서 찾는다.
  • C - Support Vector Classification
    학습시간이 sample 수(data set의 instance 수)의 제곱에 비례하여 많아짐

1.3.1 코드

from sklearn import svm
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix

import pandas as pd
import pydot

# prepare the iris dataset
df = pd.read_csv('D:/data/liver.csv')
df_X = df.loc[:, df.columns != 'category']
df_y = df['category']

# Split the data into training/testing sets
train_X, test_X, train_y, test_y = \
train_test_split(df_X, df_y, test_size=0.3,\
random_state=1234)
# Define learning model (basic)
#####################################
model = svm.SVC()

# Train the model using the training sets
model.fit(train_X, train_y)

# performance evaluation
print('Train accuracy :', model.score(train_X, train_y))
print('Test accuracy :', model.score(test_X, test_y))
pred_y = model.predict(test_X)
confusion_matrix(test_y, pred_y)

 

# Define learning model (poly kernel) ############
model = svm.SVC(kernel='poly')

# Train the model using the training sets
model.fit(train_X, train_y)

# performance evaluation
print('Train accuracy :', model.score(train_X, train_y))
print('Test accuracy :', model.score(test_X, test_y))
pred_y = model.predict(test_X)
confusion_matrix(test_y, pred_y)

정확도가 낮아졌다.

 

1.3.3 Hyper parameter

  • c: float, deault =1.0
    Regularization parameter
    과적합을 조절(일어나지 않게)
  • kernel : linear, poly, rbf, sigmoid, precomputerd default = 'rbf'
    차원 변경
  • degree : int, default = 3
    커널에 따라 달라짐
  • gamma : scale, auto or float default = 'scale'
    'rbf', 'poly', 'sigmoid' 지원

1.3.4 SVM 장단점

장점

  • 범주나 수치데이터 보두에 사용가능
  • 노이즈 데이터에 영향을 크게 받지 않고 overfitting이 잘 일어나지 않음
  • 경계면의 몇개의 점만 사용하므로
  • 높은 정확도

단점

  • 최적의 모델을 찾기 위해 커널과 기타 hyper parameter의 여러 조합ㅇ르 테스트해보아야한다.
  • 입력 데이터셋이 feature 수와 데이터 sample 수가 많으면 훈련시간이 많이 소요될 수 있다.
  • 모델의 해석이 불가능하진 않지만 어렵다.

1.4 xgboost


예측력이 가장 좋지만 복잡하다.

  • Ensemble => 예측 모델을 만들때 여러개 모데ㅐㄹ을 만들어 하나로 합친다. 여러개 모델로 단일한 결과를 나오게 한다. 예측 성능을 높일 수 있다.
  1. Bagging => 투표로 결과 도출
  2. Boosting =>잘못 예측된 것들에 대해 예측력을 높여줌

728x90
반응형

'공부 > 딥러닝' 카테고리의 다른 글

CIFAR-10 의 레이블중 하나를 예측  (0) 2021.05.09
classification 경진대회  (0) 2021.05.03
딥러닝 4  (0) 2020.10.29
딥러닝 2  (0) 2020.09.29
딥러닝 1  (0) 2020.09.25
블로그 이미지

아상관없어

,

딥러닝 2

공부/딥러닝 2020. 9. 29. 21:14
반응형

Clustering


  • Grouping target data into some category(class)
  • 성격이나 가진 정보가 비슷한 데이터들을 묶음
  • 비지도 학습임(정답이 없고 알아서 묶음)
  • 어떻게 컴퓨터가 그룹을 나누느냐? => 거리가 가까운것 끼리 묵음 따라서 거리 계산이 중요함.

Classification


  • 데이터들이 그룹이 나누어져있고 알고 있음
  • 새로운 데이터가 들어왔을때, 어디에 속할지 판단함
  • 예측, 의료에서 진단 분야에서 사용됨.
  • 주로 많이 사용함.
  • 범주데이터를 주므로 지도학습임.

예시 : clustering

  • 차량의 특성을 가지고 grouping
  • 산점도를 그림

  • 점이 모이는 것을 확인할 수 있음
  • 그룹이 지어지면 해석이 가능해짐, 그룹의 특징을 해석해서 활용함
  • 혹은 비정상 거래 판단시, 주류범주에 속하지 않으면 비정상 거래로 탐지

예시 : classification

  • 이미 그룹이 만들어져 있음
  • ex) 병원 새로운 사람이 왔을때 환자인지 정상인지 판단
  • 어떤 class에 속하는지 찾아봄

Binary vs multiple classfication


  • Binary classification
  • class 의 수가 2개인 경우
  • 좀 더 쉬움 = 모델의 정확도가 높음
  • multifple classfication
  • class의 수가 3개 이상인 경우

K-means clustering


  • 예시 : 금이간 타일과 정상 타일 군집화

  • 크랙이 있는 것과 없는 것은 소리(주파수)가 다름
  • clustering을 하였을때, 금이 간 것과 안 간것끼리 class가 나뉘어야 사용할 수 있음
  • 주의) log값을 취하여 사용함. 왜냐하면 scale을 맞추어 왜곡값을 줄이기 위하여임(그러지 않을 경우 값들이 x, y축에 붙음)

  • 두개의 그룹으로 확연하게 분리됨

  • k = 클러스터의 수 => 따라서 2개(금간것, 안간것)

  • 임의로 점 두개를 찍음( k 개수 만큼)
    1. 이 점이 각 클러스터의 중심점이 됨
    2. 중심점과 점들의 거리를 구함
    3. 각 점들에 대해 더 가까이 있는 중심점을 그 점들과 합쳐서 중심점을 구함(x 좌표 평균, y 좌표 평균이 새로운 중심점)
    4. 반복하여 계산함

  1. 더 이상 안움직이는 때(움직임이 작을 때)가 오면 그룹의 중심을 찾았다는 뜻이다. 그러면 중심점들과 점 사이 거리를 계산하여 그룹을 찾는다.
  2. 두 그룹이 금간 것, 안간 것으로 구분이 되면, 이것으로 새로운 것이 들어왔을때 판단을 한다(중심점으로)

  • 거리계산법

import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import KMeans

X = np.array([[1,2], [4,3], [2,5],
              [8,5], [10,6], [9,4]])

kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
  • n_clusters : 클러스터의 개수
  • random_state : seed for reproducability => 클러스터 중심점 위치를 랜덤하게 찍기위해

# cluster label
kmeans.labels_ #클러스터 번호 알려줌

# bind data & cluster label
np.hstack((X, kmeans.labels_.reshape(-1, 1))) #lable을 포함하여 X를 보여줌, 세로로 바꾸어 합침

# center of clusters
kmeans.cluster_centers_ #중심점의 좌표값을 보여줌 

# predict new data
kmeans.predict([[0, 0], [12, 3]]) #예측

KNN classifier


  • 분류(classification)
  • 어느 카테고리에 속할것인가?
  • idea of KNN
  • 모르는 데이터와 알려진 데이터 중 모르는 데이터에 가까운 것들을 추림
  • K-NN : K는 몇개를 추릴 것인지
  • 그러면 K개 중 많은 것을 따름(다수를 따라감)

  • 가까운 이웃을 판단하기 위해선 거리를 다 계산함(모르는 데이터와 알려진 데이터들 사이의 거리)
  • K는 홀수로 하여야 모르는 데이터가 어디에 속할 지 정하기 쉬움

  • 계산
  • K의 값은 데이터의 수가 N이라 할 때, K < sqrt(N)을 권장
  • K가 클때와 작을때 각각 장단점이 있음

  • K개수에 따라 정확도가 달라지므로 여러개를 해보고 그중 정확도가 높은 것을 선택해야한다.
  • 이러한 모델의 정확도에 영향을 미치는 변수를 초매개변수라 한다. 정확도가 높은 초매개변수를 찾는 것이 중요함
  • 장점
  1. 통계적 가정 불필요(머신러닝 초기 모델들은 통계에 기반하여, 데이터는 정규분포를 따른다는 가정을 했다. 따라서 가정을 벗어난 데이터는 예측이 불가능했다)
  2. 단순하다
  3. 성능이 좋다
  4. 모델을 훈련하는 시간이 필요없다 (모델을 만드는 과정이 없음, 데이터를 바로 찾아서 결과를 냄 )
  • 단점
  1. 데이터가 커질수록 많은 메모리가 필요하다
  2. 데이터가 커질수록 처리시간(분류시간)이 증가한다.
  • 모르는 값이 있을 때, class를 구하려면 거리계산을 다 해주어야한다. 따라서 메인메모리에 모든 값이 있어야한다. 그리고 모두 거리계산을 해주어야한다.
from sklearn import datasets
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# Load the iris dataset
iris_X, iris_y = datasets.load_iris(return_X_y=True)
print(iris_X.shape) # (150, 4)

# Split the data into training/testing sets
train_X, test_X, train_y, test_y = \
train_test_split(iris_X, iris_y, test_size=0.3,\
random_state=1234) 
# Define learning model
model = KNeighborsClassifier(n_neighbors=3) #K값은 3임, 초매개변수 K = 3 (default값은 5임)

# Train the model using the training sets
model.fit(train_X, train_y)

# Make predictions using the testing set
pred_y = model.predict(test_X)
print(pred_y)

# model evaluation: accuracy #############
acc = accuracy_score(test_y, pred_y)
print('Accuracy : {0:3f}'.format(acc))
  • Dataset scaling
  • 거리기반 학습방법을 적용할 때는 scaling이 필요
  • 예로 키, 시력을 비교시 (170, 0.8) 두 값간의 차이가 커서 시력의 거리 의미가 없어짐
  • 따라서 두 크기의 스케일을 바꾸어 동등한 영향력을 가지게해야함.
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler() # 정의
scaler.fit(X) # X : input data # 실행
X_scaled = scaler.transform(X) # 결과 얻음

Performance metric : 모델 성능 평가 척도


For Binary classification model only

  • Sensitivity
  • Specificity
  • precision
  • F1 score
  • ROC, AUC

For All classification model

  • Accuracy

=> 평가 척도가 다양한 이유는 응용을 어디에 하느냐에 따라 모델 평가 척도가 달라지기때문

 

 

  • Binary classification metric

의료일 경우 FP인 경우, 음성을 양성으로 잘못 판단한 것이므로 정상을 비정상으로 진단한 경우다.
FN인 경우 양성을 음성으로 잘못 판단한 것이다. 실제로 감염이 된 것인데 안되었다고 판단하므로 FN의 경우가 더 심각하다

  • 민감도

    - Sensitivity = TP/(TP+FN) => (실제 양성인데) 양성 판단 / 실제 양성

  • 특이도

     - Specifity = TN/(TN+FP) => (실제 음성인데) 음성 판단 / 실제 음성

  • 정밀도

     - Precision = TP/(TP+FP) => (실제 양성인데) 양성 판단 / 양성 판단

 

 

  • F1 ScoreBinary가 아닌 경우
  • class A, B, C가 있을경우
  • For class A : A는 Postive, B,C는 Negative
  • For class B : B는 Postive, A,C는 Negative
  • For class C : C는 Postive, A,B는 Negatvie
    => table을 만드는 경우 복잡하고 의미를 찾기 힘들다.
from sklearn.metrics import accuracy_score
test_y = [2, 0, 2, 2, 0, 1]
pred_y = [0, 0, 2, 2, 0, 2]
acc = accuracy_score(test_y, pred_y)
print(acc)

aac = 0.6666666666666

  • Confusion matrix
  • from sklearn.metrics import confusion_matrix test_y = [2, 0, 2, 2, 0, 1] pred_y = [0, 0, 2, 2, 0, 2] confusion_matrix(test_y, pred_y)

  • 정답이 0이고 예측도 0인 경우가 2개 있고, 1,1인 경우가 0개 2,2개인 경우가 2개이다 나머지는 예측이 틀린 경우이다
# binary classification
test_y = [1, 0, 0, 1, 0, 1]
pred_y = [0, 0, 0, 1, 0, 1]
tn, fp, fn, tp = confusion_matrix(test_y, pred_y).ravel()
(tn, fp, fn, tp)

tn, fp, fn, tp
3, 0, 1, 2
=> tn, fp, fn, tp 순이다.

K-fold Cross Validation

---------------------------------------------------------------------------------------------------

  • 데이터를 Training과 Test로 나누었을때 나온 accuracy를 믿어야하는가?
  • Test 데이터 셋을 다르게 만든다면 accuracy는 달라질 것임
  • Test 데이터 셋이 어떻게 구성되었느냐에 따라 accuracy가 원래 성능보다 높거나 낮게 나올 수도 있음
  • K-fold Cross Validation을 사용함

  • k가 4인 경우 4등분하여 각 모델별로 Test와 Train을 다르게 한다.
  • 그리고 각 모델의 정확도의 평균을 구한다

 

복잡한 방법 : 하지만 for문 사이에 테스트 코드를 추가할 수 있다.

from sklearn import datasets
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import KFold
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import numpy as np

# Load the iris dataset

iris\_X, iris\_y = datasets.load\_iris(return\_X\_y=True)

# Define fold (5 fold)

kf = KFold(n\_splits=5, random\_state=123, shuffle=True) # shuffle => 섞음(섞어서 나눔)

# Define learning model

model = KNeighborsClassifier(n\_neighbors=3)  
acc = np.zeros(5) # 5 fold 저장할 배열  
i = 0 # fold no

for train\_index, test\_index in kf.split(iris\_X):  
print("fold:", i)  
train\_X, test\_X = iris\_X\[train\_index\], iris\_X\[test\_index\]  
train\_y, test\_y = iris\_y\[train\_index\], iris\_y\[test\_index\]  
model.fit(train\_X, train\_y)  
pred\_y = model.predict(test\_X)

# model evaluation: accuracy

acc\[i\] = accuracy\_score(test\_y, pred\_y)  
print('Accuracy : {0:3f}'.format(acc\[i\]))  
i += 1  
print("5 fold :", acc)  
print("mean accuracy :", np.mean(acc))

 

심플한 방법

from sklearn import datasets
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import numpy as np



# Load the iris dataset

iris\_X, iris\_y = datasets.load\_iris(return\_X\_y=True)

# Define learning model

model = KNeighborsClassifier(n\_neighbors=3)

# Define fold (model, train, target, cross validation)

scores = cross\_val\_score(model, iris\_X, iris\_y, cv=5) # cv=5는 fold가 5개임  
print("fold acc", scores)  
print("mean acc", np.mean(scores))

  • K-fold cross validation이 원하는 모델을 도출하진 않음 (k=5일 경우 모델은 5개가됨)
  1. 주어진 데이터 셋으로 모델 개발시 미래의 정확도를 추정 ( k=1, 3, 5 일경우 최적의 경우를 찾음)
  2. 최종 모델 개발을 위한 hyper parameter 튜닝에 사용
  3. 전처리시 feature selection에 사용 => 모델을 만드는데 도움이되는 변수를 골라냄
728x90
반응형

'공부 > 딥러닝' 카테고리의 다른 글

CIFAR-10 의 레이블중 하나를 예측  (0) 2021.05.09
classification 경진대회  (0) 2021.05.03
딥러닝 4  (0) 2020.10.29
딥러닝 3  (0) 2020.10.09
딥러닝 1  (0) 2020.09.25
블로그 이미지

아상관없어

,

딥러닝 1

공부/딥러닝 2020. 9. 25. 21:24
반응형

머신 러닝 분류

  • 지도학습
  • 회귀(regression) - 수치형 자료(대소 비교가능)
  • 분류(classification) - 범주형 자료
  • 비지도 학습
  • 강화학습

1. 단순 선형회귀 (Simple linear regression)

  • 종속 변수 y와 독립 변수 x 사이의 선형 관계를 파악하고 이를 예측에 활용하는 방법
    예시) 기온(x) 아이스크림 판매량(y) => 필요한 아이스크림 재료의 양을 예측 가능해짐
  • 독립 변수 x와 선형 변수 y 사이의 관계식을 모델이라고 함.(학습 모델)
  • y = Wx + b
    상수인 W와 b를 찾는것이 학습 목표
  • 현실 세계에서는 두 변수가 _선형관계_에 있는 경우가 많음
  • 두 변수가 선형 관계에 있는지 알아보는 법 = 산점도, 상관계수
    산점도 : x,y 좌표값으로 나타냄
  • 회귀식에서 W와 b를 찾는 방법

(a)와 (b)중 어떤걸 선택? => 객관적 평가 척도가 필요함

좋은 식은 오차들의 합계가 작은 것임

오차들의 차이 계산? => 오차가 +값, -값이 나오므로 제곱한 값들의 합을 사용함 => 최소 제곱법

Code

# module load
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

from sklearn.linear_modle import LinearRegression
from sklearn.metrics import mean_wquared_error, r2_score
from sklearn.model_selection import train_test_split
# prepare dataset

cars = pd.read_csv('D:cars.csv')

speed = cars['speed']
distance = cars['distance']

# data frame to npl.numpy => numpy 배열로 바꾸어주어야함
speed = np.array(speed).reshape(50,1)
distance = np.array(distance_.reshape(50,1) # 1차원 벡터가 되어야 하므로 (50,1)로 바꾸어줌 (2차원 벡터로)

# Split the data into training/testing sets
train_X, test_X, train_y, test_y = train_test_split(speed, distance, test_size=0.2, random_state=123)
# 인자 speed = x, distance = y, test_size-0.2 = 전체 개수 중 20%를 테스트로 사용하고 나머지를 trainning으로, random_State = 무엇이 test가 되고 train이 될지 랜덤하게 결정​
# 학습 방법을 정해줌
model = LinearRegression()

# 학습 시킴
model.fit(train_X, train_Y)

# 예측함(테스트 셋으로 테스트함)
pred_y = model.predict(test_X)
print(pred_y)
# 예측
print(model.predict([[13]])

- [[]] 괄호 2개를 사용하는 이유는 predict는 배열이 들어가야하는데, 2차원 배열을 만들기 위해서 괄호 2개를 사용함

# W와 b값
print('coef : {0: .2f}, Intercept : {1: .3f}'.format(model.coef_[0][0], model.intercept
_[0]))

(파이썬에서는 format함수를 이용해서 문자열과 변수값을 쉽게 작성할 수 있다. 문자열 안에 {}기호를 작성하고 .format을 붙여 변수를 넣음. print("a={}".format(a)) )

  • Model 평가
  • The mean squared error
print('Mean squared error: {0: .2f}'.format(mean_squared_error(test_y, pred_y)))
  • The coefficient of determination : 1 is perfect prediction
print('%.2f' % r2_score(test_y, pred_y))
  • 모델 시각화(
plt.scatter(test_X, test_y, color = 'black')
plt.plot(test_X, pred_y, color='blue', linewidth=3)

plt.xlabel('speed')
plt.ylabel('distance')

plt.show()

Multiple linear regression (중선형 회귀)

  • 독립변수(설명변수)가 2개 이상인 경우
  • 예시
  • 키(X1) 몽무게(X2)를 가지고 혈당(Y)를 예측
  • 앞의 예시인 자동차의 속도를 가지로 제동거리를 예측할 경우, 단순히 제동거리는 주행속도에 의해 결정이 되진 않음!
  • 따라서 다양한 요인을 넣는다면 오차는 줄어들 것임
  • 예시 = 특정 직군의 연봉을 교육년수, 여성비율, 평판으로 예측
  • import pandas as ps import numpy as np from sklearn.linear_model import LinearRegression from skleran.metrics import mean_squared_error, r2_score from sklearn.model_selection import train_test_split
# load the prestge dataset
df = ps.read_csv('D:prestige.csv')
print(df)
df_x = df[['education', 'women', 'prestige']]
df_y = df[[i'income']]

데이터 셋을 준비하면 test/training set으로 나눔

# split the data into training/testing sets
train_X, test_X, train_y, test_y = train_test_split(df_X, df_y, test_size=0.2)

# Dfine learing model
model = LinearRegression()

# Train the model using the training sets
model.fit(train_X, train_y)

# Make predictions using the testing set
pred_y = model.predict(test_X)
print(pred_y)

learning model은 같지만 내용은 달라짐 = 변수 3개

# The coefficient & intercept
print('cofficients: {0:.2f}, {1:,2f}, {2:.2f} Intercept {3:.3f}'.format(model.coef_[0], model.coef_[1], model.coef[2], model.intercept))

# The mean squared error
print('Mean squared error: {0:.2f}',format(mean_squared_error(test_y, pred_y)))

# The coefficient of determination: 1 is perfect prediction
print('Coefficient of determinaion: %.2f' % r2_score(Test_y, pred_y))

그러면 연봉은 어떻게 구할까? => model.predict 사용

ex) education : 11.44 /women : 8.13 /prestige : 54.1

# Test single data
my_test_x = np.array([11.44, 8.13, 54.1]),reshape(1,-1) #행의 개수는 1, 열은 알아서 맞추어라(주어진 개수대로)
my_pred_y = model.predict(my_test_x) #예측값 얻음
print(my_pred_y)

Logistic regression

  • 일반적인 회귀 문제는 종속변수가 수치데이터임
  • 범주형 데이터를 예측할때, 회귀방법으로 구할때
  • 예시 : iris 데이터셋이에서 4개의 측정 데이터로부터 품종(분류)을 예측
  • Logistic 회귀도 y값이 숫자임
from sklearn import datasets #dataset에 iris가 포함되어 잇음
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score # 모델 정확도가 오차를 사용하지 못함
# Load the diabetes dataset
iris_X, iris_y = datasets.load_iris(return_X_y=True) # 독립변수와 종속변수를 구분해서 가져옴
print(iris_X.shape)

# Split the data into training/testing sets
train_X, test_X, train_y, test_y = train_test_split(iris_X, iris_y, test_size=0.3, random_state=1234)
# Define learning model
model = LogisticRegression()

# Train the model using the training sets
model.fit(train_X, train_y)

# Make predictions using the testing set
pred_y = model.predict(test_X)
print(pred_y)

# model evaluation: accuracy #############
acc = accuracy_score(test_y, pred_y)
print('Accuracy : {0:3f}'.format(acc))

Accuracy = 예측과 정답이 일치하는 instance 수 / 전체 test instance 수

! 종속변수가 숫자여야하기 때문에 문자형으로 되어 있는 범주 데이터를 숫자로 변환해야됨 => LabelEncoder

from sklearn.preprocessing import LabelEncoder
import numpy as np
number = LabelEncoder() # 객체생성

label_str = np.array(['M','F','M','F','M'])
label_num = number.fit_transform(label_str).astype('int') # int로 바꾸어라 기준은 알파벳 순서대로 F =0, M = 1
print(label_str)
print(label_num)
728x90
반응형

'공부 > 딥러닝' 카테고리의 다른 글

CIFAR-10 의 레이블중 하나를 예측  (0) 2021.05.09
classification 경진대회  (0) 2021.05.03
딥러닝 4  (0) 2020.10.29
딥러닝 3  (0) 2020.10.09
딥러닝 2  (0) 2020.09.29
블로그 이미지

아상관없어

,

운영체제보안 4

공부/보안 2020. 9. 22. 16:18
반응형

Race Conditions


운영체제는 자원관리자이다. 따라서 Thread나 Process가 주요자원들을 공유하게 해준다.

CPU는 하나이고 실행시킬 Task는 여러개일때, 시간을 나누어 번갈아가며 실행한다. (CPU => MIPS 따라서 번갈아가며 사용해도 사용자는 동시에 사용하는 것처럼 보인다.)

두 thread나 process가 공유자원에 동시에 접근하면 발생한다 따라서 임계영역에 한 순간 한 thread만 들어가도록 상호배제를 하거나 순서관계를 주어 한 thread가 다른 thread가 끝날때까지 기다리게 동기화해준다.

상호배제가 되어있지 않은 경우 다른 일을 하기 전에 공격자가 끼어들 수 있다.

Logging


log : 일지를 남기다.

시스템에 대해 기록하여 문제점, 침입자 등을 찾아낼 수 있다.
문제를 파악해서 대응할 수 있게해준다.

모든 것을 log할 수 없고, privacy risk와 process가능한 data만 log하는 것이 좋다.
하지만, 반드시 보안적으로 중요한 이벤트들은 log하여야한다.

linux에서 /var/log 아래에 log 파일들이 있다.

log viwer로는 last command가 있다.
tail = 최근 저장된 log 10줄을 보여준다.

Intruders & Security Design


Intruders = Attackers = Crackers = Black hat hackers = 침입자

  • Masquerader : 신분위장자, 내부의 적법한 사용자의 계정을 도용하여 비인가적인 침입을 함 (outsider)
  • Misfeasor : 적법한 사용자, 더 많은 권한을 가지고 불법행위를 함 (insider)
  • Clandestine user : 은밀한 사용자, 백도어 드으로 log를 남기지 않거나 log를 지움 (insider or outsider)

Layers of A computer system, Security


==========================
| Application |
| Services(compiler, DB..|
| OS |
| Hardware |
=======================

      Application security
     ============
     Network Security
   ================ 
      OS Security
 =====================
     User Security

=========================
Physical Security
============================
=> 위층의 보안이 좋아도 아래층 보안이 약하면 취약

Protection and Security Desing Principles


  • 최소한의 권한 (Least privilege).
    각 사용자와 프로그램은 가능한 최소한의 권한을 사용하여 작동해야 한다. 이 원리는 사고, 에러 또는 공격으로부터의 손상을 제한하며 또한 권한을 갖는 프로그램간의 잠재적인 상호작용의 수를 저하시는데 따라서 의도되지 않은, 원하지 않은 또는 부적절한 권한 사용이 덜 일어나게 할 것이다. 이 개념은 프로그램의 내부로 확장될 수 있는데 이러한 권한을 필요로하는 프로그램의 가장 작은 부분만이 이러한 권한을 가져야 한다.

 

  • 메카니즘의 효율적 사용/단순 (Economy of mechanism/Simplicity).
    보호 시스템 설계는 가능한 단순하고 작아야 한다. 이들은 "소프트웨어의 라인별 검사 및 보호 메카니즘을 구현하는 하드웨어의 물리적 조사와 같은 기법들이 필요하다. 이러한 기법이 성공적이기 위해서는 작고 단순한 설계가 절대적으로 필요하다" 라고 논의하고 있다. 이는 때때로 "KISS ("keep it simple, stupid")" 라고 기술된다.

 

  • 오픈 설계 (Open design). 보호 메카니즘은 공격자의 무지에 의존하지 않아야 한다.
    대신 메카니즘은 패스워드 또는 비밀키와 같은 비교적 소수 (쉽게 변경될 수있는) 아이템의 기밀성에 의존하며 공개적이여야 한다. 오픈 설계는 상세한 공개적 조사를 가능하게 하며 또한 사용자 자신이 사용하고 있는 시스템이 합당함을 깨닫게 할 수 있다. 솔직히 널리 배포되어 있는 시스템에 대해 기밀을 유지하려고 하는 것은 현실적이지 않다; 디컴파일러와 파괴된 하드웨어는 구현시의 어떤 비밀을 재빨리 드러낼 수 있다. Bruce Schneier 은 스마트 엔지니어는 소스 코드가 폭넓은 검토를 받았으며 모든 확인된 문제가 수정되었음을 보장해야 할뿐만 아니라 보안과 관련된 모든 것에 대해 오픈 소스 코드를 요구해야 한다고 주장하고 있다

 

  • 완벽한 조정 (Complete mediation).
    모든 접근 시도가 검사되어야 하는데 메카니즘이 파괴될 수 없도록 이를 위치시켜라. 예를 들어 클라이언트-서버 모델에서 일반적으로 서버는 사용자가 자신의 클라이언트를 구축 또는 수정할 수 있기 때문에 모든 접근 검사를 해야 한다.

 

  • 고장 안전 디폴트 (Fail-safe defaults (예, 허가권 기반 접근 방법).
    디폴트는 서비스 부인이어야 하며 보호 체계가 접근이 허가되는 조건을 확인해야 한다.

 

  • 권한 분리 (Separation of privilege).
    원칙적으로 객체에 대한 접근은 한가지 이상의 조건에 의존해야 하며 따라서 한가지 보호 시스템을 무너뜨려도 완전한 접근을 할 수 없을 것이다.

 

  • 최소한의 공통 메카니즘 (Least common mechanism).
    공유 메카니즘 (예, /tmp 또는 /var/tmp 디렉토리 사용) 의 수와 그 사용을 최소화해라. 공유 객체는 정보 흐름 및 의도되지 않은 상호작용에 대해 잠재적으로 위험한 채널을 제공한다.

 

  • 심리학적 수용성/사용의 편리함 (Psychological acceptability/Easy to use).
    휴먼 인터페이스는 사용하기 쉽도록 설계되어야 하며 따라서 사용자는 일상적 및 자동적으로 보호 메카니즘을 정확히 사용할 것이다. 보안 메카니즘이 사용자가 보호하려는 목적의 정신적 이미지와 밀접하게 일치된다면 실수는 줄어들 것이다.

 

Set- UID Privilieged Programs


Need for Privilieged Programs

예를 들어 /etc/shadow 파일의 권한을 보면

-rw-r----- 1 root shadow 1443

~


=> 오직 오너만이 write할 수 있다.

하지만 일반 유저들이 그들의 비밀번호를 바꿀때 어떻게 바꿀 수 있을까? 특권 프로그램을 이용해서 바꾼다

일반적으로 운영체제 내에서 세부적으로 접근 제어를 하는 것은 굉장히 복잡하다.
rwx 3가지 권한을 세부적으로 할 경우 write를 1. 앞에 2. 중간에 3. 뒤에 와 같이 3가지로 나눌 수 있다. 하지만 복잡해진다.

따라서 rwx + 3bits 총 12비트로 permission을 나타낸다.
(확장, fine-grained access control을 위해 3bits를 추가한다.)

일반적으로 OS가 제공하는 접근제어를 바로 사용가능하지만 (e.g system call)
특별한 경우(e.g root가 가진 파일 수정)는 특권 프로그램이 필요하다! => setUID가 설정된 프로그램이 필요하다! 혹은 daemons
(관리자(super user)를 믿는다고 가정한다. 일반 사용자들은 특권 프로그램을 이용해서 바꿀 수 있다)

 

Different Type of Privileged Programs

  1. Daemons in Linux (MS Windows 에서는 services)
    백그라운드에서 계속 수행된다. 따라서 키보드로 부터 입력을 받을 수 없다.
    root나 특권을 가진 유저의 권한으로 실행해야한다.
    • 만약 daemon에게 요청을 하고 요청이 타당하면 daemon이 수행한다.
      (특히 Network는 Service를 위해 daemon들을 많이 사용한다.
      ps - af, ef, af 등을 통하여 모든 프로세스들을 보면 d로 끝나는 것들이 있다.
      Network daemon을 뜻한다. => 중요한 일을 하므로 root의 권한을 주던지 어떤 특권이 있는 사용자의 권한으로 돌아간다.
      중요한 일을 하므로 daemon을 임의로 만들지 못한다.
  2. Set-UID Programs
    Unix 시스템에서 사용된다.
    특정한 비트가 표시되어있는 프로그램이다.

 

Set-UID Concept

  • superman story
    1. Power suit 1.0
      Super man은 자신의 권한을 superpeople
728x90
반응형

'공부 > 보안' 카테고리의 다른 글

Buffer Overflow Attacks 1  (0) 2020.10.16
set-UID Privileged programs  (0) 2020.10.15
운영체제보안 3  (0) 2020.09.16
운영체제 보안 2  (0) 2020.09.10
운영체제 보안 1  (0) 2020.09.10
블로그 이미지

아상관없어

,

운영체제보안 3

공부/보안 2020. 9. 16. 17:44
반응형

User Authentication


  • 사용자 인증
    등록된 사용자를 증명해준다.
    주로 ID/PW
    첫번째 보안 수단이다.
    인증에 기반하여 접근권한을 부여한다.
  • 기기 인증
    client가 server에게 접속할 수 있는 권한을 가진 기기라고 증명해준다.
    따라서, 아무나 server에 접근할 수 없다.
    ex) 인터넷 뱅킹시 특정 기기 등록하는 경우
  • linux에서
  • /etc/passwd
    login:x:userid:groupid:gecos:homedir:shell
  • root:x:0:0:root:/root:/bin/bash
  • /etc/shadow
    login:password:password aging fields
  • root:pB3ijlksa28hdkl93h:13904:0:99999:7:::
    (유저네임)(암호화된 PW)(PW가 언제 변경되었는지 1970.1.1기준)(99999일 안에는 변경해야)(이후에 얼마나 지나야 변경가능?)
  • /etc/groups
    groupname:grouppassword:groupid:secondarymembers
  • daemon:x:2:root,bin,daemon

Password가 X로 표시된 이유는 초창기에는 저 영역에 PW가 있었지만, /etc/shadow 위치로 옮겼고, 암호화된 PW가 저장됨 따라서 아무나 접근 할 수 없음,

Access Control


관리하는 자원이 많다. 따라서 이 자원을 어떻게 접근하고 누가 접근할 것인지 등 설정해주어야함
유저는 주체이고 자원은 객체가 된다.
OS가 해야할 중요한 일 중 하나는 log를 남기는 것이다.(시스템 자원에 대한 유저 접근을 기록한다.)

  • DAC
    Discretionary Access Control : 임의 접근 제어
    But, 문제가 있음 => 바이러스나 멀웨이들이 permission 수정 가능하다.
    공유적인 측면에서는 좋으나, 보안적인 측면에서는 좋지 않음
  • MAC
    Mandatory Access Control : 강제 접근 제어
    악성코드가 permission 수정 불가하다.
    공유적인 측면에서는 좋지 않으나, 보안적인 측면에서는 좋음
  • Priviledged Users
  • Root와 Normal의 차이?
  • root : 권한을 가진 사용자(root만이 쓸 수 있는 명령어 따로 있음)

User mode <-> Kernel mode
특권 명령어 X 특별한 권한이 있는 명령어 사용가능

Normal user <-> Root user
쓸 수 있는 명령어 제한 권한 가짐, DAC 기반
(ex) sudo, 디스크 포맷 X) File 권한 임의 변경 가능, 자원 접근 마음대로 함

Secure OS는 Super user 개념이 없다 why? Super User가 공격자가 되었을때의 보호기법이 없기 때문

File Permissions


  • 읽기 보호 : 기밀성 제공 -> read를 막음으로써 암호화가 필요없어도됨
  • 쓰기 보호 : 무결성 제공 -> write를 막음으로써 무결성 제공
  • 명령어
    id : 현재 로그인한 계정 정보 출력
    touch : 시간 정보 현재로 변경(날짜 정보), 파일이 없을 결우 새 파일 만듦
  • File permission bit는 9bit? -> 12bit이다
  • Directory 권한이 X? 실행이 아니라 디렉토리 접근 권한이다. 디렉토리가 접근 불가능하면 디렉토리 내 파일에 접근이 불가하다.
728x90
반응형

'공부 > 보안' 카테고리의 다른 글

set-UID Privileged programs  (0) 2020.10.15
운영체제보안 4  (0) 2020.09.22
운영체제 보안 2  (0) 2020.09.10
운영체제 보안 1  (0) 2020.09.10
사이버 킬체인 연습(자동차 해킹 예시)  (0) 2020.07.17
블로그 이미지

아상관없어

,
반응형

Interfaces in Linux


user

ㅡㅡㅡㅡ -> User interface

Standard utility programs

(shell, editors, compilers etc) => user mode

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ -> Library interface
Standard libarary
(open, close, read, write, fork etc) => kernel mode
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ -> System call interface
Linux operating system
(process managaement, memory management .. etc)
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
Hardware
(CPU, memory, disks etc)

  • 일반 APP들은 Library를 통하거나 직접 System call 인터페이스 사용가능
  • System call interface = 운영체제에게 서비스를 요청하는 방식
  • cpu가 커널 영역에 있는 code를 수행하면 커널모드이다.

User, Kernel mode


  • kernel mode
    신뢰되는 운영체제 코드를 프로세서가 실행될 때 모드
    특권명령어/권한을 부여 => 모든 명령어 실행가능 ( 모든 자원 접근 가능)
  • Kernel은 운영체제의 핵심적인 부분으로써 직접 하드웨어와 상화작용함
  • kernel은 부팅이 되면 메모리로 load되고 컴퓨터가 동작하는 동안에는 메모리에 상주 <-> 사용자 프로그램은 실행 할 때만 메모리에 올라감

운영체제의 핵심모듈은 반드시 Kernel모드에서 수행되어야함
잠재적으로 위험(중요)한 코드 이므로 엄격한 인터페스를 통해서만 진입한다.
미리 만들어둔 코드만 정상적으로 돌려야한다.

  • User mode
    사용자 프로그램이나 유틸리티 프로그램이 실행 될때 권한을 제한함
    중요한 하드웨어 자원을 직접 접근하지 못하고 운영체제를 통해서 접근가능함.
  • 언제 애플리케이션이 커널모드로 진입?
  • 예외 발생시 -> 다른 프로세스의 메모리 영역을 침범하거나 0으로 나누거나, int overflow
  • 애플리케이션이 중요한 시스템 서비스를 받고자 할때 ( System call 요청 )
  • 하드웨어 인터럽트
    I/O 장치가 이전에 시킨일을 끝냈을 때 -> cpu가 어느 시점이 되면 입출력 장치에게 일을 내림. 입출력이 완료되기 전에 문맥교환을 하여 다른 일을함. 언젠가는 나중에 디스크에 쓰는 작업 그러면 I/O 인터럽트가 걸림

Exception Processing


  • 운영체제가 어떤 예외인지 파악 = > 따라서 mode가 바뀌어야한다.
  • mode 변경위해 현재 상태를 저장한다
  • 나중에 복구할 수 있는지 확인한다.
  • 복구가 어려우면 해당 프로세스 Kill
  • user 모드에서 예외 발생시 -> kernel mode로
  • kernel 안에서 발생시 -> system down

Interrupt 발생


  • 자기보다 우선순위가 낮은 인터럽트 disable
  • 인터럽트 당한 프로세스 정보 저장
  • 이후 restore

OS Challenge


  • 동시에 여러 사용자 가능, 많은 자원 공유 가능
  • 운영체제는 사용자들을 다른 사용자로 부터 보호해야하고, 프로세스를 다른 프로세스로부터 보호해야한다.

OS's role


  • 내부적 특성
    특권 모드, 메모리 보호, 파일 접근 권한
  • 사용자들로부터 OS 보호
  • 다른 유저들로 부터 사용자 보호

Protection


  • No Protection -> 멀티 태스킹 X, 한 사용자만 한번에
  • Isolation -> 물리적으로 사람마다 다른 컴퓨터 사용하게
  • Share via access limitation -> 물리적 메모리 공유 가능, But 논리적으로 분리
  • Limit user of an object -> 관리자만 접근

Security


허가 되지 않은 객체가 원하지 원하지 않는 행동을 하는 것을 막음

STRIDE


  • Spoofing 위장 -> 인증
  • Tampering 변조 -> 무결성
  • Repudiation 부인 -> 무결성
  • Information Disclosure 정보유출 -> 암호화
  • Denial of Service 서비스거부 -> 가용성
  • Elevation of Privilege 권한상승 -> 권한

OS Protection Principles


  • Separtion
  • physical
  • temporal
  • logical
  • cryptographic
  • memory protection
  • sandbox
728x90
반응형

'공부 > 보안' 카테고리의 다른 글

set-UID Privileged programs  (0) 2020.10.15
운영체제보안 4  (0) 2020.09.22
운영체제보안 3  (0) 2020.09.16
운영체제 보안 1  (0) 2020.09.10
사이버 킬체인 연습(자동차 해킹 예시)  (0) 2020.07.17
블로그 이미지

아상관없어

,
반응형

What is OS?


시스템 소프트웨어로써, H/W, S/W 자원들을 관리해준다. H/W와 APP사이에 있으면서 인터페이스를 제공해준다.
컴퓨터 프로그램들에게 공통적 서비스를 제공해준다.

Fucntion of an OS


  • 공유
    제한된 자원을 가지고 여러사람 또는 여러개의 프로세서, thread가 공유 할 수 있도록 만들어준다.
    즉 효율적으로 사용할 수 있도록 자원을 관리 해준다.
  • 멀티 유저
    하나의 기계(서버, 시스템)을 여러사람이 동시에 사용가능 (80년대 컴퓨터는 이용료를 내고 사용햇음)
    예) 구글, 카카오 서버
  • 멀티 태스킹
    하나의 core에서 여러 프로세스를 번갈아가며 실행 => 병행 수행
  • 멀티 프로세싱
    cpu개수만큼 프로세스가 여러개 돌아감. 멀티 태스킹보다 비용이 많이듬. 코어가 여러개 필요함
  • 멀티 스레딩
    thread : 프로세스 보다 수행단위가 작음 = 프로세스의 일부분
    한 프로세스내에 여러 스레드가 존재함.
    예) 하나의 프로세ㅐ스에 여러 개의 함수가 존재 (여러가지 함수 = 동시에 동작하므로 thread)

cpu 여러개 : 동시
core 하나 : 번갈아 가면서

What is OS & Kernel?


  • 운영체제들은 유저모드, 커널모드 두가지를 지원함
  • 커널은 운영체제에서 핵심적인 부분이다. 시스템에 대한 모든 통제권을 가진다.
  • 중요하므로 메인 메모리에 상주한다 => 자주 쓰이고 빨리 서비스 가능하기 위해
  • 커널 코드는 메모리 영역에서 분리되어 로드된다. => 애플리케이션 프로그램들이나 다른 부분들로부터 보호함
    APP이 H/W 사용시 => 미리 규정이 되어 있는 인터페이스를 통해서 요청한다.(임의접근X)
  • 전반적인 하드웨어를 제어할 수 있는 수준을 제공
    CPU 스케줄링, 문맥교환, IPC, 메모리 관리, 인터럽트 핸들러, 예외 핸들러
    H/W자원직접관리하며, H/W서비스 직접 처리한다.
  • Kernel은 하드웨어와 애플리케이션간 인터페이스이다.

OS Operations


유저 프로그램은 잘못된 명령어(특권 명령어나 존재하지 않는 명령어)나 금지된 메모리 영역에 접근하려 할 수 있다.
그럴 경우 SW Interrrupt가 발생함.

문제 발생시 제어흐름이 운영체제로 넘어가서 에러 메시지를 보냄. 그 당시 상황을 저장하고(디버깅 할 수 있게) 문제 프로그램을 종료한다.

Function of OS


  • Protection
    보호
    주로 내부적 공격
    사용자나 프로세스의 자원 접근을 통제한다.
    고의 or 실수로 접근할 수 없는 자원을 접근하려 할 때
    다른 프로세스와 간섭이 일어날 때 통제 할 수 있게 보장함
  • Security
    보안
    의도적인 공격임
    내부의 인가된 사용자가 권한을 얻으려 할 때
    외부적인 공격자가 의도적인 공격을 할 때

Trusted OS


설계한 기능만을 수행하는가?
설계하지 않는것은 구현 X

728x90
반응형

'공부 > 보안' 카테고리의 다른 글

set-UID Privileged programs  (0) 2020.10.15
운영체제보안 4  (0) 2020.09.22
운영체제보안 3  (0) 2020.09.16
운영체제 보안 2  (0) 2020.09.10
사이버 킬체인 연습(자동차 해킹 예시)  (0) 2020.07.17
블로그 이미지

아상관없어

,

Github SourceTree

공부/기타 2020. 9. 3. 15:27
반응형

Commit = 스테이지에 올린 파일들을 묶고 스냅샷

Pull = 원격 저장소에 있는 모든 커밋 다운로드

Push = 로컬에서 원격으로 업로드 ( Commit시 로컬에 저장되므로 Push함)

Patch = 새로고침

Branch = 새로운 기능 추가할 때 사용, Branch 생성

Merge = 두 Branch를 합침

Stash = 작업 도중 브랜치 바꿈, 임시 저장공간 ( 신규 파일은 되지 않는다 = 변경사항이 없기 때문), 이전 commit 덮어씀

Git Flow

- master : 기준 브랜치

- develop : 개발 브랜치, 이 브랜치 기분으로 작업한 기능 merge함

- feature : 단위기능 개발 브랜치, 완료후 develop과 merge

- release : QA 품질검사

- hotfix : 배포후 버그가 생겼을때 긴급수정

 

 

ex)

1. master 브랜치에서 시작

2. 동일 브랜치 develop에 생성

3. develop에서 개발

4. 기능 구현 필요시 feature 브랜치로 각자 기능 구현후 develop과 merge

5. 모든 기능 완료시 develop 브랜치를 release 브랜치로 만들어버림

6. 모든 것이 완료되면 release 브랜치를 master와 develop브랜츠로 보냄

7. 버그 발생시 hotfix 브랜치를 만들어 수정

 

fork 하여 프로젝트 복사후, 각자 개발하여 fork한 원격 저장소에 push하고 메인 원격 저장소에 pull request함

 

1. github을 clone

2. add하여 스테이지에 올림

3. 커밋하여 변경사항 저장

4. 원격저장소에 push

 

728x90
반응형
블로그 이미지

아상관없어

,
반응형

글머리1(# _)

글머리2(## _)

글머리3(### _)

글머리4(#### _)

글머리5(##### _)

글머리6(###### _)

강조

italic = * a *, _ a _

*italic*

_italic_

굵은 글씨 = ** a **, __ a __

**굵은 글씨**

__굵은 글씨__

줄 긋기 = ~~ _ ~~

~~줄긋기~~

굵은글씨 italic = **_

**_굵은글씨 italic_**

인용구

앞에 > 붙임

인용구 테스트

숫자

숫자와 점을 이용

  1. 첫번째
    1. 세부1
    2. 세부2
  2. 두번째
  3. 세번째

목록

*, +, -

각각 순서대로

  • star
    • plus
      • minus

외부 링크

[] = 타이틀 () = 링크

[naver](https://naver.com)

수평선 줄



<hr/>

-연속

*연속

< hr/ >

이미지

[![Picture]()

]

코드 강조

`` 코드 묶기(역따옴표 씀)

글을 쓰다가 코드 강조시 `printf("hello world")`로 하면 된다.

코드 전체 삽입

` 3번 입력 후 사용언어 입력

b = 1; c = 1;

문법 연습.md
0.00MB

728x90
반응형
블로그 이미지

아상관없어

,
반응형
void setup() {
  // 센서값을 측정하기위해 시리얼통신을 준비합니다.
  Serial.begin(9600); 
}

void loop() {
  //아날로그 0번 핀에 압력센서를 연결합니다.
  int sensorval = analogRead(A0);

  

  
   
  Serial .println("Sensorvalue : " +String(sensorval));
  
  //100ms동안 대기합니다. 
  delay(100);
}

 아날로그 핀을 사용하였다.

728x90
반응형

'공부 > 아두이노' 카테고리의 다른 글

아두이노 온습도 센서  (0) 2020.07.18
아두이노 미니 스마트홈  (0) 2020.07.17
아두이노 센서 여러개 사용시 에러  (0) 2020.07.17
블로그 이미지

아상관없어

,
반응형
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
}
void loop() {
  delay(2000);
  int h = dht.readHumidity();
  int t = dht.readTemperature();
  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.println(" C");
}

datapin은 2번핀이다.

728x90
반응형

'공부 > 아두이노' 카테고리의 다른 글

아두이노 압력센서  (0) 2020.07.18
아두이노 미니 스마트홈  (0) 2020.07.17
아두이노 센서 여러개 사용시 에러  (0) 2020.07.17
블로그 이미지

아상관없어

,

정렬하기

공부/자료구조 2020. 7. 17. 15:24
반응형

InsertRand.c
Sort.h
Sort.c
Makefile

728x90
반응형
블로그 이미지

아상관없어

,
반응형

정찰

최신의 자동차들은 ECU라고 불리는 전자 제어장치를 장착한다. 차량에는 편의 기능을 위하여 장착된 ECU수가 많다.  이들간 통신을 위해 CAN이라는 단일버스 네트워크를 사용한다. CAN은 외부 네트워크에서 적용되는 보안기법에 취약하다. ICT와 융합된 커넥티드 카는 운행 중에도 외부네트워크와 항상 연결이 되어있고, 통신장치를 자동차에 장착할 수 있다. 커넥티드 카는 ECU들로 내부 네트워크를 구성한 자동차, 네트워크 서비스를 제공하는 Portal 그리고 자동차와 Portal을 연결해주는 통신 Link로 이루어져있다. 출고 시 기본 장착되는 통신장치 외에 third-party 통신장치가 추가 장착이 가능하다. 이 통신장치로 정보를 수집하거나 외부에서 원격으로 차를 조종할 수 있다. 운전자들은 스마트폰과 자동차간의 통신을 이용해 다양한 편의기능을 사용한다. 웹기반과 스마트폰 앱 기반 서비스로 자동차와 통신을 할 수 있다. 안드로이드 앱을 사용하는 경우, 역공학과 리패키징의 취약한 문제점이 있다.

이러한 After Market에서 판매되는 H/WS/W의 사용이 가능하다. 자동차 내부 네트워크와 자동차용 정비기기 사이의 통신을 지원하는 마이크로 컨트롤러인, ELM327기반의 무선통신 모듈을 사용하여 스마트폰과 자동차 내부 네트워크를 무선을 연결 할 수 있다. ELM327 제조사는 관련 H/WS/W를 제작할 수 있는 Data Sheet를 제공한다.

 

무기화

CAN의 보안 취약점과 안드로이드 앱의 역공학, 리패키징 취약점, 차량과 스마트폰과의 통신을 이용하여 무기화를 한다.

스마트폰 앱과 자동차간 통신이 가능한 점을 이용하여, 안드로이드 앱을 리패키징하여 악성앱을 제작한다. ADB Shell을 사용하여 정상적인 앱의 APK파일을 획득하고, 획득한 APKDEX(소스 코드를 컴파일한 결과물)파일을 획득한다. DEX파일이 가상머신에서 동작하는 바이트코드의 구조적 특징을 가진다는 점을 이용하여, 원본과 유사한 Java코드와 Smali코드를 얻는다. 분석을 하여 Smali코드에서 악성코드를 추가한다. 그리고 안드로이드 정책상 개발자 스스로 앱에 서명을 하여 배포하므로 임의로 서명을 하여 악성 앱을 배포할 수 있다.

자동차 진단 앱과 통신 모듈 ELM327의 통신을 이용하여, 앱에서 발생하는 통신데이터를 변경한다. 변조된 앱을 사용하여 ECU 강제 제어 데이터프레임을 CAN에 삽입하여, 정비용 CAN ID를 원하는 CAN ID로 변환한다. 모듈 Data Sheet를 참조하여 모듈을 제어할 수 있는 AT Command들을 획득한다. AT Command들을 이용하여 실제 CAN으로 원하는 CAN ID로 변환하여 원하는 데이터를 전송한다. 

CAN은 각 노드 간 통신시 암호화와 인증이 되어있지 않는 취약점이 있다. 앱으로 통신 모듈 ELM327과 블루투스로 통신될 때, Request-Response 메시지를 획득하여 자동차의 상태 정보를 획득한다. Java 기본함수 탐색을 통해 Smali 코드에 자동차 강제제어 코드를 삽입할 곳을 찾는다. 악성 앱에서 필요한 공격 Smali코드를 추출하고 공격 대상 앱에 적용하여 변조한다. 자동차의 상태 정보를 획득한 뒤, 특정 조건일 때, 변조된 앱으로 원래의 Request 메시지 대신 원하는 메시지로 변경하고 차량을 제어한다.

 

유포

자동차 정비 앱의 디자인을 바꿔 새로운 앱이 출시된 것처럼 가장한다. 그리고 가짜 광고를 통해서 자동차 정비 앱이 필요한 사용자들에게 홍보를 한다. 무료로 다운받을 수 있는 링크를 제공하여 사용자의 다운을 유도한다. 초기에는 정상적인 앱처럼 정상 작동을 하다 어느 시점이 지나면 코드가 동작이 되게 하여, 초기 사용자들이 좋은 평점을 남기게 한다. 그 평점을 이용하여 더 많은 사용자들의 다운을 유도한다. 또는 유료앱이 필요한 사용자들을 노린다. 악성 앱을 유명한 유료앱의 디자인으로 바꾸는 등 속이기 위한 위장을 하고, 블랙마켓, 앱에 대한 사전심사, 검사를 하지 않는 앱마켓 등에 뿌리고 사용자들의 다운로드, 설치를 유도한다.

 

악용 및 설치

사용자가 변조된 자동차 정비 앱을 다운로드, 설치 후 변조된 앱으로 자동차와 통신을 한다.

 

명령 및 제어

사용자가 변조된 앱을 다운로드, 설치 후 자동차와 통신을 함으로써, 악성코드가 심어진다. 그 후, 자동차는 사용자의 제어와 상관없이 심겨진 악성코드의 제어대로 움직이게 된다.

 

목적달성

공격자의 코드대로 차를 제어하여, 특정한 시점 또는 즉시, 운전자의 운전 제어를 방해한다.

.

 

 

 

공격 프로세스

사이버킬체인 사이버공격 설명
정찰 정보수집 자동차의 전자 제어장치와 내부 네트워크를 조사하고, 외부에서 접근할 수 있는 수단 등을 조사한다. 취약점이 나올만한 관련 정보도 모두 수집한다.
무기화 공격준비 정보수집 단계에서 수집한 정보들을 활용한다.
통신 모듈 ELM327로 앱, 자동차가 보안이 되지 않은 통신을 한다. CAN의 보안 취약점을 활용하여 자동차 내부 네트워크를 제어한다. 안드로이드 앱의 역공학, 리패키징을 이용하여 악성앱을 만든다. 위 두 취약점을 이용하여 앱으로 자동차 내부 네트워크를 제어하게 설계한다.
유포 유포 악성 앱을 새로운 앱처럼 홍보, 무료 다운로드 링크를 제공한다. 블랙마켓, 앱에 대한 사전 심사, 검사를 하지 않는 앱마켓에 악성앱을 유포한다.
악용 악용 사용자가 악성 앱을 다운로드하고 설치한다.
설치 설치 사용자가 악성 앱으로 자동차와 통신을 하면 ECU 강제 제어 데이터프레임이 CAN에 삽입된다.
명령 및 제어 명령 및 제어 악성 앱에 심어진 코드대로 자동차가 제어된다.
목적 달성 목적달성 특정 시점 혹은 항상, 운전자가 자동차를 제어하지 못하게 하거나 운전을 방해한다.

 

공격방법

정찰 단계에서 자동차의 공격점들을 찾아 무기화 단계에서 다음과 같은 취약점들을 이용하였다. 자동차 OBD-II 단자에는 여러 모듈을 장착할 수 있고 CAN은 추가된 ECU를 식별하지 못하며, 통신 참여를 제어하지 못한다. 정비 모듈을 사용하여 자동차 진단 앱과 통신을 할 수 있다. 안드로이드 역공학, 리패키징을 이용하여 악성 앱을 제작할 수 있다. CAN의 보안은 암호화/인증이 되지 않는다. 이러한 Attack Surface들을 찾아내어, 정상적인 앱을 역공학, 리패키징하여 악성코드를 추가한다. 이렇게 변조를 하여 악성 앱을 제작한다. 그리고 이 악성 앱을 유포, 설치한다.  OBD-II 단자를 통해 통신 모듈을 추가한 뒤, 변조된 악성 앱으로 통신을 한다. AT Command로 원하는 데이터를 전송하여 자동차를 제어한다.

 

방어기법

정상적인 앱을 악성 앱으로 역공학하기 어렵게 한다. 정상적인 자동차 정비 앱을 만들 때, 식별자 변환, 제어 흐름, 암호화 기법, API 은닉 기법을 사용한다. 자동차 정비 앱에서 분석의 대상은 주로 개발상 사용되는 일부 문자열과 함수이기 때문에 위 기법들로 난독화 과정을 한다. 이러한 과정들로 APK의 중요 로직이나 코드, 리소스 등을 보호한다. 무기화 단계의 안드로이드 앱의 취약점을 방어하고, 유포, 악용, 설치 단계를 하지 못하게 하여 결국 명령 및 제어를 막는다. 따라서 목적달성을 실패하게 한다.

ELM327 통신 모듈이 제어 명령으로 정상적인 정비 ID 이외에 원하는 CAN ID의 데이터를 생성할 수 있어 자동차를 강제 제어 할 수 있다. 따라서 ELM327 모듈이 정비용 ID만 사용하도록 설계를 한다. 무기화 단계의 CAN의 보안 취약점을 방어한다. 따라서 설치 단계의 ECU 강제 제어 데이터프레임을 CAN에 삽입하지 못하게 한다.

OBD-II 단자는 여러 통신 모듈을 장착 할 수 있으므로 ELM327외에 다른 모듈이 취약점이 될 가능성이 있다. 따라서 CAN 데이터에 대한 접근제어를 해야한다. 자동차를 정비 중과 주행 중으로 구분을 한다. 정비 중일 경우 모든 CAN ID의 접근제어를 해제하고, 주행 중일 경우 특정 CAN ID데이터만 접근 가능하도록 필터링한다. 무기화 단계의 CAN의 보안 취약점을 방어하여 내부 네트워크에 접근, 제어를 하기 어렵게한다.

 

단계별 방어기법

공격 전 단계 공격시도 단계 공격 후 단계
정찰 무기화 전달 익스플로잇 설치 C&C 행동개시
OBD-II 단자 접근 제어 안드로이드 앱 난독화 정상적인 앱마켓 사용 Threat Emulation Anti-Bot Anti-Bot Anti-Bot
ELM327 Data Sheet 허가된 사용자만 사용 CAN 통신 암호화 Anti-Spam Anti-Virus CAN ID 접근 제어 Endpoint Security Endpoint Security
CAN 통신 암호화 CAN 데이터 접근제어 URL Filtering 인증된 앱만 설치 Intrusion Prevention System
Data Leak Prevention   Mobile Threat Prevention Mobile Threat Prevention
  Threat Emulation Threat Emulation
Threat Extraction Intrusion Prevention System
728x90
반응형

'공부 > 보안' 카테고리의 다른 글

set-UID Privileged programs  (0) 2020.10.15
운영체제보안 4  (0) 2020.09.22
운영체제보안 3  (0) 2020.09.16
운영체제 보안 2  (0) 2020.09.10
운영체제 보안 1  (0) 2020.09.10
블로그 이미지

아상관없어

,
반응형

ECB_BMPFileEncryption.java ▼

import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.io.*;

public class EcbMode {

     
    public static void main(String[] args) throws Exception{

    KeyGenerator kg = KeyGenerator.getInstance("DES");
    kg.init(new SecureRandom());
    SecretKey secretKey = kg.generateKey();

    FileInputStream inFile = new FileInputStream("c:/simpsons.bmp");

	
    Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, secretKey);

    FileOutputStream outFile = new FileOutputStream("ECB_simpsons.bmp");

    byte[] input = new byte[64];
    int bytesRead;
    while((bytesRead = inFile.read(input)) != -1){
        byte[] output = cipher.update(input,0,bytesRead);
        if(output != null)
            outFile.write(output);
    }

    byte[] output = cipher.doFinal();
    if(output != null)
        outFile.write(output);

    inFile.close();
    outFile.flush();
    outFile.close();
    }
}

KeyGenerator keyGenerator = KeyGenerator.getInstance("DES"); //DES알고리즘으로 키 생성 Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); //DES알고리즘, ECB(Electronic Code Block) Mode 암호화 방식, Padding

 

CBC_BMPFileEncryption.java▼

import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.io.*;

public class CbcMode {

    
     // @param args the command line arguments
     
    public static void main(String[] args) throws Exception{
         //TODO code application logic here

	//키 발생기 kg 선언 DES형태
    KeyGenerator kg = KeyGenerator.getInstance("DES");
    kg.init(new SecureRandom());//랜덤값으로 키 초기화
    SecretKey secretKey = kg.generateKey();//비밀키 생성

    FileInputStream inFile = new FileInputStream("simpsons.bmp");
	//현재폴더에서 simpsons.bmp 불러옴
	
    Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");//DES알고리즘/ECB모드/패딩함
    cipher.init(Cipher.ENCRYPT_MODE, secretKey);

    FileOutputStream outFile = new FileOutputStream("CBC_simpsons.bmp");

    byte[] input = new byte[64];
    int bytesRead;
    while((bytesRead = inFile.read(input)) != -1){
        byte[] output = cipher.update(input,0,bytesRead);
        if(output != null)
            outFile.write(output);
    }

    byte[] output = cipher.doFinal();
    if(output != null)
        outFile.write(output);

    inFile.close();
    outFile.flush();
    outFile.close();
    }
}

KeyGenerator keyGenerator = KeyGenerator.getInstance("DES");

//DES알고리즘으로 키 생성

Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");

//DES알고리즘, CBC(Cipher Block Chaining) Mode 암호화 방식, Padding

 

CTR_BMPFileEncryption.java▼

import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.io.*;

public class CtrMode {

    
     // @param args the command line arguments
     
    public static void main(String[] args) throws Exception{
         //TODO code application logic here

	//키 발생기 kg 선언 DES형태
    KeyGenerator kg = KeyGenerator.getInstance("DES");
    kg.init(new SecureRandom());//랜덤값으로 키 초기화
    SecretKey secretKey = kg.generateKey();//비밀키 생성

    FileInputStream inFile = new FileInputStream("simpsons.bmp");
	//현재폴더에서 simpsons.bmp 불러옴
	
    Cipher cipher = Cipher.getInstance("DES/CTR/PKCS5Padding");//DES알고리즘/ECB모드/패딩함
    cipher.init(Cipher.ENCRYPT_MODE, secretKey);

    FileOutputStream outFile = new FileOutputStream("CTR_simpsons.bmp");

    byte[] input = new byte[64];
    int bytesRead;
    while((bytesRead = inFile.read(input)) != -1){
        byte[] output = cipher.update(input,0,bytesRead);
        if(output != null)
            outFile.write(output);
    }

    byte[] output = cipher.doFinal();
    if(output != null)
        outFile.write(output);

    inFile.close();
    outFile.flush();
    outFile.close();
    }
}

KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");

//AES알고리즘으로 키 생성

Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5Padding");

//AES알고리즘, CTR(Counter) mode 암호화 방식, Padding

여기서 같이 암호화된 헤더파일 부분을 수정해주면 볼 수 있게 된다

 

728x90
반응형
블로그 이미지

아상관없어

,