Presentation is loading. Please wait.

Presentation is loading. Please wait.

LINUX SECURITY - 보안 웹 개발 -

Similar presentations


Presentation on theme: "LINUX SECURITY - 보안 웹 개발 -"— Presentation transcript:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

16 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; } #

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

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

19 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) ; #

20 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”; #

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

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

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

24 Buffer Overrun #

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

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

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

28 다양한 보안 프로그램과 도구들 이 름 목 적 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을 작성하기 위한 라이브러리 바이트 코드는 클래스 로더에 의해 로드되며, 바이트 코드 검증기는 프로그램이 수행되기 전에 부적절한 클래스 접근이나 스택의 오버 플로우, 부적절한 형변환을 검사한다. #


Download ppt "LINUX SECURITY - 보안 웹 개발 -"

Similar presentations


Ads by Google