버퍼 오버런
버퍼 오버런이 오래 전부터이 낮은 - 수준 언어로 인식하는 데 문제가있습니다. 의 핵심 문제는 사용자 데이터 및 프로그램 흐름 제어 정보가 intermingle 위해서는 성능, 그리고 저 - 수준 언어 응용 프로그램을 메모리에 대한 직접 액세스가 허용됩니다. c와 c + +은이 두 장 인기있는 언어로 afflicted와 버퍼 오버런. 엄격히 말해서,의 버퍼 오버런이 발생하는 경우 프로그램을 통해 입력을 작성 이후의 끝 부분에 할당된 버퍼지만 연관된 문제에 대한 여러가 지가 종종이 같은 효과가있습니다. 중가 장 흥미가 형식 문자열 버그입니다. 또 다른 윤회의 문제가 발생하면 공격자가 허용하는 임의의 메모리 위치를 작성시 외부의 배열의 응용 프로그램, 그리고 있지만, 엄격히 말해서,이 아닙니다 클래식 버퍼 오버런을 드리겠습니다 표지가 여기에 너무합니다. 이 효과는 버퍼 오버런은 아무것에서 충돌을 얻고있다는 공격자가 응용 프로그램을 완벽하게 관리하고 응용 프로그램을 실행중인 경우로서 하이 - 레벨 사용자 (루트, 관리자 또는 로컬 시스템), 그 다음의 제어는 전체 운영 체제 및 기타 다른 사용자는 현재 로그온, 또는이 로그온하고있다는 공격자가 직접합니다. 경우에 응용 프로그램에서 문제가 네트워크 서비스, 웜의 결과에 결함이 발생할 수있습니다. 의 첫 번째 잘 - 알려진 인터넷 웜 착취의 버퍼 오버런의 손 서버 및했습니다으로 알려진 로버트 t. 모리스 (또는 그냥 모리스) 손 웜. 비록 드리고있는 것이라고 배운 것처럼 보인다 버퍼 오버런 때문에 발생하지 않도록하는 방법을 하나의 거의 이끌어 내려가 인터넷은 1988 년, 우리가 계속해서 나타나는 잦은 리포트의 버퍼 오버런은 여러 종류의 소프트웨어가있습니다. 하나의 수도 있지만 생각하는 유일한 홍기, 부주 의한 프로그래머가 떨어질 먹이를 버퍼 오버런, 그 문제는 복잡한, 대부분의 솔루션은 단순한, 그리고 모든 사람이 서면 충분한 c / c + + 코드는 거의 확실히 사항이 실수를합니다. 심지어 아주 좋은, 매우 신중 프로그래머를 실수, 그리고 매우 우수 프로그래머를 아는 것이 얼마나 쉬운가 쪽지를 설치 및 배치 고체 테스트 관행에 장소를 잡아 오류입니다. 영향을받은 언어c가가 장 일반적인 언어를 사용하여 작성 버퍼 오버런을 면밀히 많았고 c + +. 을 쉽게 만드실 버퍼 오버런으로 어셈블러를 쓸 때 주어진 찾기 안전 장치가 전혀 없다. 비록 c + +은 본질적으로 위험으로 c, c의 상위 집합이기 때문에, 사용하는 표준 템플릿 라이브러리 (상태)과 보육의 잠재력을 그르치는 문자열을 크게 줄일 수있습니다. 이 증가 엄격는 c + + 컴파일러 프로그래머 피하는 데 도움이 될 것입 일부 실수를합니다. 우리의 조언이가도를 작성하는 경우에는 순수한 c 코드를 사용하여 c + + 컴파일러는 결과의 청소기 코드가있습니다. 보다 최근 발명 높은 - 수준 언어로 추상 직접 메모리 액세스 프로파일에서 프로그래머, 일반적으로 한 실질적인 성능 비용입니다. 언어와 같은 자바, c # 및 시각 기본이 네이티브 문자열 형식, 경계 - 위탁 배열, 그리고 일반적으로 금지 직접 메모리 액세스합니다. 하지만 이렇게하면 버퍼 오버런 불 일부라고하는 것이 더 정확하게 말씀하는 버퍼 오버런이 훨씬 적게합니다. 현실에서, 대부분의 이러한 언어가 구현되어 c / c + + 및 구현을 흠집 결과의 버퍼 오버런 수있습니다. 또 다른 잠재적인 소스의 버퍼 오버런으로 높게 - 레벨 코드가 존재하기 때문에 코드를해야 궁극적으로 인터페이스가있는 운영 시스템 및 그 운영 체제가 거의 확실히 작성된 c / c + +. c #을 사용하여 안전하지 않은 섹션을 수행없이는 그물에 의해 선언; 그러나,보다 쉽게 상호 운용을 제공하고있는 반면 기본 운영 체제와 도서관 작성된 c / c + +, 작업을 수행할 수있습니다가 같은 실수를 할 수있습니다에서 c / c + + . 주로 프로그램의 경우 더 높은 - 수준 언어로의 기본 액션 항목에 대한 귀하가 전달되는 데이터의 유효성을 계속하려면 외부 도서관, 또는 conduit을 자신의 결점 역할을 할 수있습니다. 비록 완전한 목록을 제공하지 않을 저희의 영향을받은 언어,가 장 오래된 언어가 취약하여 버퍼 오버런 죄를 해명클래식 윤회의 버퍼 오버런으로 통한다 "smashing의 스택입니다." 로 컴파일된 프로그램으로 스택을 사용하여 대기 제어 정보와 같은 인수, 여기서는 응용 프로그램이 필요로 돌아가있는 기능을하기 때문에이 완료되면 의 소수의 레지스터에서 사용할 수있습니다? 프로세서, 꽤 자주 레지스터를 얻을 스택의가 일시적으로 저장됩니다. 불행히도, 지역 할당되는 변수는 또한 스택에 저장됩니다. 이러한 스택 변수는 때로는 부정확라고합니다 정적으로 할당되고, 이와 반대로되고 힙 메모리를 동적으로 할당합니다. 사람이 대화 내용을 듣는 경우는 정적 버퍼 오버런, 무엇이 진짜 의미는 스택의 버퍼 오버런. 루트에 문제가있는 경우에 응용 프로그램을 작성의 경계를 넘어 스택의 배열을 할당, 공격자를 지정 컨트롤 정보를 얻을 수있습니다. 그리고 이것은 성공의 열쇠입니다; 공격자가 원하는 데이터를 수정하려면 컨트롤의 값을 자신의 입찰입니다. 하나를 요구할 이유는 우리가 같은 행동을 분명히 위험한 시스템을 계속 사용합니다. 우리가했던 기회를 탈출이 문제를 최소한의 일부로 마이 그 레이션을 인텔의 64 - 비트 64 칩, 어디에 저장됩니다 반환 주소를 등록합니다. 문제는 드리고 필요가 용납는 상당한 호환성을 상실, 그리고로이 글을 작성하고있는 x64 칩 보인다 끝 것으로 보입니다가 더 많은 인기를 칩입니다. 요구가 될 수도있습니다 그냥하지 않는 이유는 우리가 수행하는 모든 코드를 마이 그 레이션하여 엄격한 배열을 확인하고 직접 메모리 접근하지 않습니다. 문제는 많은 유형의 응용 프로그램의 성능 특성을 더 높은 - 수준 언어는 충분하지 않습니다. 하나의 중간 그라운드가 높을 - 레벨 언어를 사용하려면가 기 - 레벨 인터페이스에 대한 상호 작용하는 위험한 것들 (예 : 사용자가!) , 그리고 낮은 - 수준 언어의 핵심 코드입니다. 또 다른 솔루션은의 기능을 완벽하게 사용합니다 c + +, 및 사용 문자열을 도서관 및 컬렉션 클래스입니다. 예를 들어, '인터넷 정보 서버 (iis) 6.0 웹 서버가 전환된 전적으로 c + + 문자열 클래스에 대한 처리를 입력, 그리고 하나의 용감한 개발자 주장 패트 절단 그의 작은 손가있을 경우 자신의 코드에 버퍼 오버런을 찾을 수있습니다. 로이 글을 작성하고있는 개발자는 아직 자신의 손 및 시정 보안 게시판되었습니다은 웹 서버에 대해 발급된 거의 2 년 만에 처음으로 출시됩니다. 현대 컴파일러 거래를 잘 templatized 수업을, 그리고 그것이가능한를 쓰기가 매우 높음 - 실적 c + + 코드입니다. 충분한 이론 - 보겠습니다 예입니다 : # 포함 <stdio.h> 무효 dontdothis (문자 * 입력) strcpy (buf, 입); printf ( "%의 \ 해당", buf); int 주 (int argc, 문자 * argv []) 이제는 응용 프로그램을 컴파일 및 은에 어떤 일이 발생합니다. 이 시위의 저자 사용하는 릴리스 빌드와 디버깅 기호를 활성화하고 스택 검사를 중지합니다. 좋은 컴파일러는 또한 인라인을 함수로하려면 소규모로 dontdothis, 특히중인 경우에만 호출되면, 그래서 그는 또한 장애인 최적화합니다. 다음은 무엇을 스택과 같이 자신의 시스템을 즉시 일 이전에 전화 strcpy : 0 x0012fec0 c8가 산출 일이 공공 èþ .. <- 주소는 buf 인수 기억하는 모든의 값을 스택의가 뒤로합니다. 이 예제가에서 인텔 시스템, 어떤은 "리틀 - 엔디안." 즉,가 장 중요한 바이트의 값 온다 먼저, 그래서 메모리에 반환 주소가 표시되는 경우 "로 3f104000,"정말 주소 0x0040103f. 이제 살펴 봅시다하면 어떻게됩니까 buf을 덮어 쓰게됩니다. 의 첫 번째 컨트롤 정보를 스택이의 내용을 확장 자료 포인터 (ebp)를 등록합니다. ebp 들어있는 프레임 포인터, 그리고 끄기 -로 - 하나의 오버플로우가 발생하는 경우, ebp됩니다 잘린다. 경우에 공격자을 관리할 수있습니다 메모리를 0x0012fe00 (0 명 끄기 -로 - 하나의 마지막 바이트),이 프로그램 점프하여 해당 위치 및 실행 공격자 - 제공된 코드가있습니다. 오버런되지 않은 경우에 제약을 1 바이트, 그 다음 항목으로 이동은 반환 주소입니다. 경우에 공격자가 제어할 수있습니다이 값, 그리고 충분한 어셈블리를 게재할 수있다는 버퍼가 그들의 위치를 알고, 원하는 한 클래식 익스플로잇 버퍼 오버런. 참고로 어셈블리 코드 (흔히 알려져 쉘 코드가 있기 때문에가 장 일반적인 착취가를 호출하여 명령 셸)을하지 않아도됩니다 덮어 쓰게되는 위치에 버퍼입니다. 그것은 클래식 케이스지만 일반적으로 다음과 임의의 코드가 공격자는 다른 곳에 배치에 프로그램을 수있다. 어떤 안락을 취할 필요가 없다 생각하는 오버런이만의 작은 영역입니다. 일단 반환 주소를 덮어왔다는 공격자가 얻을 수있는 인수의 익스플로잇 함수를 재생합니다. 경우에 프로그램을 작성하여 모든는 이러한 인수를 반환하기 전에,이 기회에 대한 추가 탁한 날씨를 나타냅니다. 이 지점의 효율성을 고려할 때 매우 중요합니다 스택 변조 대책 등 크리스핀 코완의 stackguard, ibm의 propolice, 그리고 마이크로 소프트의 / gs 컴파일러 플래그입니다. 볼 수 있듯이, 우리 방금 주어진는 공격자 최소한 3 개의 방안을 제어할 우리의 응용 프로그램, 그리고 이것은 아주 간단한 기능만을합니다. 경우에 c + + 클래스를 사용하여 상 함수는 선언에 스택을가 상 함수 포인터 표를 사용할 수 있으며이 쉽게 리드를 악용한다. 만약 하나의 인수를 함수가됩니까가 될 함수 포인터, 어떤은 아주 일반적인 어떤 windowing 시스템 (예를 들어, x 윈도우 시스템이나 microsoft 윈도즈), 다음을 덮어의 기능 포인터가 이전에 사용이 명백한 방법을 빼돌리려 제어 의 응용 프로그램입니다. 많은, 많은 더 많은 재치있는 방안을 점유를 제어하는 응용 프로그램이 존재한다고 생각할 수있습니다보다 우리의 몸도 두뇌입니다. 불균형이있는 우리의 능력으로 개발자와 능력과 자원의 공격자입니다. 무한 규모의 시간이 허용되지 않는 경우 귀하의 응용 프로그램을 작성하지만, 공격자들이 무엇을 필요로하지 않을 수있습니다 양성할 여분의 시간이 아닌 자신의 코드를 파악하는 방법을 만들어 자신이 원하는 일을합니다. 귀하의 코드에는 자산을 보호하는의 소중한 정도로 정당화 개월의 노력을 끌어들인다 귀하의 응용 프로그램입니다. 공격자 지출이 큰 거래를하는 시간 학습에 대한 최신 개발을 일으키는 탁한 날씨, 그리고이 자원 www.metasploit.com 여기서 그들이 볼 수 지점과 같이 그들의 방법을 쉘 코드를 클릭하십시오 거의 아무것도 자신이 원하는 작업을 수행하는 동안 운영 이내에 제약 문자 집합입니다. 무언이 악용될 수 있는지 여부를 확인하려고하면, 그것을 얻을 수있는가 능성이 높은 것으로 잘못입니다. 대부분의 경우, 그것은 어떤 것이있는가 능성을 입증하는 하나 익스플로잇 또는 스마트가 충분하지 않은 경우 (또는 아마도 충분한 시간을 소비하지 않은)을 결정하는 방법을 작성하는 악용합니다. 그것은 극히 드문을 입증할 수있는 자신감을 전혀 할 수있는 오버런이 악용될 수없습니다. 포인트는이 작전은 스마트 좋은 방법은 바로 해결하는 버그! 그동안 여러 번하는 "코드 품질 향상"이 나타났다가 보안 수정 프로그램의 retrospect. 이 작성자를 그냥 들여보다 3 시간 말다툼으로 개발 팀에 대한 버그를 수정해야하는지 판단합니다. 가 이메일 - 메일 나사는 총 8 명이이되어 있고, 그리고 우리를 쉽게 들여 20 시간 (절반을 한 사람 - 주) 토론 여부를 문제를 해결하거나하지 않기 때문에 개발 팀에 싶었다 증거가있는 코드는 악용될 수있습니다. 보안 전문가 입증되면 버그는 진짜가 문제를 해결했습니다 추산 1 시간의 개발자가 시간과 몇 시간의 테스트 시간입니다. 놀라운 낭비되는 시간이입니다. 한 시간이 언제가 할 수 분석력이 바로 이전에 배송하는 응용 프로그램입니다. 는 응용 프로그램이 최종 단계에있는 경우,하고자하는 못할 수 있도록하는 좋은 추측에 문제가 악용될 수 있는지 여부를 정당화의 위험은 회귀 및 노선은 제품입니다. 그것은 일반적인 오해가 오버런으로 힙 버퍼가 스택 오버런에 비해 덜 악용될 수 있지만,이 나타났다되지 않을 것으로이 사건입니다. 대부분의 힙 구현에 시달리는가 같은 기본적인 결함으로 스택 -는 사용자 데이터와 컨트롤 데이터는 intermingle. 의 구현에 따라 메모리 할당자, 그것은 종종를 얻을 수있습니다 힙 관리자를 4 바이트의 공격자가 원하는 장소로의 위치를 지정하여 공격자입니다. 를 공격하는 방법에 대한 세부 사항을 힙은 다소 복잡한. 이 최근의를 명확하게 작성된 프레 젠 테이션의 주제, "안정적인 windows 힙 악용"으로 마 "shok"conover & oded horovitz,에서 찾을 수있습니다 http://cansecwest.com/ csw04/csw04-oded + connover.ppt. 심지어 경우에 힙 관리자가 될 수없습니다 subverted 이렇게 공격자의 입찰을의 데이터를 옆 할당에 포함될 수있습니다 함수 포인터, 또는 포인터는 정보를 기록하는 데 사용됩니다. 한 번에, 악용 힙 오버플로우는 고려 이국 풍과 하드 - 힙 오버플로우는 이제 몇가 더 자주 유형의 착취 오류가있습니다. 죄 c / c + + 이 많습니다, 많은 방법을 오버런의 버퍼에 c / c + +. 다음은 무엇을 초래했던 모리스 손 웜 : 문자 buf [20]; 확보 (buf); 거기는 절대 없음을 확보를 읽을 입력에서 표준 입력 방법을 사용하지 않고 위험 부담 an 오버플로우의 버퍼 - 사용 결과를 대신합니다. 아마도 제 2 장 인기있는 방법을 오버플로우 버퍼가를 사용하려면 strcpy (이전 예제를 참조하십시오). 이것이 또 다른 방식으로 인해 문제 : 문자 buf [20]; strcpy (buf, 픽스); 문자 buf [max_path]; sprintf (buf, "%의 - % 개발 \ 해당", 경로, errno); 것이 거의 불을 제외 몇 코너의 경우, sprintf를 안전하게 사용하도록합니다. 중요 보안 게시판 문서 windows 출시된 sprintf 이전에 사용하기 때문에 디버그 로깅 기능을합니다. 참조하여 게시판 ms04 - 011에 대한 더 많은 정보 (참조 링크에서 "다른 리소스"섹션)입니다. 이곳의 또 다른 좋아하는 : 문자 buf [32]; 또 다른 방법으로 인해 문제는 잘못 문자에 대한 바이트 수를 계산합니다. 스키 문자를 다루는 경우, 이들은 동일하지만, 유니 코드를 다루는 경우에는 2 바이트로 한 문자입니다. 이곳의 예입니다 : _ snwprintf (wbuf, sizeof (wbuf), "%의 \ 해당", 입력); bool copystructs (입력 * pinfile, 서명되지 않은 긴 계산) m_pstructs = 새 structs [총계]; 에 대한 (1 = 0; 나는 <카운트; 저는 + +) ptr = malloc (sizeof (타입) * 카운트); 또 다른 방법은 다음과 같습니다의 버퍼 오버런를 얻을 수있습니다 만들어집니다 : # 정의 max_buf 256 len = strlen (입력); / / 물론 우리가 안전하게 사용할 수있습니다 strcpy const size_t max_buf = 256; len = strlen (입력); / / 물론 우리가 안전하게 사용할 수있습니다 strcpy 관련 죄 하나의 밀접한 관련 죄가 정수 오버플로우입니다. 버퍼 오버런을 완화해야 할 경우를 선택 계산 문자열 처리를 호출을 사용하여, 또는하십니다을 확인하려면 많은 공간을 할당하는 방법에 힙를 산술해진다 비판을 안전의 응용 프로그램을. 형식 문자열 버그가 동일한 효과를 달성하는 데 사용할 수있습니다으로 버퍼 오버런하지만, 정말 오버런되지 않습니다. 정상적으로 수행할 수있는 형식 문자열 버그가 오버런 어떠한 버퍼를 전혀하지 않고있습니다. 변종에 버퍼 오버런은 833326 쓰기를 배열합니다. 경우에 공격자가 색인의 배열을 공급하고 유효성을 올바르게 검사하지 않습니다이 올바른 범위 내에 있는지 여부 그것의 배열의 한 타겟이 쓸 수있는 메모리의 위치를 공격자의 선택이 수행됩니다. 것뿐만 아니라 모두가 같은 전환의 프로그램 흐름을 일이 아니라는 공격자가 중단되지 않을 수있습니다 인접한 메모리, 어떤 곤란 어떠한 대책을 시행해야 할 수도있습니다 상대로 버퍼 오버런. spotting 죄를 패턴다음은 구성 요소를 찾아보십시오 :
spotting이 죄 중에 코드를 검토 대상에서 범위가 매우 어려운 매우 편리합니다. 쉬운 물건을 찾는가 사용량의 안전하지 않은 문자열 처리 기능이있습니다. 하나의 문제가 알고있는 것은 대부분의 인스턴스를 찾을 수있습니다 안전 사용법 있지만, 사용자의 총 우리의 경험이있다는 문제가 숨어들 사이에서 올바른 호출합니다. 변환 코드를 사용만을 안전한 통화가 매우 낮은 회귀 속도 (어디서나에서 10로 100의 정상적인 버그 - 수정 프로그램을 회귀 율), 그리고 그것을 악용에서 해당 코드가 제거됩니다. 하나의 좋은 방법은 알려 이렇게 위험한 함수 호출을위한 컴파일러를 찾을 수있습니다. 정의되지 않은 경우 strcpy, strcat, sprintf, 및 이와 유사한 기능을 컴파일러는 그들에 대해 모두 찾을 수있습니다. 에 문제가 알고있는가하는 일부 애플 리케이션이 다시 - 구현된 모든이나 부분을 c 실행 - 시간을 도서관 내부입니다. 좀 더 어려운 과제는 힙 오버런을 찾고있습니다. 기본적으로하고자하는 첫 번째 모양에 대한 할당을 누른 다음 산술을 검사합니다 버퍼 크기를 계산하는 데 사용됩니다. 에 대한 전체적인 최상의 방법은 사용자 입력의 진입 점을 추적은 귀하의 응용 프로그램을 통해 모든이 함수를 호출합니다. 무엇을 알고되고 공격자 조절에 큰 차이를 만든다 테스트 기술을 찾으려면 죄를fuzz 테스트, 어떤 과목을 귀하의 응용 프로그램을 반기 - 임의의 입력,이 중 하나가 더 나은 테스트 기술을 사용합니다. 입력 문자열의 길이를 늘려보십시오 반면 응용 프로그램의 동작을 관찰합니다. 뭔가를 찾아보십시오 간의 불일치에 대한 것은 때때로 입력을 체크하면 비교적 작은 창문도 취약 코드가있습니다. 예를 들면, 어떤 사람이 한 장소에서 수표를 넣을 수도있습니다 미만이어야합니다 260 문자의 입력하고 다음을 할당을 256 바이트의 버퍼입니다. 테스트를하는 경우에 매우 긴 입력, 그것이됩니다 거부하지만, 키보드의 경우 오버플로 정확하게 찾을 수 악용할 수있습니다. 길이는 2 개 및 배수로의 배수는 두 개의 플러스 또는 마이너스 하나는 종종 문제를 찾을 수있습니다. 다른 트릭을 시도 찾고 어떤 위치에 입력을 어디에 길이가 뭔가 사용자가 지정한. 변화의 길이가 일치하지 않도록의 길이를 문자열, 그리고 특히 모양에 대한 정수 오버플로우가 능성 - 조건이 어디에 길이 + 1 = 0은 종종 위험하다. 당신이해야 할 때 fuzz 테스트가를 만들려면 전문적인 테스트를 구축합니다. 디버그 빌드 자주있는 주장을 변경 프로그램 흐름과됩니다 타격 익스플로잇 조건에서 할 수있습니다. 반면 디버그 빌드에 현대 컴파일러는 일반적보다 고급 스택 손상 탐지가 포함됩니다. 에 따라 힙 및 운영 체제, 또한 더 엄격한 힙 손상 검사를 활성화합니다. 하나를 변경할 수 있도록 할 수있습니다에 코드는 주장이 검사를하는 경우 사용자가 입력, 변경 사항은 다음 주소 주장 (len <max_path); 을 만약 (len> = max_path) 언제든지 테스트를 귀하의 코드를 아래에 몇가 지 형태의 메모리 오류를 검색 도구와 같은 appverifier에 windows 들어 죄다음과 같은 항목, 어떤 오지에서 직접 일반적인 취약점과 취약성 목록, 또는 5467 (http://cve.mitre.org),이 사례는 버퍼 오버런. 흥미로운 비트의 퀴즈가로이 글을 작성하고 1734 5467 항목이 일치 "버퍼 오버런"가 존재합니다. 이 검색의 cert 권고하고있는 문서만을가 더욱 확산과 심각한 취약점을하면 결과는 107 명중에서 "버퍼 오버런입니다." 5467 - 1999에서 0042 사이부터 5467 설명 : "버퍼 오버플로의 대학의 워싱턴의 이행의입니까과 팝 서버입니다." 이 5467 항목이 철저하게 설명되어있습니다 cert 자문, 캘리포니아 - 1,997에서 09 사이, 그리고 개입의 버퍼 오버런으로의 인증 시퀀스의 대학의 워싱턴의 우체국 프로토콜 (팝) 및 인터넷 메시지 액세스 프로토콜 (입니까) 서버입니다. 관련 취약점이 있었다 - 메일 서버는 이메일을 구현하지 못했습니다 최소 특권, 그리고 루트 액세스 권한을 공격자 악용을 부여합니다. 오버플 주도로 널리 착취의 취약한 시스템입니다. 네트워크 보안 문제를 점검하기 위해 설계 취약한 버전은이 서버를 찾을 수 없음 유사한 결함들은 시애틀 랩 slmail 2.5으로 보도에서 www.winnetmag.com/article/articleid/9223/9223.html. 5467 - 2000에서 0389 사이 - 5467 - 2000에서 0392 사이주소 5467 - 2000에서 0389 사이 : "버퍼 오버플에서 krb_rd_req 기능은 kerberos 4, 5를 사용하면 원격 공격자가 루트 권한을 얻을 수있습니다." 주소 5467 - 2000에서 0390 사이 : "버퍼 오버플에서 krb425_conv_principal 기능은 kerberos 5를 사용하면 원격 공격자가 루트 권한을 얻을 수있습니다." 주소 5467 - 2000에서 0391 사이 : "버퍼 오버플에서 krshd의 kerberos 5를 사용하면 원격 공격자가 루트 권한을 얻을 수있습니다." 주소 5467 - 2000에서 0392 사이 : "버퍼 오버플로의 지하철에서 kerberos 5를 사용하면 로컬 사용자가 루트 권한을 얻을 수있습니다." 이러한 일련의 문제에 대한 설명은대로 mit 이행의 kerberos cert 자문, 캘리포니아 - 2000 - 06, 페이지에서 볼 www.cert.org/advisories/ca-2000-06.html. 하지만 소스 코드를 사용할 수 있었다를 일반인에 대한 몇 년 동안, 그리고 문제의 줄기에서 사용하는 위험한 문자열 처리 함수 (strcat), 그것에 불과 보도에서 2000. 5467 - 2002에서 0842 사이, 5467 - 2003에서 0095 사이, 수 - 2003에서 0096 사이
이러한 취약점에 설명되어 cert 자문, 캘리포니아 - 2,003에서 05 사이를 위치한 www.cert.org/advisories/ca-2003-05.html. 의 문제는 한 세트의 여러 발견하여 데이비드 리치 필드와 그의 팀은 차세대 보안 소프트웨어 회사는 별도,이 입증되는 광고가 하나의 응용 프로그램을 "철밥통"않을 수있습니다면서 선생님 리치 필드가 장 좋은 방법은 귀하의 응용 프로그램을 조사하고있습니다. 수 - 2003에서 0352 사이
이 오버플로우가 흥미를 널리 착취에 의해 주도되기 때문에 두 개의 매우 파괴적인 웜이 모두 인해 상당한 차질이 인터넷에있습니다. 오버플 이전에 힙, 그리고 이전에 의해 지켜진다는 사실이었다능한를 작성하는 웜는 매우 안정합니다. a 기여 계수는 오류의 원칙을 최소 특권 :의 인터페이스는 안되었습니다 익명 사용자가 사용할 수있습니다. 또 다른 흥미로운 참고 사항이 오버플로우 대책에 windows 2003 저하의 공격으로부터 에스 컬 레이션의 특권으로 서비스 거부합니다. 이 문제에 관한 더 자세한 정보에서 찾을 수있습니다 www.cert.org/advisories/, 캘리포니아 - 2003 - 23.html, 그리고 www.microsoft.com/technet/security/bulletin/ms03-039.asp 상환 단계는 도로를 버퍼 오버런 상환이 길고 충만 미끄럼입니다. 우리가 논의를 방지하는 데 도움이되는 다양한 기법의 버퍼 오버런, 그리고 다른 많은 손상을 줄일 수있는 기술의 버퍼 오버런을 일으킬 수있습니다. 살펴 봅시다 귀하의 코드를 어떻게 향상시킬 수있습니다. 교체 위험한 문자열 처리 함수해야, 최소, 교체 안전하지 않은 함수가 같은 strcpy, strcat, sprintf으로 계산 버전은 각각의 이러한 기능을합니다. 가있는 경우의 수를 선택 옵션 그들과 함께 무엇을 교체합니다. 유념 나이가 계산 기능이있는 인터페이스 문제, 그리고 많은 경우에 질문을하지 산술 매개 변수를 결정합니다. 컴퓨터가 아니라 좋은에서 수학과 희망을하실 수있습니다. 최신 라이브러리처럼 strsafe, 안전 crt (c 실행 - 타임 라이브러리)가 될 배송에서 시각 스튜디오 (그리고이 한 패스트 트랙이 될 부분을 ansi c / c + + 표준), 그리고 strlcat / strlcpy에 대해 * 계열입니다. 또한 각각의 필요가 돌볼과 함께 이러한 기능을 처리하는 방법 문자열의 해지 및 잘라내기합니다. 일부 기능을 보장 널 해지지만 대부분의 나이를 계산 기능을하지 않습니다. microsoft 사무실 그룹의 경험을 바꾸기가 안전하지 않은 문자열 처리 기능을 위해 사무실 2003 릴리스는 해당 회귀 속도 (새로운 버그 인해 1 인당 수정)이 매우 낮음, 그래서 공포의 회귀 중지할 수 있도록하지 않습니다. 감사를 할당또 다른 소스의 버퍼 오버런 산술 오류에서 나온다. 체크 루프와 배열에 액세스제 3의 방식이 제대로 점검되지 않은 버퍼 오버런이 발생합니다 터미네이션은 루프, 그리고 검사를 배열 경계 이전에 쓰기 권한이 제대로되지 않습니다. 이 중가 장 어려운 지역, 그리고 서비스를 찾을 수있습니다가, 일부의 경우,이 문제와 지구 - 탄성 - kaboom은 완전히 다른 모듈입니다. 교체 c 문자열 버퍼와 c + + 문자열이것이 바로 대체 평소보다 더 효과 c 통화, 그러나 엄청난 양의 변화에 원인이있을 수있습니다 기존의 코드, 특히 코드가없는 경우에는 이미 컴파일된로 c + +. 또한 알고 있어야하고 이해의 성능 특성의 상태 컨테이너 수업을합니다. 그것은 매우능한를 작성 하이 - 성능 상태 코드, 그러나 같은 많은 다른 측면 프로그래밍,이 실패를 읽기의 벌금 매뉴얼 (rtfm)는 종종 최적의 결과를 초래 미만입니다. 가 장 일반적인 교체가를 사용하는 빌드 표준 : : 문자열 또는 표준 : wstring 템플릿 클래스입니다. 정적 배열로 교체된다 컨테이너위에 언급된 문제의 모든 컨테이너에 적용된다 같은 벡터하지만,이 추가 문제는 아닙니다의 구현은 모든 벡터 : : 반복자 건립 확인을 벗어납니다 액세스합니다. 이번 조치 데 도움, 그리고 저자는 발견되는 상태를 사용하여 올바른 코드를 작성할 수있게 그를 위해보다 신속하게, 그러나 이것이 아니라는 점에 유의 실버 총알입니다. 사용 분석 도구도있다는 분석이 시장에서 좋은 도구 오는 c / c + + 코드에 대한 보안 결함; 예로는 coverity, prefast, 그리고 klocwork. 시각 스튜디오입니다. 그물 2005이 포함됩니다 prefast하고, 다른 도구라는 소스 코드를 해설 언어 (sal)를하는 데 도움이 추적 버퍼 오버런과 같은 보안 결함입니다. 최선의 방법을 설명하는 방식은 코드 sal입니다. 의 (silly)를 들면 다음과 같습니다되는 경우 사이의 관계를 알 수있는 데이터와 카운트 인수 : 데이터가 카운트 바이트 길이입니다. 하지만 컴파일러 모르고; 단지를보고 a 문자 *와 size_t. 무효 *시다 (문자 * 데이터, size_t 카운트) ( 이 코드는 외모 확인 (외면한 사실을 우리가 꺼리는 재방 정적 버퍼하지만, 유머가 우리를). 그러나, 만일 카운트가 더 큰 것으로 32, 그 다음의 버퍼 오버런하셨습니다. a sal 주석 버전의이라고 잡아와 버그 : 무효 *시다 (__in_ecount (수) 문자 * 데이터, size_t 카운트) ( 고려 추 방어 조치와 같은 방식의 좌석 벨트 차량에 당신이 생각합니다. 좌석 벨트는 종종 심각도에 충돌을 줄일 있지만,이 경우에도하지 않으에 들어갈 사고입니다. 하는 것이 중요합니다에 대한 참고 사항이 모든 주요 클래스의 버퍼 오버런 문제 완화, 이전에 악용될 수 익스플로잇 조건이 더 이상 존재를 전혀; 그리고 어떤 주어진 문제 완화 기법으로 충분히 복잡한 공격을 극복하는 기술을 완벽합니다. 이들 중 몇가 살펴 봅시다. Stack ProtectionStack protection was pioneered by Crispin Cowan in his Stackguard product, and was independently implemented by Microsoft as the /GS compiler switch. At its most basic, stack protection places a value known as a canary on the stack between the local variables and the return address. Newer implementations may also re-order variables for increased effectiveness. The advantage of this approach is that it is cheap, has minimal performance overhead, and has the additional benefit of making debugging stack corruption bugs easier. Another example is ProPolice, a Gnu Compiler Collection (GCC) extension created by IBM. Any current product should utilize stack protection. You should be aware that stack protection can be overcome by a variety of techniques. If a virtual function pointer table is overwritten and the function is called prior to return from the function—virtual destructors are good candidates—then the exploit will occur before stack protection can come into play. Non-executable Stack and HeapThis countermeasure offers considerable protection against an attacker, but it can have a significant application compatibility impact. Some applications legitimately compile and execute code on the fly, such as many applications written in Java and C#. It’s also important to note that if the attacker can cause your application to fall prey to a return into libc attack, where a legitimate function call is made to accomplish nefarious ends, then the execute protection on the memory page may be removed. Unfortunately, most of the hardware currently available is unable to support this option, and support varies with CPU-type, operating system, and operating system version as well. As a result, you cannot count on this protection being present in the field, but you must test with it enabled to ensure that your application is compatible with a non-executable stack and heap, by running your application on hardware that supports hardware protection, and the target operating system set to use the protection. For example, if you are targeting Windows XP, then make sure you run all your tests on a Windows XP SP2 computer using an AMD Athlon 64 FX processor. On Windows, this technology is called Data Execution Protection (DEP); it was once known as No eXecute (NX). Windows Server 2003 SP1 also supports this capability. PaX for Linux and OpenBSD also support non-executable memory Other Resources
this is an article added by Hendra Fang
|
|||
|