BinSkim을 사용하여 이진 파일을 검사하여 취약성 식별
BinSkim을 사용하여 이진 파일을 검사하여 잠재적으로 이진 파일을 취약하게 만들 수 있는 코딩 및 빌드 사례를 식별합니다. 배송을 준비하고 있는 이진 파일을 확인하여 빌드 체인에 문제가 없는지 확인하는 데 사용할 수 있습니다.
BinSkim은 다음을 확인합니다.
- 오래된 컴파일러 도구 집합 사용 - 가능한 경우 가장 최근의 컴파일러 도구 집합을 사용하여 바이너리를 컴파일함으로써 현재 컴파일러 수준 및 OS 제공 보안 완화를 최대한 활용해야 합니다.
- 안전하지 않은 컴파일 설정 - 이진 파일은 OS에서 제공하는 보안 경감을 사용하고, 컴파일러 오류와 조치 가능한 경고를 최대화할 수 있도록 가능한 한 가장 안전한 설정으로 컴파일해야 합니다.
- 서명 문제 - 서명된 이진 파일은 암호화된 강력한 알고리즘으로 서명해야 합니다.
BinSkim은 오픈 소스 도구이며 정적 분석 결과 교환 형식(SARIF) 형식을 사용하는 출력 파일을 생성합니다. BinSkim은 이전 BinScope 도구를 대체합니다.
BinSkim에 대한 자세한 내용은 BinSkim 사용자 가이드참조하세요.
BinSkim 설치 및 실행
다음 단계에 따라 배송 중인 코드에서 보안 컴파일 옵션이 올바르게 구성되었는지 확인합니다.
플랫폼 간 .NET Core SDK을 다운로드하여 설치합니다.
Visual Studio가 설치되어 있는지 확인합니다. Visual Studio 다운로드 및 설치에 대한 자세한 내용은 Visual Studio설치를 참조하세요.
NuGet 패키지와 같이 BinSkim을 다운로드하는 다양한 옵션이 있습니다. 이 예제에서는 git 클론 옵션을 사용하여 여기에서 다운로드합니다. https://github.com/microsoft/binskim 64비트 Windows PC에 설치합니다.
Visual Studio 개발자 명령 프롬프트 창을 열고 디렉터리(예:
C:\binskim-master
)를 만듭니다.C:\> Md \binskim-master
방금 만든 디렉터리로 이동합니다.
C:\> Cd \binskim-master
git clone 명령을 사용하여 필요한 모든 파일을 다운로드합니다.
C:\binskim-master> git clone --recurse-submodules https://github.com/microsoft/binskim.git
복제 명령어로 생성된 새
binskim
디렉토리로 이동합니다.C:\> Cd \binskim-master\binskim
BuildAndTest.cmd 실행하여 릴리스 빌드가 성공하고 모든 테스트가 통과하는지 확인합니다.
C:\binskim-master\binskim> BuildAndTest.cmd Welcome to .NET Core 3.1! --------------------- SDK Version: 3.1.101 ... C:\binskim-master\binskim\bld\bin\AnyCPU_Release\Publish\netcoreapp2.0\win-x64\BinSkim.Sdk.dll 1 File(s) copied C:\binskim-master\binskim\bld\bin\AnyCPU_Release\Publish\netcoreapp2.0\linux-x64\BinSkim.Sdk.dll 1 File(s) copied ...
빌드 프로세스는 BinSkim 실행 파일을 사용하여 디렉터리 집합을 만듭니다. win-x64 빌드 출력 디렉터리로 이동합니다.
C:\binskim-master\binskim> Cd \binskim-master\bld\bin\AnyCPU_Release\Publish\netcoreapp2.0\win-x64>
분석 옵션에 대한 도움말을 표시합니다.
C:\binskim-master\binskim\bld\bin\AnyCPU_Release\Publish\netcoreapp2.0\win-x64> BinSkim help analyze
BinSkim PE/MSIL Analysis Driver 1.6.0.0
--sympath Symbols path value, e.g., SRV*http://msdl.microsoft.com/download/symbols or Cache*d:\symbols;Srv*http://symweb. See
https://learn.microsoft.com/windows-hardware/drivers/debugger/advanced-symsrv-use for syntax information. Note that BinSkim will clear the
_NT_SYMBOL_PATH environment variable at runtime. Use this argument for symbol information instead.
--local-symbol-directories A set of semicolon-delimited local directory paths that will be examined when attempting to locate PDBs.
-o, --output File path to which analysis output will be written.
--verbose Emit verbose output. The resulting comprehensive report is designed to provide appropriate evidence for compliance scenarios.
...
BinSkim의 기호 경로 설정
BinSkim을 실행하는 동일한 컴퓨터에서 분석하는 모든 코드를 빌드하는 경우 일반적으로 기호 경로를 설정할 필요가 없습니다. 이는 컴파일한 로컬 상자에서 기호 파일을 사용할 수 있기 때문입니다. 더 복잡한 빌드 시스템을 사용하거나 기호를 컴파일된 이진 파일과 함께 있지 않은 다른 위치로 리디렉션하는 경우 --local-symbol-directories
사용하여 기호 파일 검색에 이러한 위치를 추가합니다.
코드가 코드의 일부가 아닌 컴파일된 이진 파일을 포함하는 경우, 이러한 코드 종속성의 보안을 확인하기 위해 Windows 디버거 sympath를 사용하여 심볼을 가져올 수 있습니다. 이러한 종속성에서 문제가 발견되면 문제를 해결할 수 없을 수 있습니다. 그러나 이러한 종속성을 사용하여 수락할 수 있는 보안 위험을 인식하는 것이 유용할 수 있습니다.
팁
네트워크 기호 서버를 참조하는 기호 경로를 추가할 때 로컬 캐시 위치를 추가하여 기호를 캐시할 로컬 경로를 지정합니다. 이렇게 하지 않으면 BinSkim의 성능이 크게 손상됩니다. 다음 예제에서는 d:\symbols에서 로컬 캐시를 지정합니다.
--sympath Cache*d:\symbols;Srv*http://symweb
sympath에 대한 자세한 내용은 Windows 디버거 기호 경로를 참조하세요.
다음 명령을 실행하여 컴파일된 드라이버 이진 파일을 분석합니다. 컴파일된 드라이버 .sys 파일을 가리키도록 대상 경로를 업데이트합니다.
C:\binskim-master\binskim\bld\bin\AnyCPU_Release\Publish\netcoreapp2.0\win-x64> BinSkim analyze "C:\Samples\KMDF_Echo_Driver\echo.sys"
자세한 내용을 원하시면, 다음과 같이 상세 옵션을 추가하세요.
C:\binskim-master\binskim\bld\bin\AnyCPU_Release\Publish\netcoreapp2.0\win-x64> BinSkim analyze "C:\Samples\KMDF_Echo_Driver\osrusbfx2.sys" --verbose
메모
--verbose 옵션은 모든 검사에 대해 명시적 통과/실패 결과를 생성합니다. 자세한 정보를 제공하지 않으면 BinSkim에서 감지한 결함만 표시됩니다. --verbose 옵션은 일반적으로 로그 파일의 크기가 증가하고 많은 '통과' 결과들 사이에 개별 오류가 숨겨져 찾기 어려워지기 때문에 실제 자동화 시스템에는 권장되지 않습니다.
명령 출력을 검토하여 가능한 문제를 찾습니다. 이 예제 출력은 통과한 세 가지 테스트를 보여 줍니다. BA2002와 같은 규칙에 대한 추가 정보는 BinSkim 사용자 가이드에서 확인할 수 있습니다.
Analyzing... Analyzing 'osrusbfx2.sys'... ... C:\Samples\KMDF_Echo_Driver\osrusbfx2.sys\Debug\osrusbfx2.sys: pass BA2002: 'osrusbfx2.sys' does not incorporate any known vulnerable dependencies, as configured by current policy. C:\Samples\KMDF_Echo_Driver\Debug\osrusbfx2.sys: pass BA2005: 'osrusbfx2.sys' is not known to be an obsolete binary that is vulnerable to one or more security problems. C:\Samples\KMDF_Echo_Driver\osrusbfx2.sys: pass BA2006: All linked modules of 'osrusbfx2.sys' generated by the Microsoft front-end satisfy configured policy (compiler minimum version 17.0.65501.17013).
이 출력은 도구가 드라이버가 ELF 이진 파일이 아님을 나타내기 때문에 테스트 BA3001이 실행되지 않음을 보여줍니다.
... C:\Samples\KMDF_Echo_Driver\Debug\osrusbfx2.sys: notapplicable BA3001: 'osrusbfx2.sys' was not evaluated for check 'EnablePositionIndependentExecutable' as the analysis is not relevant based on observed metadata: image is not an ELF binary.
이 출력은 테스트 BA2007에 대한 오류를 표시합니다.
... C:\Samples\KMDF_Echo_Driver\Debug\osrusbfx2.sys: error BA2007: 'osrusbfx2.sys' disables compiler warning(s) which are required by policy. A compiler warning is typically required if it has a high likelihood of flagging memory corruption, information disclosure, or double-free vulnerabilities. To resolve this issue, enable the indicated warning(s) by removing /Wxxxx switches (where xxxx is a warning id indicated here) from your command line, and resolve any warnings subsequently raised during compilation.
Visual Studio에서 이러한 경고를 사용하도록 설정하려면, 프로젝트의 속성 페이지에서 C/C++로 이동하여 특정 경고 사용 안 함에서 제외하려는 값을 제거하십시오.
드라이버 프로젝트에 대한 Visual Studio의 기본 컴파일 옵션은 다음과 같은 경고를 사용하지 않도록 설정할 수 있습니다. 이러한 경고는 BinSkim에 의해 보고됩니다.
C4603 - 'name': 미리 컴파일된 헤더 사용 후 매크로가 정의되지 않았거나 정의가 다릅니다
C4627 - 'description': 미리 컴파일된 헤더 사용을 검색할 때 건너뛰는
C4986 - 'declaration': 예외 사양이 이전 선언 일치하지 않습니다.
컴파일러 경고에 대한 자세한 내용은 컴파일러 버전 에서의 컴파일러 경고를 참조하세요.