Windows 보안 기능 테스트
앱을 테스트하여 앱이 Windows 보안 기능 및 강력한 ACL을 사용하는지 확인합니다.
배경
기본 Windows 보안 보호 기능을 변경하면 고객이 더 큰 위험에 노출될 수 있습니다.
테스트 정보
BinScope 이진 분석기 및 공격을 받을 수 있는 취약점 분석기를 실행하여 앱 보안을 테스트합니다.
수정 작업
테스트에서 식별된 문제를 해결 및 수정하세요. 앱을 다시 빌드하고 다시 테스트하세요.
BinScope 이진 분석기 테스트
Binscope 이진 분석기 테스트는 앱의 이진 파일을 검사하여 앱을 공격이나 공격 벡터로 사용되는 것에 덜 취약하게 만드는 코딩 및 빌드 규칙을 확인합니다.
BinScope 이진 분석기 테스트는 다음과 같은 보안 관련 기능이 올바로 사용되는지 확인합니다.
- AllowPartiallyTrustedCallersAttribute
- /SafeSEH 예외 처리 보호
- 데이터 실행 방지
- ASLR(Address Space Layout Randomization)
- 읽기/쓰기 공유 PE 섹션
- AppContainerCheck
- ExecutableImportsCheck
- WXCheck
AllowPartiallyTrustedCallersAttribute
Windows 앱 인증 키트 오류 메시지: APTCACheck 테스트 실패
APTCA(AllowPartiallyTrustedCallersAttribute) 특성을 사용하면 서명된 어셈블리의 부분적으로 신뢰할 수 있는 코드에서 완전히 신뢰할 수 있는 코드에 액세스할 수 있습니다. APTCA 특성을 어셈블리에 적용하면 부분적으로 신뢰할 수 있는 호출자가 어셈블리 수명 동안 해당 어셈블리에 액세스할 수 있으므로 보안이 손상될 수 있습니다.
앱이 이 테스트에 실패할 경우 수행할 작업
프로젝트에 필요하고, 그 위험성을 잘 이해하고 있는 경우가 아니면 강력한 이름이 지정된 어셈블리에 APTCA 특성을 사용하지 마세요. 필요한 경우 모든 API를 적절한 코드 액세스 보안 요구로 보호하세요. 어셈블리가 Windows 스토어 앱의 일부인 경우 APTCA는 적용되지 않습니다.
설명
이 테스트는 관리 코드(C#, .NET 등)에서만 수행됩니다.
/SafeSEH 예외 처리 보호
Windows 앱 인증 키트 오류 메시지: SafeSEHCheck 테스트 실패
앱에서 0으로 나누기 오류 등의 예외 상태가 발생하면 예외 처리기가 실행됩니다. 예외 처리기의 주소는 함수 호출 시 스택에 저장되기 때문에 일부 악성 소프트웨어가 스택을 덮어쓰려고 할 경우 버퍼 오버플로 공격자에게 취약할 수 있습니다.
앱이 이 테스트에 실패할 경우 수행할 작업
앱을 빌드할 때 링커 명령에서 /SAFESEH 옵션을 사용하도록 설정합니다. 이 옵션은 Visual Studio의 릴리스 구성에서 기본적으로 설정되어 있습니다. 빌드 지침에서 앱의 모든 실행 모듈에 대해 이 옵션을 사용하도록 설정했는지 확인하세요.
설명
이 테스트는 예외 처리기 주소를 스택에 저장하지 않는 64비트 이진이나 ARM 칩세트 이진에서 수행되지 않습니다.
데이터 실행 방지
Windows 앱 인증 키트 오류 메시지: NXCheck 테스트 실패
이 테스트는 앱이 데이터 세그먼트에 저장된 코드를 실행하지 않는지 확인합니다.
앱이 이 테스트에 실패할 경우 수행할 작업
앱을 빌드할 때 링커 명령에서 /NXCOMPAT 옵션을 사용하도록 설정하세요. 이 옵션은 DEP(데이터 실행 방지)를 지원하는 링커 버전에서 기본적으로 설정되어 있습니다.
설명
DEP 가능 CPU에서 앱을 테스트하고 DEP에서 발생하는 모든 오류를 수정하는 것이 좋습니다.
ASLR(Address Space Layout Randomization)
Windows 앱 인증 키트 오류 메시지: DBCheck 테스트 실패
ASLR(Address Space Layout Randomization)은 실행 가능 이미지를 예측할 수 없는 메모리 위치에 로드하므로 프로그램이 특정 가상 주소에 로드될 것을 예상하는 악성 소프트웨어가 예측대로 작동하기 어렵습니다. 앱과 앱이 사용하는 모든 구성 요소가 ASLR을 지원해야 합니다.
앱이 이 테스트에 실패할 경우 수행할 작업
앱을 빌드할 때 링커 명령에서 /DYNAMICBASE 옵션을 사용하도록 설정하세요. 앱이 사용하는 모든 모듈에서 이 링커 옵션도 사용하는지 확인하세요.
설명
일반적으로 ASLR은 성능에 영향을 주지 않습니다. 그러나 32비트 시스템에서 성능이 약간 향상되는 경우도 있습니다. 많은 이미지가 각기 다른 메모리 위치에 로드되어 있는 혼잡한 시스템에서는 성능이 저하될 수 있습니다.
이 테스트는 C# 또는 .NET Framework 등의 관리 코드로 작성된 앱에서만 수행합니다.
읽기/쓰기 공유 PE 섹션
Windows 앱 인증 키트 오류 메시지: SharedSectionsCheck 테스트 실패.
공유로 표시된 쓰기 가능한 섹션이 있는 이진 파일은 보안 위협이 됩니다. 필요한 경우가 아니면 쓰기 가능한 공유 섹션을 사용하여 앱을 빌드하지 마세요. CreateFileMapping 또는 MapViewOfFile을 사용하여 보안이 제대로 설정된 공유 메모리 개체를 만드세요.
앱이 이 테스트에 실패할 경우 수행할 작업
앱에서 공유 섹션을 제거하고 적절한 보안 특성으로 CreateFileMapping 또는 MapViewOfFile을 호출하여 공유 메모리 개체를 만든 다음 앱을 다시 빌드하세요.
설명
이 테스트는 C 또는 C++ 등의 관리되지 않는 언어로 작성된 앱에서만 수행합니다.
AppContainerCheck
Windows 앱 인증 키트 오류 메시지: AppContainerCheck 테스트 실패.
AppContainerCheck는 실행 가능 이진 파일의 PE(이식 가능 파일) 헤더에 appcontainer 비트가 설정되어 있는지 확인합니다. Windows 스토어 앱이 올바로 실행되려면 모든 .exe 파일과 모든 관리되지 않는 DLL에 appcontainer 비트가 올바로 설정되어 있어야 합니다.
앱이 이 테스트에 실패할 경우 수행할 작업
기본 실행 파일이 테스트에 실패할 경우 최신 컴파일러 및 링커를 사용하여 파일을 빌드했고 링커에서 /appcontainer 플래그를 사용하는지 확인하세요.
관리되는 실행 파일이 테스트에 실패할 경우 Microsoft Visual Studio와 같은 최신 컴파일러 및 링커를 사용하여 Windows 스토어 앱을 빌드했는지 확인하세요.
설명
이 테스트는 모든 .exe 파일 및 모든 관리되지 않는 DLL에서 수행됩니다.
ExecutableImportsCheck
Windows 앱 인증 키트 오류 메시지: ExecutableImportsCheck 테스트 실패.
PE(이식 가능 파일) 이미지의 가져오기 테이블이 실행 코드 섹션에 배치된 경우 이 테스트에 실패합니다. 이 오류는 Visual C++ 링커의 /merge 플래그를 /merge:.rdata=.text로 설정하여 PE 이미지에 대해 .rdata 병합을 사용하도록 설정한 경우에 발생할 수 있습니다.
앱이 이 테스트에 실패할 경우 수행할 작업
가져오기 테이블을 실행 코드 섹션에 병합하지 마세요. Visual C++ 링커의 /merge 플래그를 설정하여 “.rdata” 섹션을 코드 섹션에 병합하지 않아야 합니다.
설명
이 테스트는 관리되는 어셈블리를 제외한 모든 이진 코드에서 수행합니다.
WXCheck
Windows 앱 인증 키트 오류 메시지: WXCheck 테스트 실패.
이러한 검사를 통해 쓰기 가능 및 실행 가능으로 매핑된 페이지가 이진에 없는지 확인할 수 있습니다. 쓰기 가능 및 실행 가능 섹션이 이진에 있거나 이진 SectionAlignment가 PAGE_SIZE보다 작은 경우 이러한 오류가 발생할 수 있습니다.
앱이 이 테스트에 실패할 경우 수행할 작업
쓰기 가능 및 실행 가능 섹션이 이진에 없고 이진 SectionAlignment 값이 해당 PAGE_SIZE 이상인지 확인합니다.
설명
이 테스트는 모든 .exe 파일 및 관리되지 않는 네이티브 DLL에서 수행됩니다.
편집 및 계속이 사용 설정된 상태로 실행 파일이 작성된 경우 쓰기 가능 및 실행 가능 섹션이 실행 파일에 있을 수 있습니다(/ZI). 편집 및 계속을 사용하지 않도록 설정하면 잘못된 섹션이 표시되지 않습니다.
PAGE_SIZE는 실행 파일의 기본 SectionAlignment입니다.
Windows 스토어의 금지된 파일
Windows 앱 인증 키트 오류 메시지: 금지된 파일 검사 테스트에 실패했습니다.
Windows 스토어 앱이 특정 파일을 포함해서는 안 됩니다. 이 파일에는 중요한 보안, 안정성 또는 기타 향상 기능을 제공하는 최신 버전이 있습니다. Microsoft는 이 파일을 Windows 앱 인증 키트에서 차단하여 모든 개발자가 현재 버전을 사용할 수 있도록 보장합니다.
Windows 앱 인증 키트의 금지된 파일 검사는 현재 다음과 같은 파일을 검사합니다.
Bing.Maps.JavaScript\js\veapicore.js
앱이 최신 공식 릴리스 대신 "Release Preview" 버전의 파일을 사용하는 경우 이 검사는 일반적으로 실패합니다. 이 문제를 해결하려면 Windows 스토어 앱용 Bing 지도 SDK의 최신 버전을 사용하세요.
공격을 받을 수 있는 취약점 분석기
공격을 받을 수 있는 취약점 분석기 테스트는 앱 설치 및 실행 후 발생하는 시스템 상태, 런타임 매개 변수 및 보안 개체의 변경 사항을 검사하여 특정 보안 취약점을 찾습니다. 이러한 취약점을 수정해도 성능이 떨어지지 않습니다. 이러한 보안 취약점이 있는 경우 Windows 스토어용 앱으로 인증되지 않습니다.
공격을 받을 수 있는 취약점 분석기 테스트는 모든 프로그래밍 언어에 적용되며 앱에서 다음과 같은 보안 취약점을 찾습니다.
- ACL이 취약한 보안 실행 파일
- 개체가 포함되어 있고 ACL이 취약한 보안 디렉터리
- ACL이 취약한 보안 레지스트리 키
- 관리자가 아닌 사용자 계정에 액세스를 허용하여 변조에 취약한 서비스
- 다시 시작이 빠르거나 24시간마다 두 번 이상 다시 시작할 수 있는 서비스
ACL이 취약한 보안 실행 파일
이 테스트는 관리자가 소유한 각각의 새 실행 파일이나 변경된 실행 파일에서 ACL(액세스 제어 목록)을 확인하여 ACL이 취약한 보안 실행 파일을 찾습니다. 이러한 파일의 ACL은 관리자가 아닌 사용자가 파일을 수정하지 못하도록 해야 합니다. 공격을 받을 수 있는 취약점 분석기는 실행 파일(.exe)뿐 아니라 실행 가능한 콘텐츠를 포함할 수 있는 스크립트 및 도움말 파일과 같은 파일도 테스트합니다.
앱이 이 테스트에 실패할 경우 수행할 작업
앱에서 이 취약점이 발견되는 경우 관리자가 아닌 사용자 계정에 GENERIC_ALL, GENERIC_WRITE, WRITE_OWNER, WRITE_DAC, FILE_WRITE_ATTRIBUTES, FILE_WRITE_EA, FILE_APPEND_DATA 또는 FILE_WRITE_DATA, DELETE 권한이 있는지 확인하고 있으면 제거하세요.
설명
취약한 ACL을 통해 관리자가 아닌 사용자가 실행 파일을 변경할 수 있습니다. 실행 파일이 변경된 경우 올바로 동작하지 않을 수 있습니다. 액세스 권한이 올바로 구성되어 있지 않은 경우 공격자가 파일의 콘텐츠를 바꾸거나 변경하여 악의적으로 동작하도록 할 수 있습니다.
개체가 포함되어 있고 ACL이 취약한 보안 디렉터리
이 테스트는 새로 추가되거나 변경된 폴더 계층의 ACL을 확인하여 개체가 포함되어 있고 ACL이 취약한 보안 디렉터리를 찾습니다. 계층적 ACL(또는 상속된 ACL)은 폴더 내의 모든 파일 및 폴더에 대한 액세스를 제어합니다. 이러한 폴더의 ACL은 관리자가 아닌 사용자가 폴더나 그 내용을 수정하지 못하도록 해야 합니다.
이 테스트에서는 보안이 올바로 설정되지 않은 각 실행 파일 및 하위 폴더에 플래그를 지정하는 대신 ACL이 취약한 계층 구조의 최상위 폴더를 식별합니다.
앱이 이 테스트에 실패할 경우 수행할 작업
앱에서 이 취약점이 발견되는 경우 테스트에서 식별된 디렉터리에서 관리자가 아닌 모든 계정에 GENERIC_ALL, GENERIC_WRITE, WRITE_OWNER, WRITE_DAC, FILE_ADD_FILE, FILE_ADD_SUBDIRECTORY, FILE_WRITE_ATTRIBUTES, FILE_WRITE_EA, FILE_APPEND_DATA, FILE_WRITE_DATA, FILE_DELETE_CHILD 및 DELETE 권한이 있는지 확인하고 있으면 제거하여 권한이 상속되지 않도록 하세요. 이렇게 하려면 루트 디렉터리의 ACL에서 Inherited 플래그를 변경해야 할 수도 있습니다.
루트 디렉터리에 대한 권한을 수정한 후 ACL이 취약한 보안 실행 파일에서 설명한 대로 개별 실행 파일의 권한도 수정해야 할 수 있습니다.
설명
이 테스트는 모두 ACL이 취약하여 관리자가 아닌 사용자에게 부적절한 권한을 부여하는 디렉터리 계층 및 해당 파일을 식별합니다. 이 계층은 잘못 상속된 권한 때문에 발생할 수 있으므로 먼저 상속된 권한을 살펴본 다음 하위 디렉터리 및 파일의 권한을 변경하세요.
ACL이 취약한 보안 레지스트리 키
이 테스트는 로컬 컴퓨터 레지스트리 하이브(HKLM)에서 새 키나 변경된 키의 ACL(액세스 제어 목록)을 확인하여 ACL이 취약한 보안 레지스트리 키를 찾습니다 관리자만 로컬 컴퓨터 레지스트리 하이브에 대한 쓰기 권한이 있어야 합니다.
앱이 이 테스트에 실패할 경우 수행할 작업
관리자가 아닌 모든 사용자 계정에 대해 테스트에서 식별된 개체에 대한 GENERIC_ALL, GENERIC_WRITE, WRITE_OWNER, WRITE_DAC, KEY_SET_VALUE, KEY_CREATE_SUBKEY 및 DELETE 권한을 제거하세요.
설명
이 섹션의 레지스트리 값은 .exe 및 .dll과 같은 실행 파일을 찾을 위치를 결정할 수 있습니다. 앱에서도 로컬 컴퓨터 레지스트리 하이브의 레지스트리 키를 사용하여 실행 파일의 경로를 저장하거나 읽습니다. 공격자가 이 키 값을 신뢰할 수 없는 실행 파일의 경로로 변경하는 등과 같이 변경하는 경우 앱이 잘못된 파일을 실행할 수 있습니다.
레지스트리 키가 실행 파일을 참조하는 것 같으면 이 테스트는 키의 ACL을 검사하여 관리자가 아닌 사용자 계정에 부적절한 권한을 부여하는지 확인합니다.
관리자가 아닌 사용자 계정에 액세스를 허용하여 변조에 취약한 서비스
이 테스트는 서비스의 ACL을 확인하여 관리자가 아닌 사용자 계정에 액세스를 허용하는 새 서비스나 변경된 서비스를 찾습니다. 새 서비스의 바이너리 경로, 호스트 DLL, 레지스트리 키 또는 서비스 자체에 대한 ACL이 취약하지 않아야 합니다. 그렇지 않으면 관리자가 아닌 사용자가 서비스가 실행되는 방식을 변경할 수 있습니다.
앱이 이 테스트에 실패할 경우 수행할 작업
ACL이 취약한 보안 실행 파일에 설명된 대로 개별 파일을 수정하세요.
설명
서비스에는 일반 권한 및 서비스별 권한이 모두 연결되어 있습니다. 이 테스트는 관리자가 아닌 사용자 계정에 부여된 부적절한 권한을 찾습니다. 권한에 보안이 설정되어 있지 않으면 공격자가 서비스를 리디렉션하여 서비스가 시작될 때 신뢰할 수 없는 파일을 실행할 수 있습니다.
예를 들어 공격자가 ChangeServiceConfig를 호출하여 서비스의 실행 파일 경로를 변경할 수 있습니다.
다시 시작이 빠르거나 24시간마다 두 번 이상 다시 시작할 수 있는 서비스
이 테스트는 서비스의 구성을 확인하여 자주 다시 시작할 수 있는 서비스를 찾습니다. 서비스가 24시간에 두 번 이상 다시 시작하지 않아야 합니다.
앱이 이 테스트에 실패할 경우 수행할 작업
서비스가 24시간에 두 번 이상 다시 시작하지 않도록 서비스의 Reset Period를 변경하세요.
설명
이 테스트는 ASLR(Address Space Layout Randomization)과 관련된 취약성을 찾습니다. ASLR은 실행 코드를 임의의 메모리 위치로 로드하는 기능으로 보안 취약점을 악용하기 어렵게 만듭니다. 공격자가 반복해서 서비스가 다시 시작하도록 할 수 있는 경우 무차별 암호 대입을 사용하여 실행 코드를 가능한 모든 위치로 로드하고 ASLR을 무력화할 수 있습니다.
이 테스트는 Service Failure Actions 구조의 lpsaActions 요소에 SC_ACTION_REBOOT 및 SC_ACTION_RESTART 값이 있는지 검사합니다. 이 값은 ChangeServiceConfig2를 호출하여 구성할 수 있습니다.
테스트에서는 두 개 이상의 작업이 있고, 해당하는 지연 값이 24시간 미만이고, 서버 다시 시작 기간이 24시간 미만인지 여부를 확인합니다.