Win32 API의 오랜 취약점으로 인해 큰 영향을 미칩니다.
Win32에서 CreateProcess()
시스템 호출을 통해 프로그램이 생성됩니다 . 여러 가지 방법으로 사용할 수 있습니다. 유닉스, 리눅스 또는 OS / 2 배경에서 온 사람들은 일반적으로 프로그램 (이미지 파일)이 생성되고 명령 꼬리가 새로운 프로세스로 전달되는 두 가지 별도의 인수를 취하는 것으로 생각합니다. 파일 이름과 인수 벡터 / 명령 꼬리 해당 운영 체제의 API에는 두 가지가 있습니다. 그러나 실제로 시스템 호출은 프로그램 이름과 인수가 하나의 큰 문자열로 묶인 대체 형식으로 호출 될 수 있습니다. CreateProcess()
프로그램 파일 이름을 명령 꼬리와 분리하려고 시도합니다.
문제는 왼쪽 부분이 파일이나 디렉토리와 일치 할 때까지 연속되는 각 공백 문자에서 문자열을 twain으로 점진적으로 분할 하여이 작업을 수행한다는 것입니다. 많은 Win32 프로그램은 C:\Program Files\Contoso\TakeOver.exe StackExchange.com
시스템 호출 과 같은 문자열을 전달하려고 시도합니다 . 이렇게하면 명백히 위험한 사람이 와서 파일을 생성 할 때까지 올바른 프로그램 ( C:\Program Files\Contoso\TakeOver.exe
오른쪽 명령 꼬리 포함) 이 실행됩니다 .StackExchange.com
C:\Program
이 시점에서 시스템 호출은 C:\Program
tail 명령으로 프로그램 이미지 파일을 실행하려고 시도합니다 Files\Contoso\TakeOver.exe StackExchange.com
. C:\Program
실제로 실행 가능한 프로그램 이미지 인 경우 Heaven이 도움을줍니다 .
이것은 일반적인 약점이며, 하나의 큰 문자열을 사용하여 다른 프로그램을 생성하는 프로그램과 함께 공백을 포함하는 모든 프로그램 파일 이름에 적용됩니다. 그러나 가장C:\Program Files\
큰 영향을 받는 것은 하나의 큰 문자열 접근 방식을 사용하는 많은 Win32 프로그램과 그 아래에 존재하는 모든 프로그램입니다 .
Win32 API를 변경하기에는 너무 늦었습니다. 10 년 전에 너무 늦었습니다. 그리고 Microsoft는 두 개의 문자열 대신 하나의 큰 문자열을 전달 하는 다른 사람 이 작성한 모든 프로그램을 변경할 수 없습니다 CreateProcess()
. 따라서 Microsoft는 사용자가 로그온 할 때 C:\Program
표시되는 경고가 있는지 Windows에서 확인 합니다.
보시다시피, Microsoft의 Win32 doco 에는 몇 년 전부터 존재했던 One Big String 방식을 사용하여 프로그램을 작성하지 말라고 개발자에게 알려주는 "보안"경고가 있습니다.
추가 자료