731 likes | 1.75k Views
Secure Coding. 서울여자대학교 SWING 김고은. 목차. Secure Coding 이란 ? 소프트웨어 개발 생명 주기 Secure Coding 의 필요성 Buffer OverFlow 코드 분석 Memory Map Secure Coding 을 위한 정부와 기업의 노력 Secure Code Converter 소개. Secure Coding?. 1. Secure Coding?. 잠재적 보안 위협 x 안전한 소프트웨어. 1-1. 소프트웨어 개발 생명 주기 (SLDC). 요구사항 분석.
E N D
Secure Coding 서울여자대학교 SWING 김고은
목차 • Secure Coding 이란? • 소프트웨어 개발 생명 주기 • Secure Coding의 필요성 • Buffer OverFlow • 코드 분석 • Memory Map • Secure Coding을 위한 정부와 기업의 노력 • Secure Code Converter 소개
1. Secure Coding? 잠재적 보안 위협 x안전한 소프트웨어
1-1. 소프트웨어 개발 생명 주기(SLDC) 요구사항 분석 설계 구현 테스트 유지보수
1) 요구사항 분석 Requirements Specification 요구사항명세서 기능 제약조건 목표 시간 인력 예산
2) 설계 Design 제안 시스템의 청사진을 그리는 단계
3) 구현 implementation 소스코드 작성 데이터베이스 개발
4) 테스트 Testing 검증 단계 요구 사항 소프트웨어 완성도 증가 설계 구현 검사 단계 오류 취약점
5) 유지보수 Support / Maintenance 프로그램 오류를 시정하거나 변경사항을 적용하는 등의 사후 관리
1-1. SW 개발 주기 요구사항 분석 설계 구현 테스트 유지보수
1-2. Secure Coding의 필요성 비용 절감 SW 개발단계별 결함 수정비용 분석 [NIST, The Economic Impacts of Inadequate Infrasturcture for Software Testing, 2002년 5월]
1-2. Secure Coding의 필요성 비용 절감 SW 개발단계별 결함 수정비용 분석
1-2. Secure Coding의 필요성 보안 취약점 사전 대응
2-1. Buffer OverFlow란? 메모리를 다루는 데에 오류가 발생하여 잘못된 동작을 하는 프로그램 취약점
2-2. 영역 별 메모리 구조 주소 memory 00000000 거꾸로 쌓임 코드자체 코드 전역변수 데이터 동적 할당 힙 지역변수 FFFFFFFF 스택
2-2. 메모리 구조와 스택 영역 dO_auth() 주소 memory 00000000 코드자체 코드 전역변수 데이터 Main() 동적 할당 char password[4] inti inttoken 지역변수 힙 Return address Return address char*buf Intargc, char*argv[] 지역변수 매개변수 매개변수 스택 FFFFFFFF
2-1. 안전하지 않은 코드의 예 [C] 41 41 41 41 00 00 00 00 00 00 00 00 41 41 41 41 41 41 41 41 33 33 33 33 8byte bffff294 char password[4] bffff298 int i inttoken bffff29C
2-2. 실습코드 적용 메모리 구조 intdo_auth ( char *buf ) { inttoken=0; inti=0; char password[4]; strcpy(password, buf); if(strcmp(password, “ssap”)==0) token = TOKEN; return token; } intmain ( intargc, char *argv[] ) { if(do_auth(argv[1])==TOKEN){ printf(“PASSED\N”); } else { print(“FAILE\N”); } } intdo_auth ( char *buf ) { inttoken=0; inti=0; char password[4]; strcpy(password, buf); if(strcmp(password, “ssap”)==0) token = TOKEN; return token; } intmain ( intargc, char *argv[] ) { if(do_auth(argv[1])==TOKEN){ printf(“PASSED\N”); } else { print(“FAILE\N”); } } 주소 memory 00000000 동적메모리할당 intdo_auth (…) … int main() … 코드 charpassword[4] inti inttoken char *buf Intargc, char * argv[] FFFFFFFF
2-2. 실습코드 적용 메모리 구조 주소 memory intdo_auth ( char *buf ) { inttoken=0; inti=0; char password[4]; strcpy(password, buf); if(strcmp(password, “ssap”)==0) token = TOKEN; return token; } intmain ( intargc, char *argv[] ) { if(do_auth(argv[1])==TOKEN){ printf(“PASSED\N”); } else { print(“FAILE\N”); } } 00000000 intdo_auth (…) … int main() … 동적메모리할당 코드 charpassword[4] inti inttoken char *buf Intargc, char * argv[] FFFFFFFF
2-2. 실습코드 적용 스택 영역 Detail 00000000 intdo_auth(char *buf) { inttoken=0; inti=0; char password[4]; strcpy(password, buf); … } intmain(intargc, char *argv[]){ if(do_auth(argv[1])==TOKEN) printf(“PASSED\N”); … } bffff29C bffff298 bffff294 bffff2b0 코드 STACK char password[4] inti inttoken 00 00 00 00 00 00 00 00 00 00 00 00 지역변수 Return address a8 88 04 08 2d f4 ff bf char *buf 함수인자 FFFFFFFF 주소 memory
password: AAAAAAAA3333 OVERFLOW BUFFER! 2-2. Buffer OverFlow 41 41 41 41 41 41 41 41 33 33 33 33 … 4byte < 00000000 intdo_auth(char *buf) { inttoken=0; inti=0; char password[4]; strcpy(password, buf); … } intmain(intargc, char *argv[]){ if(do_auth(argv[1])==TOKEN) printf(“PASSED\N”); … } 코드 char password[4] inti inttoken 지역변수 STACK 41 41 41 41 41 41 41 41 33 33 33 33 00 00 00 00 00 00 00 00 00 00 00 00 Return address a8 88 04 08 char *buf 함수인자 2d f4 ff bf FFFFFFFF 주소 memory
2-2. Buffer OverFlow ① 할당된 영역 넘치게 쓰기 41 41 41 41 41 41 41 41 33 33 33 33 … 4byte < ② token값 덮어쓰기 ③ Passed 출력 OVERFLOW BUFFER! char password[4] inti inttoken STACK 지역변수 41 41 41 41 41 41 41 41 33 33 33 33 00 00 00 00 00 00 00 00 00 00 00 00 Return address a8 88 04 08 char *buf 함수인자 FFFFFFFF 2d f4 ff bf 주소 memory
BOF (feat. Return address)
Buffer OverFlow통한 악성코드 실행 ① 할당된 영역 넘치게 쓰기 31 c0 b0 02 cd 80 85 c0 … 90 90 90 90 … d8 f0 ff bf 204< ② 악성 코드 삽입 BFFFF0D8 ③ Return Address 덮어쓰기 ④ 악성 코드 실행 OVERFLOW BUFFER! STACK charrcv_buffer[200] intnbytes 지역변수 31 c0 b0 02 cd 80 85 c0 … 90 90 90 90 90 90 31 c0 b0 02 cd 80 85 c0 … 90 90 90 90 90 90… 악성코드 Shell code Return address a8 88 04 08 d8 f0 ff bf 04 00 00 00 FFFFFFFF 주소 memory
3. Secure coding 의무화 • 2012년 시큐어코딩 도입 전 공공기관 의무화 • 안전행정부, 한국인터넷진흥원 ‘시큐어코딩 제도 확대 적용’ 방안 마련 38
3. 안전행정부 Secure Coding GuideLine • 행정기관 및 공공기관 정보시스템 구축&운영 지침에 따라 정보화 사업 수행시 안전한 SW 개발을 위한 시큐어코딩 기법 제시 • 현재 안전행정부 시큐어코딩 적용 대상언어 : Java, C, 안드로이드
4. Secure Code Converter 동작과정 • 테스트할 파일들을 컨버터를 통해 열게 된다. • 실행파일로 만든 컨버터는 DB를 거쳐 파일을 검사한다. • 그 후 실행파일인 컨버터는 안전한 파일을 생성하게 된다.