SW 보안약점소개 SIGPL Workshop, KCC2013 2013. 6. 28 한국항공대학교안준선 목차 시큐어코딩, 보안약점, 보안취약점 SW 보안약점의유형 입력데이터검증및표현 (Input Validation and Representation) API 오용 (API Abuse) 보안기능 (Security Features) 시간및상태 (Time and State) 에러처리 (Error Handling) 코드오류 (Indicator of Poor Code Quality) 캡슐화 (insufficient Encapsulation) 관련연구 2
시큐어코딩 (Secure Coding) 보안취약점없는강건한프로그램을작성하는것... One of the key things that developers can do to help secure their systems is to write code that can withstand attack and use security features properly... [http://msdn.microsoft.com/en-us/security/aa570401.aspx]...easily avoided software defects are a primary cause of commonly exploited software vulnerabilities.... [http://www.cert.org/secure-coding/] 3 2 nd Software Crisis : Trustworthiness 4
침해양상의변화 침해의난이도가쉬워지고있음 침해의변화경향 특정시스템목표 Social Engineering 목적 : 단순파괴 이윤추구 / 정치적목적 Recent Market Price Credit Card Number $0.50~$20 Full Identity $1~$15 Bank Account $10~$1000 5 시큐어코딩의중요성 보안침해의 75% 이상이응용소프트웨어와관련 (Gartner, 05) 보안침해의소프트웨어보안결함으로연간 1800억달로손실 (Geeknomics, Davis Rice) 운영단계의취약점제거비용은개발단계에서보다많은비용소요 (IBM 60~80배, MS 100배 ) MS 에서는 SDL (Secure Development Lifecycle) 을 SQL Server 2005에적용한결과 SQL Server 2000 대비 3년간발견된취약성이 91% 감소 6
I 보안약점, 보안취약점 정의 보안약점 (Weakness) 보안취약점의될수있는소프트웨어의결함, 실수, 버그등 보안취약점 (Vulnerability) 공격자가이용하였을경우에시스템의보안정책을침해하게되는시스템의허점 특성일반적형태 / 근원적개별적 / 상황의존적 보안약점공격자의접근정보의수정및획득 보안취약점 보안약점을제거함으로써, 보안취약점에대한근원적인대처가가능 7 SW 보안약점유형 주요유형 입력데이터검증및표현 (Input Validation and Representation) API 오용 (API Abuse) 보안기능 (Security Features) 시간및상태 (Time and State) 에러처리 (Error Handling) 코드오류 (Indicator of Poor Code Quality) 캡슐화 (insufficient Encapsulation) [Seven Pernicious Kingdoms : A Taxonomy of Software Security Errors, IEEE Security & Privacy, 3(6):81 84, 2005] 8
SW 보안약점유형 1 : 입력데이터검증및표현 적절한검증없이사용된외부입력으로인한 SW 취약점 관련약점 문자열삽입 SQL 삽입 크로스사이트스크립트 OS 명령어삽입 버퍼넘침 자원삽입 숫자값오류 9 문자열삽입약점 외부입력문자열전달 하위시스템의명령어문자열을생성하여전달 서버보안침해 클라이언트침해 위험한작업수행 Web Server, Mail Server,... DB Server OS,... 비밀데이터, 위험한스크립트가포함된결과전송 10
문자열삽입약점 보안약점 XQuery 삽입 SQL 삽입 XSS (Cross Site Scripting) XPath 삽입 OS 명령어삽입 HTTP 응답분할 LDAP 삽입디렉토리경로조작로그삽입 XML 삽입 생성문자열 XQuery SQL HTML 파일 XPath Shell HTML 헤더 LDAP 파일경로로그 XML 11 SQL 삽입 root String sql = "select * from user where username='" + username +"' and password='" + password + "'"; rs = stmt.executequery(sql); 12
SQL 삽입 select * from user where username='root' and password = '' or '1'='1' ' or '1'='1 root String sql = "select * from user where username='" + username +"' and password='" + password + "'"; rs = stmt.executequery(sql); 13 SQL 삽입 select * from user where username='root' and password = ''; drop table members; ' '; drop table members; root String sql = "select * from user where username='" + username +"' and password='" + password + "'"; rs = stmt.executequery(sql); 14
SQL 삽입 15 SQL 삽입약점의제거 Prepared statements PreparedStatement pstmt = con.preparestatement( "select * from user where username=? and password =?"); pstmt.setstring(1, username); pstmt.setstring(2, password); rs = pstmt.executequery(); Stored statements CallableStatement cs = connection.preparecall( "{call sp_getuserrecord(?)}"); pstmt.setstring(1, username); pstmt.setstring(2, password); rs = cs.executequery(); 16
SQL 삽입공격의방어 탈출문자열 (Escaping sequence) DB에서일반문자로인식되도록기호를대치 문제 DB에따라탈출문자열이다름 \ /* mysql */ /* Oracle */ ESAPI (Enterprise Security API) 17 크로스사이트스크립트 (XSS) showevent.php $day=$_get[ day ]; echo <a href=\ event.php? day=$day\ > ; 18
크로스사이트스크립트 (XSS) http://www.target.com/showevent.php?day=><s cript>malicious_script();>/script> showevent.php $day=$_get[ day ]; echo <a href=\ event.php? day=$day\ > ; 19 크로스사이트스크립트 (XSS) <a href= event.php?day=> <script>malicious_script();>/script> showevent.php $day=$_get[ day ]; echo <a href=\ event.php? day=$day\ > ; 20
크로스사이트스크립트 (XSS) Stored XSS DOM based XSS Reflexive XSS 21 크로스사이트스크립트 (XSS) http://www.some.site/page.html?default= <script>malicious_script()</script> DOM based XSS <select><script> document.write("<option value=1>"+document.location.href.substring (document.location.href.indexof("def=")+8)+"</option>"); document.write("<option value=2>english</option>"); </script></select> 22
크로스사이트스크립트 (XSS) http://www.some.site/page.html?default= <script>malicious_script()</script> DOM based XSS <select> <OPTION value=1>malicious_script()</option>"); <OPTION value=2>english</option></select> 23 XSS 약점의제거 신뢰할수없는데이터에대한검증 Whitelist 검증사용 문맥을고려한인코딩 OWASP ESAPI Microsoft Anti-Cross Site Scripting Library 24
SW 보안약점유형 2 : API 오용 적합하지않은인자를사용한 API 의사용이나 API 결과에대한적절하지않은가정에의한약점 관련약점들 DNS lookup에의존한보안결정 결과값검사누락 안전하지않은함수의사용 덜지워진않은힙메모리데이터 25 DNS lookup 에의존한보안결정 도메인명에의존하여보안결정을할경우 DNS 서버캐시오염을통한공격이가능 InetAddress addr = InetAddress.getbyName(ip); if addr.getcanonicalhostname().endswith( trustme.com ){ truested = true; } if (Ip.equals(trustedAddr)) { trusted = true; } 26
SW 보안약점유형 3 : 보안기능 인증, 접근제어, 암호화, 권한관리등과관련된소프트웨어약점 관련약점들 취약한암호화알고리즘사용 적절한인증없는중요기능허용 중요자원에대한잘못된권한설정 사용자중요정보평문저장 솔트없이일방향해쉬함수사용 무결성검사없는코드다운로드... 27 취약한암호화알고리즘사용 도메인명에의존하여보안결정을할경우 DNS 서버캐시오염을통한공격이가능 Cipher c = Cipher.getInsgtance( DES ); Cipher c = Cipher.getInsgtance( AES/CBC/PKCS5Pasdding ); 취약한알고리즘 : MD4, MD5, RC2, RC4, RC5, DES, 2DES 안전한알고리즘 : SHA-256, AES, SEED, ARIA 등 28
SW 보안약점유형 4 : 시간및상태 복수의쓰레드나프로세스들의병행수행과관련하여시점과상태를적절히처리하지못하여발생하는약점 관련약점들 경쟁조건 : 검사시점과가용시점 제대로제어되지않은재귀 29 경쟁조건 : 검사시점과가용시점 자원에대한권한검사시점과자원의사용시점간의자원의상태변화에따른허점 if(!access(file,w_ok)) { f = fopen(file,"w+"); operate(f);... } else { fprintf(stderr,"unable to open file %s.\n",file); } 30
SW 보안약점유형 5: 에러처리 에러를처리하지않거나, 불충분하게처리하여발생하는시스템의불안정이나정보누출과관련한약점 관련약점들 오류메시지통한정보노출 오류상황대응부재 적절하지않은예외처리 31 오류메시지통한정보노출 시스템에대한민감한정보를포함하는오류메시지를생성하여외부에제공하여공격을도와주는경우 32
SW 보안약점유형 6: 코드오류 소프트웨어의질관리가부실함을보여주는약점들로일반적으로취약점으로직접연관되지는않는다. 관련약점들 부적절한자원해제 스택변수주소의반환 널포인터역참조 사용되지않는코드 (Dead Code) 사용되지않는변수 33 부적절한자원해제 파일, 힙메모리, 소켓등의자원사용후적절한반환이이루어지지않는경우 Try { Class.forName( com.mysql.jdbc.driver ); conn = DriverManager.getConnection(url); conn.close(); } Catch (Exception e) { } 34
SW 보안약점유형 7: 캡슐화 중요한데이터나함수에대한불완전환캡슐화 관련약점들 잘못된세션에의한데이터누출 제거되지않고남은디버거코드 공용메서드로부터반환된 private 배열-유형필드 private 배열-유형필드에공용데이터할당 35 잘못된세션에의한데이터노출 다중쓰레드환경에서싱글톤객체필드에대한경쟁조건발생으로인한데이터노출가능 Public class MyServlet extends HTTPServlet { private String name; protected void dopost(httpservletrequest request, HTTPServletResponse response) throws ServletException, IOException { name = request.getparameter( name ); out.println(name+, thanks for visiting ); } } 36
관련연구 : 보안약점 / 보안취약점목록 37 관련연구 : 주요보안약점목록 38
관련연구 : Secure Coding Guides 39