Brian Johnson
Program Manager
Microsoft Corporation

요약: Visual Studio 2005는 개발자가 보다 손쉬운 방법으로 보안 응용 프로그램을 작성할 수 있게 해 줍니다. 관리되지 않는 안전한 코드를 작성하거나, CAS(코드 액세스 보안)를 사용하는 관리되는 응용 프로그램을 손쉽게 빌드 및 배포할 수 있게 해 주는 IDE 도구를 활용해 보십시오(11페이지/인쇄 페이지 기준).

목차

소개
네이티브 코드의 향상된 보안
관리되는 코드의 향상된 보안
기타 향상된 보안
결론

소개

개발자는 안전한 응용 프로그램을 빌드하길 원하면서도 응용 프로그램의 보안을 학습하는 데는 충분한 시간을 할애하려 하지 않는 경우가 대부분입니다. 이들은 보안에는 신경 쓰지 않은 채, 문제를 해결하고 제품으로 출시되는 코드와 알고리즘을 작성하게 됩니다. 하지만 이제는 응용 프로그램을 빌드하여 배포한 후 그냥 내버려 둘 수 없는 상황입니다. 따라서 사안을 결정할 때는 항상 결정에 따른 보안 영향을 이해해야 합니다. 이 점을 염두에 두고 응용 프로그램을 빌드하고 출시하는 과정에 도구를 활용하면 보안 응용 프로그램을 보다 손쉽게 제공할 수 있습니다. 이 문서에서는 안전하고 견고한 응용 프로그램을 빌드하는 데 도움이 되는 Visual Studio 2005의 몇 가지 기능을 살펴보겠습니다. Visual Studio 2005의 도구와 향상된 기능은 대부분 추가 작업이 거의 필요 없으며 응용 프로그램의 전반적인 보안에 막대한 영향을 미칩니다.

네이티브 코드의 향상된 보안

Visual C++는 직접 프로세서를 대상으로 작동하는 옵션(예: 관리되지 않는 네이티브 exe 및 dll 생성)을 제공하는 유일한 Visual Studio 컴파일러입니다.

이 섹션에서는 별도의 언급이 없는 한 이 내용이 Visual C++에 적용된다는 것을 전제로 네이티브 코드의 향상된 보안에 대해 설명하겠습니다.

네이티브 코드에서 나타나는 대부분의 보안 문제는 버퍼 오버런이라는 범주에 속합니다. 버퍼 오버런은 버퍼 크기를 초과하는 데이터가 코드를 실행할 수 있는 메모리 영역을 침범할 때 발생합니다. 이는 공격자가 프로그램의 실행을 가로챌 수 있는 메모리 부분에 명령을 삽입하기 위해 버퍼 오버런을 일으키려면 어떻게 해야 하는지 정확히 알고 있는 경우 문제를 일으키게 됩니다.

이 문서에는 비교적 단순하게 정의된 버퍼 오버런을 기준으로 코드의 잠재적인 취약점을 발견하는 데 도움이 되고 공격자가 침입할 경우 취약점을 악용하는 것을 막도록 디자인된 Visual Studio 2005의 네 가지 기능이 설명되어 있습니다.

코드 분석 /analyze

코드 분석은 Visual Studio 2005 Team Edition for Software Developers의 기능입니다. 코드 분석 기능은 처음에 Microsoft 내부에서 사용된 PREfast라는 유틸리티에서 유래한 것입니다. 이 기능은 Microsoft DDK(Device Driver Kit)에 공개적으로 제공되었습니다. 코드 분석 기능의 동작은 C 및 C++ 소스 코드를 분석하고 기능별로 가능한 모든 실행 경로를 검사하며, 실행을 시뮬레이트하여 모든 문제 발생 경로를 평가하는 것입니다. 코드 분석은 코드를 실행하지 않을 뿐 아니라 모든 오류를 찾을 수도 없지만 컴파일러에서 무시할 수 있는 오류를 찾을 수 있습니다. 또한 캐스트 및 데이터 형식, 성능, 보안, 식, 루프, 메모리 할당, 형식 문자열, 반환 값 및 예외 처리와 같은 영역에서 문제를 발견합니다.

Visual Studio 2005 Enterprise Edition의 코드 분석을 사용하여 검색된 오류는 오류 목록 창에 표시됩니다. 코드 분석은 /analyze 옵션을 사용하거나 그림 1에서처럼 속성 페이지 대화 상자에 있는 코드 분석 노드의 일반 섹션에서 C/C++에 코드 분석 사용 옵션을 예(/analyze)로 설정하여 사용할 수 있습니다.

그림 1. 코드 분석으로 사용할 수 있는 보안 규칙

응용 프로그램 검증 도구

AppVerifier(응용 프로그램 검증 도구)는 원래 Application Compatibility Toolkit의 일부로 제공되었습니다. AppVerifier는 프로그램의 실행 오류를 탐지하는 런타임 분석 테스트 모음입니다. 응용 프로그램 검증 도구에서 탐지하는 오류는 주로 응용 프로그램 호환성, 안정성 및 보안 문제와 관련이 있으며 핸들 확인, 잠금 확인 및 힙 확인의 세 범주 중 하나에 속합니다. AppVerifier 설정은 속성 페이지 대화 상자의 응용 프로그램 검증 도구 노드에 있습니다.

응용 프로그램 검증 도구를 시작하려면 디버그 메뉴에서 Start with Application Verifier(응용 프로그램 검증 도구로 시작)를 클릭합니다. 응용 프로그램 검증 도구에서는 여러 확인 계층에서 오류가 발견되면 중지 옵션을 사용하여 정보를 제공합니다. 개발자는 중지 옵션이 나타나면 응용 프로그램 검증 도구에서 특정 작업을 수행하도록 설정할 수 있습니다. 이러한 작업에는 중단 및 오류 로깅 등이 있습니다. 그림 2에서는 속성 페이지 대화 상자의 응용 프로그램 검증 도구 설정을 보여 줍니다.

그림 2. 응용 프로그램 검증 도구의 중지 옵션

버퍼 보안 검사 /GS

Visual C++ 버퍼 보안 검사 컴파일러 옵션(/GS)은 악의적인 코드가 응용 프로그램에서 버퍼 오버런을 이용하는 것을 방지하도록 디자인되었습니다. 버퍼 오버런이 발생하면 코드에 취약점이 많은 것입니다. /GS 옵션은 버퍼 끝에 암호화된 값(카나리아라고도 함)을 설정합니다. 이 값은 코드 실행 중에 검사하며, 값이 변경되면 프로그램 실행이 중지되고 보안 예외가 발생합니다.

/GS 옵션은 버퍼 오버런을 막지는 못하지만 프로그램 실행을 중지시켜 코드 가로채기를 사전에 예방합니다.

Safe CRT 라이브러리

Safe CRT 라이브러리는 표준 C 및 C++ 라이브러리를 재정비한 것입니다. 이 라이브러리는 공격에 취약한 것으로 알려진 함수 및 취약한 런타임 기능의 수준을 떨어뜨리는 함수에 적절한 버퍼 검사 기능을 추가하여 Visual C++에서 컴파일된 응용 프로그램 보안을 개선하도록 디자인되었습니다.

이 변경 내용은 CRT(C 런타임 라이브러리), SCL(표준 C++ 라이브러리), MFC(Microsoft Foundation Class) 및 ATL(액티브 템플릿 라이브러리)를 비롯하여 모든 주요 프로그래밍 라이브러리에 영향을 줍니다. MFC와 ATL은 재정비 작업의 일환으로 Safe C 라이브러리 기능을 사용하도록 다시 빌드되었기 때문에 MFC 및 ATL 응용 프로그램을 Visual C++ 2005에서 다시 컴파일하면 Safe CRT 라이브러리의 이점이 자동으로 제공됩니다.

Safe CRT 라이브러리에 대한 자세한 내용은 Martyn Lovell(Microsoft Visual C++ 개발 팀장)의 MSDN Magazine 기사 Repel Attacks on Your Code with the Visual Studio 2005 Safe C and C++ Libraries (영문)를 참조하십시오.

관리되는 코드의 향상된 보안

관리되는 코드의 보안 문제는 앞의 내용과 약간 다르며 CLR(공용 언어 런타임)의 메모리 처리 방식으로 인해 일반적인 버퍼 오버런은 비교적 문제가 되지 않습니다. 이 섹션에서는 관리되는 응용 프로그램을 작성하는 개발자에게 가장 중요한 Visual Studio 2005 보안 기능을 살펴보겠습니다.

FxCop

개발자들은 수년간 독립 실행형 FxCop 도구를 사용하여 어셈블리가 .NET Framework 디자인 지침을 준수하는지 여부를 검사해 왔습니다. 이제는 이 도구가 Visual Studio 2005에서 기본적으로 제공됩니다.

FxCop는 MSIL 명령 스트림을 구문 분석하고, 대개 .NET Framework 디자인 지침에 따라 호출 그래프에 사용자가 지정한 규칙의 위반이 있는지 분석하여 분석 작업을 수행합니다. 여기에는 보안 규칙, 라이브러리 디자인 규칙을 비롯하여 전역화, 상호 운용성, 관리 용이성, 명명, 성능, 안정성, 사용 등에 관한 규칙이 포함됩니다.

Visual Studio 2005의 FxCop 기능은 관리되는 응용 프로그램의 프로젝트 속성 페이지에서 코드 분석 탭을 사용하여 액세스할 수 있습니다. 그림 3에서는 분석 작업의 일부로 검토할 수 있는 보안 규칙을 보여 줍니다.

그림 3. Visual Studio 2005의 코드 분석 규칙에 액세스

코드 분석을 사용하려면 관리되는 프로젝트의 코드 분석 속성 페이지에서 코드 분석 사용 확인란을 선택합니다. 코드 분석을 사용하면 Visual Studio 2005 오류 목록 창에 경고가 추가로 생성됩니다. 또한 원하는 규칙 집합만 선택하여 분석함으로써 목록의 항목 수를 줄일 수 있습니다(예: 보안 규칙 및 안정성 규칙).

코드 액세스 보안/최소한의 권한

.NET Framework 응용 프로그램은 코드 액세스 보안이라는 보안 모델에서 실행됩니다. 코드 액세스 보안은 보안 권한이 어셈블리 위치 및 어셈블리 서명과 같은 요소를 기준으로 부여되는 증거 기반 모델입니다. 이러한 요소는 사용자, 컴퓨터 또는 도메인 수준에서 설정되는 정책과 비교됩니다. 이들 요소와 관련된 정책을 사용하면 응용 프로그램에 매우 세부적인 권한을 부여하여 실행할 수 있습니다. 이러한 개념을 부분 신뢰라고 합니다.

부분적으로 신뢰되는 응용 프로그램을 배포하는 과정의 문제점 중 하나는 응용 프로그램을 개발 중에 테스트하는 것입니다. 일반적으로 개발자는 빌드하고 있는 응용 프로그램을 실행하는 데 필요한 모든 권한을 가지고 있지만, 인트라넷이나 인터넷에서 응용 프로그램이 작동하는 방식을 확인하려면 응용 프로그램을 해당 위치로 이동하여 그와 동일한 조건에서 테스트해야 합니다. 이런 맥락에서 Visual Studio 2005에서는 응용 프로그램이 배포되었을 때 정책에 따라 응용 프로그램에 부여된 신뢰 수준에서 올바르게 작동하도록 하기 위해 개발자가 IDE에서 응용 프로그램을 테스트하고 디버깅할 수 있는 다양한 도구와 기능을 제공합니다.

ClickOnce 배포

ClickOnce는 개발자가 권한이 제한된 계정으로 실행하는 사용자에게 배포할 응용 프로그램을 손쉽게 빌드할 수 있도록 하는 Visual Studio 2005의 기본 제공 기술입니다. 이런 응용 프로그램은 로컬로 또는 인트라넷 공유나 웹 페이지의 http 링크에서 실행됩니다. 네트워크 위치에서 실행되는 응용 프로그램은 캐시되어 로컬에서 실행되지만 권한은 응용 프로그램이 실제 상주하는 위치에만 부여되어 실행됩니다. 개발자가 새 버전의 응용 프로그램을 네트워크 위치에 배포하는 경우, 최종 사용자가 응용 프로그램을 실행하고 캐시가 업데이트되면 먼저 해당 위치를 확인합니다.

Visual Studio 2005에서는 개발자가 부분적으로 신뢰하는 응용 프로그램의 실행을 IDE 내에서 테스트할 수 있습니다. 이를 통해 CAS로 응용 프로그램을 빌드하고 배포하는 데 드는 시간과 노력을 상당 부분 절감할 수 있습니다.

Debug in Zone

ClickOnce를 사용하면 개발자가 응용 프로그램이 배포될 때 부여되는 것과 동일한 권한 집합으로 손쉽게 응용 프로그램을 테스트할 수 있습니다. 개발자는 Debug in Zone 기능을 사용하여 응용 프로그램을 디자인하고 디버깅할 때 응용 프로그램에서 요구하는 신뢰 수준을 지정할 수 있기 때문에 응용 프로그램을 다양한 신뢰 수준으로 네트워크 위치에 배포하여 테스트할 수 있습니다. 이 기능은 관리되는 응용 프로그램의 프로젝트 속성 페이지에서 보안 탭을 통해 액세스합니다.

이 기능을 사용하려면 프로젝트의 보안 탭을 열고 이 응용 프로그램이 부분적으로 신뢰되는 응용 프로그램임을 지정합니다. 여기서 응용 프로그램을 설치할 영역을 선택하고 응용 프로그램 배포 시 필요한 권한을 지정할 수 있습니다. 이 설정은 그림 4에 나와 있습니다.

그림 4. 프로젝트의 보안 탭에서 응용 프로그램의 보안 권한을 지정합니다.

디버깅 중에 발생하는 보안 예외 개선

영역을 설정하면 응용 프로그램을 실행할 때 해당 영역에 대한 보안 예외가 발생합니다. 그림 5의 새로운 보안 예외 대화 상자는 응용 프로그램을 디버깅할 때 보안 예외를 분석하여 얻을 수 있는 결과를 보여 줍니다.

그림 5. Visual Studio 2005의 보안 예외

보안 예외 창은 사용자에게 알림을 제공하는 것 외에도 많은 일을 합니다. 이 창에는 응용 프로그램이 부분 신뢰 시나리오에서 올바르게 작동하도록 응용 프로그램을 변경하기 위해 취할 수 있는 조치 및 조언이 나열됩니다. 예를 들어 FileIOPermission은 그림 4의 프로그램이 실행된 영역에서는 허용되지 않습니다. 이 문제를 해결하는 한 가지 방법은 응용 프로그램에 격리된 저장소를 사용하는 것입니다.

IntelliSense in Zone(Visual Basic 기능)

IntelliSense in the Zone은 Visual Basic 고유의 보안 기능입니다. Security in the Zone은 IntelliSense에서 제공하는 옵션을 특정 영역에서만 허용되는 API로 제한합니다. 현재 영역에서 사용할 수 없는 기능은 회색으로 표시됩니다. 이 기능은 개발자가 부분적으로 신뢰하는 응용 프로그램을 특정 영역에 허용되는 것으로 알려진 API만 선택하도록 빌드하는 데 도움이 됩니다.

PermCalc

PermCalc는 .NET 개발자가 관리되는 응용 프로그램을 올바르게 실행하는 데 필요한 권한을 분석할 때 사용하는 독립 실행형 응용 프로그램입니다. PermCalc는 현재 Visual Studio 2005에 추가되었으며 관리되는 응용 프로그램의 프로젝트 속성 창에 있는 보안 탭에서 클릭 한 번으로 실행할 수 있습니다.

IDE에서 PermCalc를 사용하려면 응용 프로그램의 설치 영역을 설정한 다음 권한 계산 단추를 클릭합니다. 응용 프로그램에 영역에서 사용할 수 있는 것보다 많은 권한이 필요한 경우, 그림 6에서처럼 페이지의 권한 테이블 설정 열에 "포함"이라는 단어가 나타납니다. 이들 항목에는 필요한 권한을 기본적으로 선택한 영역에서 사용할 수 없다는 것을 나타내는 주의 기호가 표시됩니다. PermCalc 유틸리티에서 응용 프로그램의 올바른 실행을 위해 완전 신뢰가 필요하다고 인식하면 이러한 내용을 알리는 메시지 상자가 나타납니다.

그림 6. 권한 계산에서는 응용 프로그램의 올바른 실행을 위해 필요한 권한을 결정합니다.

기타 보안 향상 기능

이 밖에도 네이티브 및 관리되는 프로젝트에 모두 도움이 되는 다양한 Visual Studio 2005 보안 향상 기능이 있습니다. 이번에는 최소한의 권한을 사용한 개발 및 보안을 적용한 테스트를 살펴보겠습니다.

최소한의 권한을 사용한 개발 및 디버깅

컴퓨터 사용자가 맬웨어로 인한 시스템 손상을 방지하는 방법 중 하나는 실행되는 권한 수준을 낮추는 것입니다. 사용자가 관리자 권한으로 실행하는 맬웨어는 컴퓨터의 모든 부분에 액세스할 수 있습니다. 일반적인 보안 관점에서 볼 때, 관리자로 실행하는 것은 피해야 합니다.

또한 관리자로 로그인한 개발자는 권한이 낮은 사용자가 응용 프로그램을 실행할 때 나타나는 문제를 확인할 수 없습니다. 예를 들어 Program Files 또는 System 폴더에 쓰는 응용 프로그램은 관리자 권한으로 실행하는 사용자에게는 원활하게 작동하는 것으로 나타납니다. 이 폴더에 대한 쓰기 액세스 권한은 사용자로 실행하는 계정에 대해서는 제한되어 있으므로 응용 프로그램에서 이 위치에 데이터를 저장하려고 하면 실패하게 됩니다.

Visual Studio의 이전 버전에서는 Visual Studio 자체가 권한이 높은 계정에서 실행이 최적화되기 때문에 권한이 제한된 계정을 사용하는 응용 프로그램을 빌드하고 디버깅하는 과정에 어려움이 많았습니다. Visual Studio 2005에서는 이 점을 개선하였습니다. Visual Studio 2005는 사용자 계정에서 원활하게 실행될 뿐 아니라 이전에 관리자 또는 디버거 사용자로 작업할 때와 마찬가지로 쉽게 응용 프로그램을 개발하고 디버깅할 수 있습니다.

하지만 Visual Studio 2005에서도 권한이 높은 계정에서 작동하도록 디자인된 추가 기능에는 문제가 발생할 수 있습니다. 그런 상황이 발생하면 추가 기능에서 필요한 수준 이상의 권한을 요구한다는 것을 추가 기능 공급업체에 알립니다. 대부분의 경우에는 저장소 또는 레지스트리 요청을 적절한 위치로 리디렉션하면 추가 기능을 올바르게 실행할 수 있습니다.

기능 테스트

보안 문제 테스트는 연결된 환경에서 사용할 응용 프로그램을 빌드하는 데 극히 중요한 사안입니다. Visual Studio 2005 Team System은 보다 안전한 응용 프로그램을 제작하는 데 도움이 되는 다양한 테스트 도구를 갖추고 있습니다.

단위 테스트

단위 테스트는 메서드의 반환 값이 메서드에 전달된 값을 고려하여 예상되는 값과 일치하도록 하는 경우에도 사용됩니다. 사용자 데이터를 처리할 때는 해당 데이터가 예상한 값과 반드시 일치하도록 해야 합니다. 여기에는 데이터의 형식과 길이가 포함되는데 이 두 요소는 해당 데이터를 처리하기 전에 확인해야 합니다. 단위 테스트는 임의의 데이터를 함수에 보내고 응용 프로그램이 데이터를 올바르게 처리하고 적절하게 작동하도록 하는 데 사용할 수 있습니다.

또한 단위 테스트 과정에 코드 검사를 사용할 수 있습니다. 코드 검사는 응용 프로그램의 코드를 테스트하는 데 유용합니다. 코드 검사는 예외 처리기 같이 좀처럼 사용되지 않는 코드가 누락되지 않도록 합니다. 하지만 응용 프로그램의 정상적인 흐름을 벗어난 코드는 여전히 공격에 취약합니다. 공격자가 정상적인 흐름이 중단될 때 실행되도록 디자인된 코드를 이용하는 경우는 수없이 많습니다.

Visual Studio 2005에는 단위 테스트를 만들 수 있는 다양한 테스트 도구가 들어 있습니다. Visual C++, Visual C# 또는 Visual Basic에서는 그림 7의 새 테스트 추가 대화 상자를 통해 단위 테스트를 직접 만들 수 있습니다.

그림 7. Visual Studio 2005의 새 테스트 추가 대화 상자로 새 단위 테스트 만들기

수동으로 단위 테스트를 만드는 대신 단위 테스트 마법사를 사용하여 테스트를 만들 수도 있습니다. 단위 테스트 마법사는 이러한 테스트 유형의 작동 원리를 이해하는 데 유용하며 직접 테스트를 만드는 시작 지점이 됩니다.

스트레스(부하) 테스트

부하 테스트는 웹 응용 프로그램에 발생할 수 있는 서비스 거부 공격 등의 시나리오를 디버깅하는 데 도움이 되기 때문에 중요합니다. 새 테스트 추가 대화 상자의 부하 테스트 템플릿에서는 그림 8과 같은 부하 테스트 새로 만들기 마법사를 실행합니다. 이 도구는 응용 프로그램에 발생할 것으로 예상되는 상황에 대한 부하 테스트 외에도 비정상적인 시나리오를 테스트하는 데 사용할 수 있습니다. 부하 테스트는 응용 프로그램에 엄청난 양의 요청을 보내 응용 프로그램이 어떻게 부하를 견디는지 알아보는 방식으로 수행합니다. 응용 프로그램을 면밀히 관찰하여 공격을 발견하고 필요한 경우 이런 종류의 공격에 대한 대응책을 계획할 수 있습니다.

그림 8. Visual Studio 2005의 부하 테스트 준비

결론

이 문서에서는 개발자들이 Visual Studio 2005를 꼭 필요한 새로운 도구로 인식하도록 하는 보안 기능에 대해 간략히 설명하고 있습니다. 현재 제작하는 것이 작은 유틸리티든, 업무 수행에 핵심적인 대규모 시스템이든 간에 고객 시스템의 안전과 응용 프로그램의 보안은 가장 우선적으로 고려해야 합니다. Visual Studio 2005에 기본 제공되는 새로운 도구를 사용하면 안전한 응용 프로그램을 보다 쉽게 빌드, 테스트 및 배포할 수 있습니다.


Brian Johnson은 MSDN의 Program Manager입니다. 현재 MSDN에서 Visual Studio, Visual C++, Security 및 .NET Framework Developer Center에 대한 내용을 담당하고 있습니다.

+ Recent posts