티스토리 뷰

닷넷 런타임은 다른 머신으로부터의 악의적인 코드가 침투할 수 없도록 만들어져있습니다. 그 이유는 CLR을 기반으로 보안 사항을 유지하게 끔 설계가 되어 있기 때문이죠.


하지만 분산 시스템에서는 다른 머신으로 부터 코드를 다운로드 받아서 프로그램의 기능이 수행되야 하는 경우가 있는데, 이러한 경우 보안에 문제가 생길 수도 있습니다.



따라서 인터넷 혹은 웹에서 수행되는 경우 CLR의 제한된 환경내에서 처리가 되어야 합니다. 특정 어셈블리가 Full Trust의 조건에 만족하지 않는다면 CLR이 이 어셈블리를 처리할 때 모든 기능이 되지 않을 수도 있습니다.


이것을 C#에서는 Code Access Security(CAS)라고 합니다. CLR은 롤 기반의 보안(Role-Based Security)를 적용하고 있는데 특정 권한을 가지지 않는 사람은 그 권한에 대해 처리를 할 수가 없습니다. 시스템도 마찬가지죠.


Full Trust란?


C#을 포함하는 .NET 기술은 호스팅 업체 혹은 프로그램 사용업체 신뢰 레벨을 정할 수 있도록 허용합니다. 이는 각 어플리케이션이 처리할 수 있는 기능을 정의하는 것인데, 기본적으로 Full, High, Medium, Low, 와 Minimal으로 정의가 되어 있으며, 이를 사용자 기반의 신뢰 레벨로 만들 수도 있습니다. 


Full Trust는 가장 높은 권한의 레벨로 .NET 시스템의 기본값이기도 합니다. Full Trust 레벨에 속하면 아래와 같은 기능을 수행할 수 있습니다.


- Native Code 실행

- 윈도우 레지스트리 및 윈도우 이벤트 로그 읽기

- 어플리케이션 외부의 파일 처리



.NET은 Managed 환경에서 개발이 되기 때문에, 일반적인 보안 문제는 이 Managed 환경에서 처리가 됩니다. CLR은 IL을 수행할 때 메모리 직접 접근등에 대한 코드는 실행하지 못하도록 막습니다. 또한 특수한 권한이 필요한 경우라면 CAS API을 사용할 수 있습니다.


CAS API를 사용하는 예는 아래와 같습니다.

  • Unmanaged 메모리나 파일 시스템 접근
  • 데이터베이스, 네트워크 포트, 레지스트리, 프린팅 시스템


관련 자료 : Code Access Security Basics

https://msdn.microsoft.com/en-us/library/33tceax8(v=vs.110).aspx



기본적으로 안전한 어셈블리에서 Unmanaged 메모리 접근은 원칙적으로 차단이 됩니다. 안전한 어셈블리란 컴파일시 /unsafe 옵션을 사용하지 않고 빌드된 모든 어셈블리를 말합니다.


수행성능이 중요한 어플리케이션을 개발한다고 한다면, 이때는 메모리를 참조하여 사용해야 합니다.


1. 메모리 접근시 주의해야 할 점


C#에서 메모리를 직접 접근한다는 것은 unsafe 어셈블리가 되는 것과 같습니다. 이 코드를 포함하는 최상위층 어셈블리도 unsfae가 되기 때문에 이러한 경우에는 따로 어셈블리를 구분하여 만드는 것이 좋습니다. (예 : P/Inove, COM 인터페이스 사용)


2. 파일 시스템에서 주의해야 할 점


인터넷에서 다운로드된 프로그램은 파일 시스템을 사용하지 못하는데, 이를 해결하기 위해서 사용되는 것이 Isolated Storage입니다. Isolated Storage는 어플리케이션, 도메인, 사용자의 3가지 정보를 근간으로 구성된 가상 디스크 공간을 의미합니다.


이러한 경우 System.IO.IsolatedStorage 네임스페이스에 있는 Isolate Storage를 사용할 수 있습니다. 이는 File 클래스와 유사한 상태로 만들어져 있기 때문에 사용에는 크게 어려움이 없습니다. 


예 : IsolatedStorage를 통해서 파일 쓰기

IsolatedStorage iso = IsolatedStorage .GetUserStoreForDomain();

IsolatedStorageFileStream stream = new IsolatedStorageFileStream("text.txt", FileMode.Create, iso);

StreamWriter wr = new StreamWriter(stream);

wr.Write(..);

wr.Close();


IsolatedStorage는 디스크상 격리된 영역이므로, 적당한 크기를 유지하는 것이 좋습니다. 


그럼 이만 줄이겠습니다.


이 글이 도움이 되셨으면, 아래의 하트를 눌러주세요.




댓글