LINUX SECURITY - 보안 웹 개발 -

Slides:



Advertisements
Similar presentations
프로그램이란 프로그램 생성 과정 프로젝트 생성 프로그램 실행 컴퓨터를 사용하는 이유는 무엇인가 ? – 주어진 문제를 쉽고, 빠르게 해결하기 위해서 사용한다. 컴퓨터를 사용한다는 것은 ? – 컴퓨터에 설치 혹은 저장된 프로그램을 사용하는 것이다. 문제를 해결하기 위한.
Advertisements

프로그래밍언어론 TA 윤들녁. 소개 윤들녁 연락처 : 공대 7 호관 4 층 401 호 데이터베이스 연구실 실습 후 날짜 _ 학번.zip 으로.
Format String Attack! 포맷 스트링 공격 경일대학교 사이버보안학과 학년 남주호.
목 차 C# 언어 특징 .NET 프레임워크 C# 콘솔 프로그램 C# 윈도우 프로그램 실습 프로그래밍세미나 2.
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
ㅎㅎ 구조체 C++ 프로그래밍 기초 : 객체지향의 시작 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스
2장. 프로그램의 기본 구성. 2장. 프로그램의 기본 구성 2-1"Hello, World!" 들여다 보기 /* Hello.c */ #include int main(void) { printf("Hello, World! \n"); return 0;
Image & Video processing
제14장 동적 메모리.
인공지능실험실 석사 2학기 이희재 TCP/IP Socket Programming… 제 11장 프로세스간 통신 인공지능실험실 석사 2학기 이희재
컴퓨터 프로그래밍 기초 [Final] 기말고사
Power Java 제2장 자바 개발 도구.
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 12. 포인터의 이해.
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
시스템 보안 [Buffer Overflow] DEC, 15, 2013 By 박동혁.
임베디드 시스템 개론 크로스 플랫폼 설치 2일차 강의 자료 Embedded System Lab.
양방향 파이프의 활용 양방향 통신 파이프는 기본적으로 단방향이므로 양방향 통신을 위해서는 파이프를 2개 생성한다.
제 3장. C보다 나은 C++ II.
12장 파이프.
CHAPTER 02 OpenCV 개요 PART 01 영상 처리 개요 및 OpenCV 소개.
LINUX SECURITY - 침 입 탐 지 - 네트워크 실험실 김 윤 수 #
Root Filesystem Porting
1. C++ 시작하기.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
8장 함수 함수의 필요성 라이브러리 함수와 사용자 정의 함수 함수의 정의, 원형, 호출 배열을 함수 인자로 전달 재귀호출.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
Root Filesystem Porting
Cross Compiler 설치.
TCP/IP Socket Programming…
14장. 포인터와 함수에 대한 이해.
14. 예외처리.
11장. 1차원 배열.
10강. JSP 본격적으로 살펴보기-II 스크립트릿, 선언, 표현식 지시자 주석 Lecturer Kim Myoung-Ho
Method & library.
JA A V W. 03.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
이름 : 황 상 두 전화번호 : 이메일 : PinTool 이름 : 황 상 두 전화번호 : 이메일 :
Homework #6 (1/3) 다음을 수행한 후, 화면(혹은 파일)을 출력하여 제출한다.
24장. 파일 입출력.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express Slide 1 (of 22)
19. 함수 포인터와 void 포인터.
Homework #6 (1/3) 다음을 수행한 후, 화면(혹은 파일)을 출력하여 제출한다.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
프로그래밍 원리 Chapter 05 자바스크립트 기초 신한대학교 IT융합공학부 박 호 균.
LINUX SECURITY - Telnet 보안 -
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
웹디자인
자바 5.0 프로그래밍.
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
1. 스크립트 작성 마법사 2. NSIS 스크립트 컴파일
문자열 컴퓨터시뮬레이션학과 2015년 봄학기 담당교수 : 이형원 E304호,
컴퓨터 프로그래밍 기초 [01] Visual Studio 설치 및 사용방법
Canary value 스택 가드(Stack Guard).
( Windows Service Application Debugging )
수동 설치시는 설치 방법 1. 두번에 설치 CD 속에 fscommand 폴더 밑에 Osstem 이라는 폴더를
시스템 인터페이스 Lab#5 쉡 실습.
Chapter 01 자바의 개요 자바는 최초 전자기기의 내장형 소프트웨어를 위해 개발되었으나, 최근 엔터프라이즈 응용에도 폭 넓게 활용됨 자바의 특징과 실행방법, 개발 환경 및 도구에 대해 소개.
함수, 모듈.
발표자 : 이지연 Programming Systems Lab.
4. 셸을 이용한 명령어 입력. Unix 시스템 쉘 간단한 셸 명령 명령 매개변수(Command arguments)
Numerical Analysis Programming using NRs
실습과제 (변수와 자료형, ) 1. 다음 작업 (가), (나), (다)를 수행하는 프로그램 작성
1장 C 언어의 개요 C 언어의 역사와 기원 C 언어의 특징 프로그램 과정 C 프로그램 구조 C 프로그램 예제.
제 29 강 스트링(string) 다루기 s a i s . s T i h t g r i n.
29장. 템플릿과 STL 01_ 템플릿 02_ STL.
개정판 누구나 즐기는 C언어 콘서트 제13장 동적 메모리 출처: pixabay.
6 객체.
20 XMLHttpRequest.
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

LINUX SECURITY - 보안 웹 개발 - 네트워크 실험실 김 윤 수 2019-04-30 #

목 차 다양한 관점의 개발 위험 요인 쉘 호출 Buffer Overrun 경로명, 디렉토리, 파일 목 차 다양한 관점의 개발 위험 요인 쉘 호출 Buffer Overrun 경로명, 디렉토리, 파일 보안 프로그래밍과 테스트 도구 2019-04-30 #

다양한 관점의 개발 위험 요인 보안에 문제가 있는 개발 도구 잘못된 코드 환경 프로그램밍 언어와 라이브러리 문제 개발도구의 사용방법에 대한 문제점 환경 실행 환경 문제 단순, 객체지향적, 분산환경의 응용에 적합, 인터프리터, 안전, 구조중립, 이식성, 높은 성능, 다중 쓰레드, 동적 견고(포인터X, garbage Collection, 엄격한 형검사, 실시간 에러 처리) 컴파일에 의해 바이트 코드로 변환되고 실행시에 인터프리터에 의해 해석되어 처리. 2019-04-30 #

쉘 호출 System () popen () open () eval exec 단순, 객체지향적, 분산환경의 응용에 적합, 인터프리터, 안전, 구조중립, 이식성, 높은 성능, 다중 쓰레드, 동적 견고(포인터X, garbage Collection, 엄격한 형검사, 실시간 에러 처리) 컴파일에 의해 바이트 코드로 변환되고 실행시에 인터프리터에 의해 해석되어 처리. 2019-04-30 #

system()으로 쉘명령 수행 문제1) 사용자 입력을 받아서 내부 명령 수행 문제2) C나 Perl로 부터 쉘 명령을 실행 C의 system()함수 System()은 매개변수로 주어진 문자열을 /bin/sh –C의 인자로 사용하여 호출하고, 그 명령이 종료되었을때 복귀한다. system()함수를 다음 용도에 사용 금지 공개적으로 접근가능한 프로그램이나 웹호스트 스크립트 SGID 프로그램이나 스크립트 SUID 프로그램이나 스크립트 환경변수조작, 메타문자삽입 인자목록에 명령어를 추가하여 쉘 명령 수행 단순, 객체지향적, 분산환경의 응용에 적합, 인터프리터, 안전, 구조중립, 이식성, 높은 성능, 다중 쓰레드, 동적 견고(포인터X, garbage Collection, 엄격한 형검사, 실시간 에러 처리) 컴파일에 의해 바이트 코드로 변환되고 실행시에 인터프리터에 의해 해석되어 처리. 2019-04-30 #

system()으로 쉘명령 수행 bash, csh, ksh에서의 메타문자 목 적 bash csh ksh 파일에 추가 목 적 bash csh ksh 파일에 추가 >> 홈디렉토리 /~ ~ 입력방향지정 > 출력방향지정 < 파이프 | 명령어분리자 ; 백그라운드실행 & 단순, 객체지향적, 분산환경의 응용에 적합, 인터프리터, 안전, 구조중립, 이식성, 높은 성능, 다중 쓰레드, 동적 견고(포인터X, garbage Collection, 엄격한 형검사, 실시간 에러 처리) 컴파일에 의해 바이트 코드로 변환되고 실행시에 인터프리터에 의해 해석되어 처리. 2019-04-30 #

system()으로 쉘명령 수행 System()을 사용한 프로그램 (프로그램명 testsystem) Int main() { char usercommand[20] cout << “please enter a command:”; cin >> usercommand; cout << “You entered “<< usrcommand << “\n; sysem(usrcommand); } 2019-04-30 #

system()으로 쉘명령 수행 $testsystem Please enter a command : ls total 17072 drwxr-xr-x 4 less staff 4096 Jul 31 21:53 ./ drwxr-xr-x 6 root root 4096 Jul 31 16:53 ../ -rw------- 1 less staff 9413 Aug 1 01:05 .bash_history -rw-r--r-- 1 less staff 24 Jul 31 11:54 .bash_logout -rw-r--r-- 1 less staff 311 Jul 31 11:54 .bash_profile -rw-r--r-- 1 less staff 566 Jul 31 11:54 .bashrc drwxr-xr-x 9 1078 1078 4096 Jul 31 22:23 apache_1.3.12/ 바이트 코드는 클래스 로더에 의해 로드되며, 바이트 코드 검증기는 프로그램이 수행되기 전에 부적절한 클래스 접근이나 스택의 오버 플로우, 부적절한 형변환을 검사한다. 2019-04-30 #

system()으로 쉘명령 수행 $testsystem Please enter a command : ls;finger total 17072 drwxr-xr-x 4 less staff 4096 Jul 31 21:53 ./ drwxr-xr-x 6 root root 4096 Jul 31 16:53 ../ -rw------- 1 less staff 9413 Aug 1 01:05 .bash_history -rw-r--r-- 1 less staff 24 Jul 31 11:54 .bash_logout -rw-r--r-- 1 less staff 311 Jul 31 11:54 .bash_profile Login Name Tty Idle Login Time Office Office Phone yskim Y.S.KIM /0 Aug 1 12:46 (less.kaist.ac.kr) 2019-04-30 #

system()으로 쉘명령 수행 IFS(Input Field Separator) System(“/bin/mydate”) IFS를 “ ”으로 변경 할 경한 후 PATH환경변수를 현재 디렉토리를 먼저 해놓을 경우 위의 명령은 현재 디렉토리의 bin mydate가 될 수 있으며 여기서 bin은 명령 mydate는 argument가 될 수 있다 2019-04-30 #

system()으로 쉘명령 수행 Perl에서 system() – 프로그램명 testsystem.pl #!/bin/perl Print “please enter a command: ”; $command=<STDIN>; system($command); 2019-04-30 #

system()으로 쉘명령 수행 $ testsystem.pl please enter a command : ls –l;/etc/passwd total 17072 -rw------- 1 less staff 9413 Aug 1 01:05 .bash_history -rw-r--r-- 1 less staff 24 Jul 31 11:54 .bash_logout root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin: 메타문자(;)로 구분되어 여러 개의 명령을 실행할경우 공백이 있어도 가능하다. 2019-04-30 #

C나 C++에서의 popen() Popen() 표준 I/O라이브러리를 통해 사용가능하며, C나 C++프로그램에서 쉘명령을 실행 할 수 있는 방법을 제공한다. Popen함수는 파이프를 생성하고 포크(foke)하여, 쉘을 실행함으로써 프로세스를 실행할수 있다. 파이프는 단방향으로만 정의되어있기 때문에 데이터를 스트리밍할때에는 읽기나 쓰기 둘중하나만된다. 명령행 인자는 쉘 명령을 포함하는 문자열을 가리키게 되고 파이프를 통하여 /bin/sh –c로 전달된다 단순, 객체지향적, 분산환경의 응용에 적합, 인터프리터, 안전, 구조중립, 이식성, 높은 성능, 다중 쓰레드, 동적 견고(포인터X, garbage Collection, 엄격한 형검사, 실시간 에러 처리) 컴파일에 의해 바이트 코드로 변환되고 실행시에 인터프리터에 의해 해석되어 처리. 2019-04-30 #

C나 C++에서의 popen() 다음용도의 popen 은 사용하지 금지 공개적으로 접근가능한 프로그램이나 웹호스트 스크립트 SGID 프로그램이나 스크립트 SUID 프로그램이나 스크립트 System()과 마찬가지로 popen()은 환경변수 공격에 당하기 쉽다. 내부 사용자들은 IFS와 $HOME, $PATH 변수를 바꿈으로서 악의적인 프로그램을 실행할 수 있다. 2019-04-30 #

C나 C++에서의 popen() 아래 함수를 사용하여 코드내부에 환경변수를 지정 Getenv() – 환경변수를 구한다 Putenv() – 환경변수를 바꾸거나 추가 Setenv() – 환경변수룰 바꾸거나 추가 2019-04-30 #

C나 C++에서의 popen() C에서 환경변수처리 : environ 환경변수라 불리는 문자열의 배열은 프로세서가 시작될때 exec(2)에 의해 만들어지고 변환을 통해 ‘name=value’의 형태를 취하게 된다. #include <stdio.h> extern char **environ; int main() { char **ep = environ; char *p; while ((p = *ep++)) print(%s\n”,p); return 0; } 2019-04-30 #

C나 C++에서의 popen() perl 에서 환경변수처리 $ENV{“HOME”} = ‘your_desired_hom’; $ENV{“PATH”} = ‘your_desired_hom’; $ENV{“IFS”} = ‘ ’; 2019-04-30 #

Perl의 open() open 은 perl에서 파일을 열기 위한 기본함수 .. 주어진 파일이름을 가진 파일을 열고 FILEHANDLE과 연결짓는다. FILEHANDLE은 하나의 표현식이면 그 값은 이 파일을 조작하기 위한 이름으로 사용된다. 프로세서를 열기위해서도 사용된다. 만약에 명령어 중에 “-”나 또는 “|-”, “-|”를 가진 파이프를 열게 되면 명시적을 포크(fork)를 하게 된다. Open()의 반환(return)값은 부모 프로세스 쪽에서 자식 프로세스의 PID가 되고, 자식 프로세스쪽에서 0이된다. 2019-04-30 #

Perl의 open() open()을 이용하여 파일 여는 경우 open(DATABASE, “mydatabase.txt”); while(<DATABASE>) { if(/$countents{‘search_term’}/gi) { $count++ @fields=split(‘\!\:\!’,$_); print “$fields[1] $fields[2] $fields[3]\n”; } Close(DATABASE) ; 2019-04-30 #

Perl의 open() open()을 이용하여프로세서 생성 open(PS, “ps|”) || die “cannot open PS\n\$!”; while(<PS>) { if(/pppd/) { $count++ @my_ppp=split(‘ ’,$_); kill 1 $my_ppp[0]; print “Your PPP process [PID $my_ppp[0]] has been terminated!\n”;} } Close(PS) ; If ($count==0) { print “There is no PPP process running right now\n”; 2019-04-30 #

eval(Perl과 쉘) & exec exec eval Eval은 모든 인자를 그대로 가지고 명령을 실행할 수 있도록 한다. 그러므로 , 공격자들은 다양한 공격을 실행할 수 있기 때문에 eval을 사용하는 것은 매우 위험하다 exec exec는 아무런 여과없이 모든 인자들이 그대로 전달되기때문에 eval과 마찬가지로 매우 위험하다. 이러한 이유로, exec를 실행하게 된다면 각 인자들을 작은 따옴표 안에 묶어서 사용하는 것이 좋다. Exec ‘external_program’, ‘arg1’, ‘arg2’ 2019-04-30 #

Buffer Overrun Gets()함수의 overrun Gets()는 stdin 으로부터 버퍼 s가 가리키는 포인터의 위치에 개행 문자나 EOF가 나올때까지 읽는다.하지만 버퍼 오버런은 검사하지 않는다. Gets()에서 읽는 문자열의 크기를 미리 알 수 있는 방법은 없다. …gets()는 버퍼의 끝을 지나서 계속해서 문자를 저장한다. 2019-04-30 #

Buffer Overrun Gets()함수의 사용예제 #include <stdio.h> void mail() { Char username[20]; Printf(“Please enter your username: ”); Gets(usrname); Printf(“%s\n”, username); } 2019-04-30 #

Buffer Overrun 2019-04-30 #

Buffer Overrun 위험한 루틴들 Fscanf() – 스트림 포인터인 stream으로 부터입력. Fget()을 사용. Scanf() - 표준입력인 stdin으로 부터 받는다. Fgets()을 사용후 sscanf()를 사용. Sprint() – 문자열을 가리키는 포인터 str에 새로운 문자열 기록.snprintf()사용 Strcat() – 두개의 문자열연결 sttncat()을 사용 Strcpy() – strncpy()를 사용. 2019-04-30 #

일반적인 사용자 입력 buffer이 길이를 검사하는 루틴 사용 초기 디렉토리나 경로명, 환경변수 코드에 대한 조사 Perl스크립트는 단어만 입력할 수 있도록 규칙을 만든다 변수를 삽입하는것은 위험한 일이므로 작은 따옴표를 사용 2019-04-30 #

경로명, 디렉토리, 파일 CGI 프로그램을 작성시 절대경로명으로 파일의 위치를 표시 Chdir() 파일 Perl()의 기본함수로 현재 디렉토리를 바꿔준다. 파일 예외처리루틴 추가 파일 퍼미션의 확인 UMASK설정 파일이름에 메타문자를 갖지 않도록 한다. 2019-04-30 #

다양한 보안 프로그램과 도구들 이 름 목 적 Lclint 이 름 목 적 Lclint ANSI C에서 위험한 데이터 공유, 반환값 무시, null값, 메모리 관리 에러등과 같은 오류검사 Mem_test C 프로그램에서 잘못된 곳을 찾는 라이브러리 C inside 매크로가 정확하게 사용되었는지 전처리결과를 선별적으로 확인 GNU Nana C나 C++에서 로깅 기능이나 assertion 검사기능 지원 Plumber 메모리 문제 확인 프로그램 Latro Perl의 설치가 잘못되었는지 검사 Showid 프로그램 실행동안 GID와 UID를 기록 Worm-src 인터넷 웜의 소스코드 cgihtml C 프로그램으로부터 HTML을 작성하기 위한 라이브러리 바이트 코드는 클래스 로더에 의해 로드되며, 바이트 코드 검증기는 프로그램이 수행되기 전에 부적절한 클래스 접근이나 스택의 오버 플로우, 부적절한 형변환을 검사한다. 2019-04-30 #