보안 고려 사항: Microsoft Windows 컨트롤
이 항목에서는 Windows 컨트롤과 관련된 보안 고려 사항에 대한 정보를 제공합니다. 이 항목의 정보에 보안 문제와 관련해 알아야 할 모든 내용이 나와 있지는 않습니다. 이 내용을 시작점이자 이 기술 영역에 대한 참조로 사용하세요.
컴퓨터 간의 상호 연결은 일반적입니다. 개발자의 주요 관심사는 애플리케이션 보안이어야 합니다. 다음 섹션에서는 Windows 컨트롤을 프로그래밍할 때 고려해야 할 몇 가지 잠재적인 보안 문제에 대해 설명합니다.
Null로 종료된 제어 메시지
대부분의 컨트롤 메시지와 매크로에는 문자열 매개 변수가 있습니다. 이러한 메시지는 입력 문자열의 유효성을 검사하지 않는 경우가 많은데, 특히 종료 '\0'
을 확인하지 않습니다. 문자열을 매개 변수로 사용하는 메시지를 호출할 때 문자열이 null로 종료되도록 명시적으로 지정합니다.
문자열 사용
Windows 컨트롤을 프로그래밍할 때 문자열을 조작해야 합니다. 거의 모든 컨트롤에 텍스트를 삽입해야 합니다. 예를 들어, 목록 상자를 채우려면 컨트롤에 문자열을 로드해야 합니다. 문자열을 잘못 사용하면 버퍼 오버런이 발생하는 경우가 많기 때문에 이 보안 위험을 방지하려면 주의해야 합니다.
버퍼 오버런에 대한 자세한 내용은 2002년 Microsoft Press, Michael Howard 및 David LeBlanc의 보안 코드 작성 및 보안 API에 대한 모범 사례를 참조하세요.
입력 유효성 검사
다음 제어 메시지는 보안 문제를 표시할 수 있습니다.
- CB_GETLBTEXT
- LVM_GETISEARCHSTRING
- SB_GETTEXT
- SB_GETTIPTEXT
- TB_GETBUTTONTEXT
- TTM_GETTEXT
- TVM_GETISEARCHSTRING
텍스트 길이를 가져오기 위한 호출과 텍스트가 표시되거나 사용되는 시간 사이에 텍스트가 변경되면 버퍼 오버런이 발생할 수 있습니다. 이를 방지하려면 문자열을 사용하기 전에 유효성을 검사해야 합니다. 또한 텍스트를 검색하는 메시지, CB_GETLBTEXT, TB_GETBUTTONTEXT, TTM_GETTEXT에는 버퍼 오버런 가능성을 나타내는 버퍼 크기 매개 변수가 없습니다.
CB_GETLBTEXT 또는 SB_GETTEXT를 사용하는 경우, 먼저 CB_GETLBTEXTLEN 또는 SB_GETTEXTLENGTH를 호출하여 버퍼 크기를 가져와야 합니다. 이러한 메시지 중 일부(TB_GETBUTTONTEXT, LVM_GETISEARCHSTRING, TVM_GETISEARCHSTRING)를 NULL 매개 변수 값으로 호출하여 문자열을 검색하기 위해 메시지를 호출하기 전에 문자열의 길이를 가져올 수 있습니다.
특히 주의해야 하는 메시지는 상태 표시줄 SB_GETTIPTEXT 메시지입니다. 이 메시지는 검색할 문자열의 길이를 쿼리할 수 있는 방법을 제공하지 않습니다.
암호 사용
암호로 보호된 편집 컨트롤(ES_PASSWORD 스타일)을 사용하는 경우, 검색된 텍스트를 포함하는 버퍼를 가능한 한 빨리 0으로 설정하여 메모리에 사용자의 암호가 노출되지 않도록 해야 합니다.
보안 경고
다음 표에는 잘못 사용되는 경우 애플리케이션의 보안을 손상시킬 수 있는 기능이 나열되어 있습니다. 여기에 나열된 메시지는 버퍼 크기를 지정하는 매개 변수를 제공하지 않습니다.
기능 | 완화 방법 |
---|---|
DlgDirListComboBox | 함수에서 사용하는 버퍼를 쓸 수 있고 null로 종료되었는지 확인합니다. |
CB_GETLBTEXT | CB_GETLBTEXTLEN을 호출해 버퍼 크기를 가져온 다음 CB_GETLBTEXT를 호출하여 문자열을 검색합니다. |
LVM_GETISEARCHSTRING | NULL 매개 변수 값으로 메시지를 호출해 버퍼 크기를 가져온 다음 메시지를 다시 호출하여 문자열을 검색합니다. |
SB_GETTEXT | SB_GETTEXTLENGTH를 호출해 버퍼 크기를 가져온 다음 SB_GETTEXT를 호출하여 문자열을 검색합니다. |
TB_GETBUTTONTEXT | NULL 매개 변수 값으로 메시지를 호출해 버퍼 크기를 가져온 다음 메시지를 다시 호출하여 문자열을 검색합니다. |
TTM_GETTEXT | 이 메시지는 버퍼 크기를 알거나 지정할 수 있는 방법을 제공하지 않습니다. |
TVM_GETISEARCHSTRING | NULL 매개 변수 값을 전달하여 메시지를 호출해 버퍼 크기를 가져온 다음 메시지를 다시 호출하여 문자열을 검색합니다. |
관련 항목