본문 바로가기

Actionscript3.0

Flash player 의 보안

Front - End 개발을 하다 보면 Flash player의 보안 범위를 판단하지 못해 곤란한 일을 겪은 일이 있을것이다.  Flash 개발자의 경우에는 미쳐 알지 못한 내부 보안 설정을 하지 않아서 데이터를 못불러 온다거나, 바뀐 Flash player 보안 정책 때문에 고생을 했을 수도 있고, UI개발자의 경우에는 Flash 개발자가 없는 상태에서 여러 상황을 판단을 해야 하지만 Flash player의 보안 규칙에 대해 알지 못해서 혼란 스러운 경우가 있을 것이다. 이 문서는 모든 Flash 개발자와 UI개발자가 알아야 할 Flash player의 보안에 대해 기초적인 내용을 다룰 것이다.

Flash player 보안 개요

Flash player의 보안은 Flash, Flex 로 만들어진 SWF 파일이 발생 시킬 수 있는 보안 이슈에 대해 정의 및 제한 하고 있다. 텍스트 파일이나 이미지, 오디오 파일들을 로드 하거나 SWF 사이에 크로스 스크립팅을 할때 발생 할 수 있는 이슈들이 모두 여기에 포함 되어 있다. 예를 들어 SWF에서 http://www.ddongkang.com 에 존재 하는 http://www.ddongkang.com/data.xml 을 로드 한다고 할때, http://www.ddongkang.com 도메인에 crossdomain.xml 파일이 없다면 SecurityError를 발생시킨다. Flash player의 보안은 위와 같은 문제에 대해 Flash player 구현상으로 올바른 접근법을 제시 하고 있다. 

기본적으로 다음과 같은 보안 규칙이 적용 된다.

  • 동일한 보안 샌드 박스의 리소스를 항상 서로 접근(Excess) 할 수 있다.
  • 원격 샌드박스의 SWF파일에서는 로컬 파일과 데이터에 접근 할 수 없다.


안 샌드 박스 타입


Actionscript는 Flashplayer가 로드하는(열거나, 불러온 파일 포함) 모든 SWF파일에 보안 샌드박스 타입이라 불리는 보안 상태를 할당한다. Flashplayer는 아래와 같이 4가지 경우의 보안 샌드 박스 타입이 존재 한다.

  • remote 샌드박스 - Flash Player는 인터넷의 SWF 파일을 포함하여 에셋을 해당 웹 사이트의 원래 도메인에 해당하는 별도의 샌드박스에 분류한다. 기본적으로 이러한 파일은 해당 서버의 모든 리소스에 대한 액세스가 허용된다. 원격 SWF 파일은 URL 정책 파일 및 Security.allowDomain() 메서드와 같은 명시적인 웹 사이트 및 제작자 권한을 사용하여 다른 도메인의 데이터에 추가로 액세스할 수 있다.

  • local-with-filesystem 샌드박스 - 보안을 위해 Flash Player는 기본적으로 모든 로컬 SWF 파일을 local-with-file-system 샌드박스를 적용한다. 이 샌드박스에서 SWF 파일은 URLLoader 클래스 등을 사용하여 로컬 파일을 읽을 수 있지만, 네트워크와는 어떤 방식으로도 통신할 수 없다.


  • local-with-networking 샌드박스 - SWF 파일을 컴파일할 때, 로컬 파일로 실행되지만 네트워크 액세스가 가능하도록 지정할 수 있다. 이러한 파일은 local-with-networking 샌드박스가 적용 된다. local-with-networking 샌드박스에 할당된 SWF 파일에서는 해당 로컬 파일에 액세스할 수 없다. 대신, SWF 파일은 네트워크의 데이터에 액세스할 수 있다. 하지만 URL 정책 파일이나 Security.allowDomain() 메서드에 대한 호출을 통해 권한이 부여되지 않는 한 local-with-networking SWF 파일은 여전히 네트워크의 데이터를 읽을 수 없다. 이러한 권한을 부여하려면 URL 정책 파일에서<allow-access-from domain="*"/> 또는 Security.allowDomain("*")을 사용하여 모든 도메인에 권한을 부여해야 한다.


  • local-trusted 샌드박스 - 사용자나 설치 프로그램에 의해 신뢰할 수 있는 파일로 등록된 로컬 SWF 파일은 local-trusted 샌드박스에 배치된다. 시스템 관리자와 사용자는 보안 고려 사항에 따라 local-trusted 샌드박스에 또는 해당 샌드박스로부터 로컬 SWF 파일을 재할당하거나 이동할 수도 있다. local-trusted 샌드박스에 할당된 SWF 파일은 다른 SWF 파일과 상호 작용하고 원격이나 로컬의 모든 위치에서 데이터를 로드할 수 있다.


 각각의 보안 샌드 박스 타입은 종류에 따라 Flashplayer의 보안 수행 범위가 정해 진다. 다음은 모든 보안 샌드 박스 타입에서 금지 할 가능성이 수도 외부 작업 들이다.

  • 데이터 불러오기
  • 데이터에 접근하기 
  • 크로스 스크립팅 
  • 외부 URL에 데이터 보내기
  • 사용자의 카메라와 마이크로폰에 접근하기
  • 로컬 공유 객체에 접근하기
  • 사용자가 선택한 파일 업로드 또는 다운로드
  • .swf 파일에서의 HTML (javascript) 페이지 스크립팅과 그 반대 작업
  • LocalConnection 채널에 연결하기


보안 샌드 박스 타입이 할당 되는 방법

.SWF 파일의 보안 샌드박스 타입을 결정하기 위해 액션스크립트는먼저 .SWF 파일을 불러오거나 연 위치를 고려한다. 원격 샌드 박스(주로 에서 구동되는 SWF)는 remote 샌드박스가 적용되고, 컴파일러 설정, 환경 설정 파일등 로컬에서 구동되는 SWF 컨텐츠는 local-with-filesystem, local-with-networking, local-trusted 샌드박스에서 선택하여 작업 해야 한다.(각각 보안 기준이 다르다)

UI개발시 고려해야 할 Flash player의 보안

주로 UI개발시 고려해야 하는 상황은 웹이기 떄문에 remote 샌드박스를 고려 하면 된다. 아래 4가지 경우는 UI개발과 Flash개발 사이에 발생 할 수 있는 보안 이슈들이다.

1. SWF에서 외부 파일 로드 (이미지,오디오,텍스트파일 등등)

아무런 통신을 안하는 SWF에 대해서는 이러한 보안 이슈에 대해 주의해야 할 점들이 없지만, 대부분은 SWF들은 데이터를 불러오는 작업을 한다. SWF안에서 좀 더 깔끔한 폰트 처리를 위해서 font.swf를 로드 한다거나, 외부 데이터 파일을 불러와서 뿌려줘야 되는 경우가 종종 발생한다. 이때 font.swf 파일이나, data.xml 파일이 메인이 되는 SWF와 같은 도메인에 있다면 따로 보안 설정을 안해줘도 되지만, 다른 도메인에 존재 할 경우에는 설정을 해 줘야 한다. 좀 더 쉬운 상황 설명을 위해 로딩의 주체가 되는 SWF 파일을 main.swf , 로드 되어 지는 파일인 폰트 파일을 font.swf, 로드 되어 지는 데이터 파일을 data.xml 이라고 하자.

상황 1 .3개의 SWF파일들은 모두 http://www.ddongkang.com/flash/ 폴더안에 존재 하고 main.swf 에서 font.swf 와 data.xml 를 로드 하는 경우

모두 같은 폴더에 존재 하기 때문에 따로 보안 설정을 해줄 필요가 없다.

상황 2 .main.swf 파일은 http://www.ddongkang.com/flash/ 폴더에 존재 하고, font.swf 와 data.xml 은 http://www.daum.net/flash/data/ 에 존재 하는 경우

주체가 되는 main.swf 와 로드 되어 지는 데이터가 도메인에 존재 하기 때문에 Flash player의 보안에 막히게 된다. main.swf 에서 font.swf 와 data.xml 을 로드 하기 전에 main.swf 는 데이터가 존재 하는 http://www.daum.net 에 크로스 도메인 파일(정책파일)이 존재 하는지 확인 하고 그 설정이 맞는다면 로드를 하게 된다. (따로 확인 하지 않아도 Flash에서 Load 를 하게 되면 crossdomain.xml 파일을 로드 한다. 크로스 도메인 파일의 이름을 바꿔서 로드 하고 싶은 경우
Security.loadPolicyFile("파일URL"); 을 로드 하기 전에 호출 하면 된다. 주의 해야 할 점은 crossdomain.xml 파일의 위치이다. main.swf 가 data.xml의 로드를 시작 하면 Flashplayer에서는 우선 data.xml 파일이 존재 하는 폴더에서 crossdomain.xml 파일이 존재 하는지 확인 한다. 존재하면 바로 확인이 되어 로드를 하겠지만, 존재 하지 않는다면 상위 폴더에 crossdomain.xml 파일이 존재 하는지 확인하게 된다. 처음에 flash/data/ 폴더를 확인 하고 없으면 flash/ 폴더를 확인한다. crossdomain.xml(정책 파일)이 계속 존재 하지 않는다면 계속 상위 폴더에서 확인하고 결국엔 서버의 루트까지 확인하게 된다. 위의 예제에서는 http://www.daum.net 이 루트이다. 루트에도 crossdomain.xml(정책파일)이 존재 하지 않으면 Flashplayer는 로드를 못하게 되고 보안 에러를 발생 시키게 된다. 그러므로 상황에 따라 crossdomain.xml 파일의 위치를 잘 판단하여 업로드 해야 한다.

상황 3 .이미지 오디오 파일 로드

이미지 파일이나 오디오 파일을 로드 할때도 crossdomain.xml(정책파일)이 필요 하다. 하지만 정책 파일이 있더라도 Actionscript에서 보안 설정을 안해주면 이미지 파일의 크기를 조작하거나, 오디오 파일을 불러와서 조작 할 수 없다. 이미지를 조작할때 이러한 문제가 자주 발생하는데, 보안 설정을 안해주고 이미지의 크기가 변하지 않는 다고 이상하게 생각했던 경험을 가지고 있는 사람들이 많이 있을것이다. Flash 상에서 이미지를 로드 하는 것은 결국에는 Flash player에서 이미지를 BitmapData 로 가지고 있는 것이기 때문에 다음과 같은 설정을 해줘야만 로드된 이미지의 BitmapData에 접근할 수 있어서 이미지 크기 조작과 같은 동작이 가능하다.

LoaderContext 설정 방법 소스
// 정책파일이 기본 위치에 없다면
Security.loadPolicyFile("정책파일의위치");			
var loadcontext:LoaderContext = new LoaderContext();
loadcontext.checkPolicyFile = true;
var loader:Loader = new Loader();
loader.load(new URLRequest("이미지 URL"),loadcontext);			

사운드의 경우도 마찬가지로 다음과 같은 설정을 해줘야 한다.

SoundLoaderContext 설정 방법 소스
// 정책파일이 기본 위치에 없다면
Security.loadPolicyFile("정책파일의위치");			
var soundcontext:SoundLoaderContext = new SoundLoaderContext();
soundcontext.checkPolicyFile = true;
var sloader:Sound = new Sound();
sloader.load(new URLRequest("오디오 URL"),soundcontext);			

crossdomain.xml (정책 파일)



위의 정책파일은 www.ddongkang.com 과 ddongkang.com 에 대해 접근 허락을 나타내고 있다. 더 자세한 정책 파일 옵션은 웹 사이트 컨트롤(정책파일) 에서 확인할 수 있다.



2. SWF에서 HTML 브라우져 객체의 접근

AS3.0의 통신 - 브라우저와의 통신 에서 다뤘듯이 SWF는 자신을 가지고 있는 HTML객체와 통신을 할 수 있다. SWF를 HTML에 Embed 할때 allowScriptAccess매개변수를 설정하는데, 이 매개변수는 SWF파일 내에서 HTML에 있는 객체를 접근하는 것에 대한 기능을 제어한다.


<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
             id="FlashVar" width="500" height="375"
             codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab">
         <param name="movie" value="FlashVar.swf" />
         <param name="quality" value="high" />
         <param name="bgcolor" value="#869ca7" />
         <param name="allowScriptAccess" value="sameDomain" />
    <param name="FlashVars" value="data0=DongHyuk&data1=동혁&data2=http:www.ddongkang.com" />
         <embed src="FlashVar.swf" quality="high" bgcolor="#869ca7"
             width="500" height="375" name="FlashVar" align="middle"
             play="true" loop="false" quality="high" allowScriptAccess="sameDomain"
             type="application/x-shockwave-flash"
             FlashVars="data0=DongHyuk&data1=동혁&data2=http:www.ddongkang.com"
             pluginspage="http://www.macromedia.com/go/getflashplayer">
         </embed>
 </object>


allowSCriptAccess는 "always","sameDomain","never" 값중 하나를 가질 수 있다.

allowScriptAccess="always" : SWF파일은 HTML 페이지와 다른 도메인에 있는 경우에도 SWF파일이 포함된 HTML페이지와 통신 할 수 있다.

allowScriptAccess="sameDomain" : SWF파일은 HTML 페이지와 동일한 도메인에 속해 있는 경우에만 SWF파일이 포함된 HTML 페이지와 통신할 수 있다.

allowScriptAccess="never" : SWF파일에서 어떠한 HTML페이지와도 통신 할 수 없다.

allowScriptAccess에 따라 ExternalInterface.call 을 이용하여 HTML 에 있는 javascript 함수를 자유롭게 호출 할 수 있다. 하지만, HTML 객체에서 SWF 객체에 접근 할 때는 SWF 내부의 보안 정책이 필요 하다.  javascript에서 아무런 제약 없이 SWF에 있는 모든 객체들에 접근 할 수 있다면, 심각한 보안 문제가 발생할 것이다.

상황 1. 같은 도메인에 HTML과 SWF파일이 존재 하는 경우(html파일이 swf파일을 포함할때)

같은 도메인에 존재 하기 때문에 따로 보안 설정을 안해줘도 된다. 예를 들어 http://www.ddongkang.com/html/ 폴더에 index.html이 있고 http://www.ddongkang/html/flash/ 에 swf파일이 존재할 경우 HTML에서 SWF에 존재 하는 객체에 제한 없이 접근 할 수 있다.

상황 2. 다른 도메인에 HTML과 SWF파일이 존재 하는 경우(html파일이 swf파일을 포함할때)

index.html 파일이 http://www.daum.net/html/ 폴더에 있고, movie.swf파일이 http://www.ddongkang.com/html/flash 폴더에 있을 경우 movie.swf파일에서 반드시 Security.allowDomain("http://www.daum.net/html/"); 해줘야 index.html 파일에서 movie.swf 에 있는 객체로 접근이 가능해 진다. AS3.0의 통신 - 브라우저와의 통신 에서 다뤘듯이 ExternalInterface.addCallback 을 이용하여 html 에서 swf에 있는 메소드를 실행 하는 것이 이 경우에 해당 한다.

3. 크로스 스크립팅

AS3.0 부터는 서로 다른 SWF 간에 크로스 스크립팅이 가능하다. 크로스스크립팅이란, 아래 그림과 같이 swfA.swf 에서 swfB.swf 를 로드 했을 경우 swfA.swf 에서 swfB.swf의 객체에 접근하여 스크립팅 하거나 swfB.swf 에서 swfA.swf로 접근하여 스크립팅 하는 것을 말합니다. 두개의 SWF파일이 같은 도메인에 있으면 따로 보안 설정을 안해줘도 되지만, 다른 도메인에 있으면 설정을 해 줘야 한다



siteA.com 에 있는 swfA.swf가 siteB.com 에 있는 swfB.swf를 로드 하여 크로스 스크립팅 하는 경우 swfB.swf 에서 Security.allowDomain("siteA.com") 를 호출해야만 swfA.swf에서 swfB.swf로의 접근이 가능하다. allowDomain으로 설정된 보안은 비대칭적이기 때문에 swfB.swf 에서는 swfA.swf 로 크로스 스크립팅을 할 수 없다. swfA.swf 에서도 위와 마찬가지로 Security.allowDomain("siteB.com") 이라 해줘야 쌍방향으로 크로스 스크립팅이 가능하다. 더 자세한 내용은
Adobe Actionscript3.0 Document - Security 에서 확인 할 수 있다.


이 문서에서는 Flash player의 보안중 극히 일부분만을 다루었다. 그 만큼 방대한 보안 설정이 존재 하고 때에 따라 보안 규약을 맞춰서 작업해야 발생할 가능성이 있는 보안 취약점들은 미리 파악하여 대처 할 수 있다. 지금 까지 나온 다양한 이슈들에 대해 Adobe Flash Developer Center - Security 에서 다루고 있으니 참고하라.