“C : \ Program”이라는 프로그램이 다른 프로그램에 영향을 줄 수있는 이유는 무엇입니까? 파일

오늘은 파란색이라는 파일이 Programroot의에 나타 났 C:\으며 시스템에 로그인하면 팝업에 다음과 같은 메시지가 표시됩니다.

파일 이름 경고

컴퓨터에 “C : \ Program”이라는 파일 또는 폴더가있어 특정 응용 프로그램이 제대로 작동하지 않을 수 있습니다. “C : \ Program1″로 이름을 바꾸면 문제가 해결됩니다. 지금 이름을 바꾸시겠습니까?

메시지는 자명하지만이 파일이 왜 그렇게 큰 영향을 미칠 수 있을지 궁금합니다. 실제로, 일부 프로그램 (아마도, 내가 확인하지 않은) C:\Program Files...은 전혀 시작되지 않았습니다. 폴더에 쓰려고 C:\Program Files\Something...하지만 따옴표없이 파일을 만드는 방법은 이해할 수 있지만 다른 프로그램에 어떤 영향을 줄 수 있는지는 거의 이해하지 못합니다.



답변

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.comC:\Program

이 시점에서 시스템 호출은 C:\Programtail 명령으로 프로그램 이미지 파일을 실행하려고 시도합니다 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 방식을 사용하여 프로그램을 작성하지 말라고 개발자에게 알려주는 “보안”경고가 있습니다.

추가 자료


답변