내보내기(0) 인쇄
모두 확장

Shim 이해

shim의 작동 방식

Microsoft® Windows® 운영 체제의 응용 프로그램 환경 및 호환성은 성능, 안정성 및 관리 효율성과 함께 응용 프로그램을 개발하는 데 기초가 되는 사항 중 하나입니다. 배포 비용을 줄이고 보급률을 높이기 위해 Microsoft는 기존 소프트웨어와의 광범위한 호환성을 보장하고 엔지니어링 및 출시 과정에서 호환성을 지원하는 기술적 솔루션에 대한 투자를 강화하고 있습니다.

Microsoft Windows 응용 프로그램 호환성 인프라(Shim 인프라)는 이러한 강력한 기술 솔루션 중 하나입니다. Windows 운영 체제가 버전이 바뀌며 발전하면서 새로운 기술을 지원하고 버그 수정을 통합하고 전략의 수정 사항을 구현하는 변화를 겪게 됨에 따라 일부 기능 구현의 변경이 해당 기능에 의존하는 응용 프로그램에 영향을 미칠 수 있습니다. 소프트웨어의 특성 때문에 기능을 다시 수정하여 이 호환성 문제를 해결하면 추가 응용 프로그램이 작동하지 않거나 다른 구현이 제공할 수 있는 개선 기능에 관계없이 Windows가 동일하게 유지되어야 할 수 있습니다. Windows의 소스 코드에 분기를 직접 배치하여 이 가능성을 회피할 수 있지만 이렇게 하면 Windows 운영 체제의 서비스 효율과 안정성에 대한 장기적 문제가 생깁니다. 그러나 Shim 인프라를 사용하면 특정 응용 프로그램(일반적으로 해당 응용 프로그램의 특정 버전)에만 해당하는 특정 응용 프로그램 수정을 대상으로 지정할 수 있으며 이러한 수정은 핵심 Windows 함수 외부에 보관되고 별도로 유지 관리됩니다.

Shim 인프라는 일종의 API(응용 프로그래밍 인터페이스) 후크를 구현하며, 특히 Windows 자체에서 다른 코드, 즉 shim 자체로 API 호출을 리디렉션하는 연결의 특성을 활용합니다. Windows PE(Portable Executable) 및 COFF(공용 개체 파일 형식) 사양에는 몇 가지 헤더가 포함되어 있고 이 헤더의 데이터 디렉터리는 응용 프로그램과 연결된 파일 간의 간접 계층을 제공합니다. 외부 이진 파일에 대한 호출은 IAT(Import Address Table)를 통해 수행됩니다. 따라서 Windows 호출은 시스템에서 그림 1과 같습니다.

643f2bee-8329-4018-9d90-2ffcc7c76a6c

그림 1   IAT를 통해 Windows를 호출하는 응용 프로그램

특히 가져오기 테이블에서 확인된 Windows 함수의 주소를 수정한 다음 그림 2에 나와 있는 것처럼 다른 shim 코드에서 함수에 대한 포인터로 바꿀 수 있습니다.

ART 이미지

그림 2   Windows를 호출하기 전에 shim으로 리디렉션되는 응용 프로그램

이 간접 절차는 응용 프로그램이 로드될 때 정적으로 연결된 .dll 파일의 경우 발생합니다. GetProcAddress API를 후크하여 동적으로 연결된 .dll 파일에도 shim을 적용할 수 있습니다.

Shim 인프라의 디자인 의미

shim 적용 전략을 결정할 때 Shim 인프라 디자인의 특정 결과가 관련이 있음을 발견할 수 있습니다.

첫째, 그림 2에 나와 있듯이 Windows를 호출하기 전에 shim으로 리디렉션되는 응용 프로그램의 경우 shim 내부에서 실행되는 코드는 여전히 Windows 외부에 있습니다. 따라서 Windows에서는 응용 프로그램 코드 자체와 동일한 보안 제한을 shim 코드에 적용합니다. 사실 Windows 측면에서는 shim 코드가 응용 프로그램 코드처럼 보이므로 shim을 사용하여 Windows에 있는 보안 메커니즘을 우회할 수 없습니다. 예를 들어 관리자 권한으로 응용 프로그램을 계속 실행하는 동안 Windows 7 UAC(사용자 계정 컨트롤) 프롬프트를 우회하는 데 shim을 사용할 수 없습니다. 관리자 권한을 필요로 하지 않도록 응용 프로그램에 shim을 적용하거나 관리자 권한을 요청하도록 응용 프로그램에 shim을 적용할 수 있지만 UAC를 사용하도록 설정한 상태에서 관리자 권한을 받으려면 사용자가 권한 상승을 승인해야 합니다. 이는 사용자가 직접 작성하는 코드에도 동일하게 적용됩니다.

따라서 기업에서 shim을 사용하는 경우의 보안 의미를 평가할 때 보안 취약점이 추가로 생기는 것으로 생각하면 안 됩니다. 사실 보안 설명자를 느슨하게 하거나 보안 정책을 완화해야 하는 경우를 피하기 위해 shim을 사용하는 것은 일반적으로 더욱 안전한 선택일 수 있습니다. 예를 들어 shim이 없으면 특정 디렉터리에 대한 ACL을 느슨하게 하여 호환성 문제를 완화할 수도 있지만 이 결정은 전체 시스템에 영향을 미칩니다. shim을 사용하면 해당 응용 프로그램의 사용자별 위치로 파일 액세스를 리디렉션할 수 있습니다. 또 다른 예로 응용 프로그램이 관리자 권한을 명시적으로 검사할 수 있습니다. shim을 사용하지 않는 경우 이 검사를 통과하려면 응용 프로그램에 관리자 권한을 부여해야 할 수 있습니다. 그러나 검사가 불필요하면 shim은 현재 사용자에게 관리자 권한이 있는지 여부에 대해 거짓 정보를 제공하여 보안 노출 영역을 추가로 드러내지 않고 검사가 성공할 수 있도록 합니다.

둘째, Shim 인프라가 Windows를 호출하기 전에 결국 추가 코드를 응용 프로그램에 삽입하기 때문에 shim을 사용하여 수행하려는 모든 완화는 응용 프로그램 코드 자체를 수정하여 수행할 수 있습니다. 최소한 Windows에서 Windows API를 호출하기 직전에 shim에 구현하는 것과 유사한 코드가 응용 프로그램에 포함될 수 있습니다.

마지막으로 shim이 사용자 모드 응용 프로그램 프로세스 내에서 사용자 모드 코드로 실행되기 때문에 shim을 사용하여 커널 모드 코드를 수정할 수 없습니다. 예를 들어 shim을 사용하여 장치 드라이버나 다른 커널 모드 코드의 호환성 문제를 해결할 수 없습니다(예를 들어 바이러스 백신, 방화벽 및 스파이웨어 방지 코드가 커널 모드에서 실행되는 경우).

이 정보가 도움이 되었습니까?
(1500자 남음)
의견을 주셔서 감사합니다.

커뮤니티 추가 항목

추가
표시:
© 2014 Microsoft