형식 문자열 문제
형식 문자열 문제는 하나의 몇가 진정 새로운 공격을 표면을 최근 몇 년간입니다. 하나의 첫 언급은 형식 문자열 버그 년 6 월 23 일, 2000,에 게시하여 lamagra argamal (www.securityfocus.com/archive/1/66842); 파스칼 bouchareine 더 명확하게 설명하기 거의 한 달 뒤 (www.securityfocus . com/archive/1/70552)입니다. 이전 게시물 마크 slemko (www.securityfocus.com/archive/1/10383)를 기록한의 기본은이 문제를했지만 놓칠 수있는 능력의 형식 문자열 버그를 작성 메모리입니다. 와 같이 많은 보안 문제, 근본 원인은 형식 문자열 버그는 스팅 사용자 - 제공된 입력을하지 않고 유효성 검사를합니다. 에서 c / c + +, 형식 문자열 버그를 기록하는 데 사용할 수있습니다 임의의 메모리 위치, 그리고가 장 위험한 측면이없이는이 발생할 수있습니다 변조와 옆 메모리 블록입니다. 이 벌금 - 아주 기능을 사용하면 공격자가 우회 스택을 보호, 그리고 심지어 매우 작은 부분의 메모리를 수정합니다. 에 문제가 발생할 수도있습니다 형식 문자열은 읽기에서 신뢰할 수없는 위치는 공격자를 제어합니다. 이 후자의 측면에서 문제의 경향이 더 만연에 유닉스와 리눅스 시스템입니다. 에 대한 windows 시스템, 응용 프로그램이 문자열을 테이블은 일반적으로 보관 내에있는 프로그램 실행, 또는 리소스를 동적 링크 라이브러리 (dll)입니다. 만약 공격자 다시 작성할 수있습니다 메인 실행 파일이나 해당 리소스 dll, 공격자가 공격을 수행할 수있습니다 것보다 더 많은 것을 간단합니다 형식 문자열 버그입니다. 조차하지 않는 경우를 다루는 c / c + +, 형식 문자열 공격에 상당한 문제로 이어질 수있습니다. 에서가 장 분명한 것은 사용자는 오도 수 있지만, 아래에 몇가 지 조건, 공격자도 출시 크로스 - 사이트 스크립팅 또는 sql 주입 공격을합니다. 이러한하는 데 사용할 수있습니다 손상이나 변형 데이터도합니다. 영향을받은 언어에서가 장 강력하게 영향을받은 언어는 c / c + +. 공격이 성공하려면 임의의 코드 실행으로 이어질 수있습니다 즉시, 그리고을 정보 공개합니다. 다른 언어는 일반적으로 임의의 코드 실행을 허용하지만, 다른 유형의 공격이 나타날 수 있듯 이전 참고 사항입니다. 펄되지 않은 직접 취약하여 사용자 입력에 의해 주어진 지정되고 있지만, 취약한 경우에는 형식 문자열은 읽을 수있다에서 데이터를 조작합니다. 죄를 해명서식이 데이터에 대한 표시 또는 스토리지 다소 어려운 작업이 될 수있습니다. 따라서, 대부분의 컴퓨터 언어에는 루틴을 쉽게 다시 포맷 데이터입니다. 대부분의 언어로의 서식 정보는 일종의 사용 설명하는 문자열이라 불리우는 형식 문자열입니다. 정의의 형식 문자열이 실제로 사용하는 언어를 사용하여 제한된 데이터 처리의 설계를 쉽게 설명하기 위해 출력되는 형식입니다. 그러나 많은 개발자하기 쉬운 실수 - 그들의 데이터를 신뢰할 수없는 사용자는 형식 문자열을 사용합니다. 그 결과, 공격자 문자열의 데이터를 처리하는 언어를 쓸 수있습니다 많은 문제를 발생합니다. 의 디자인에 c / c + +이 이것을 특히 위험한 : c / c + + 님의 디자인을 만드는 것이 힘들을 감지할 형식 문자열 문제, 및 형식 문자열을 포함 일부 특별히 위험한 명령 (특히 % 해당)이 존재하지 않습니다에서 일부 기타 언어 '형식으로 문자열 언어입니다. 에서 c / c + +,라는 함수를 취할 수있습니다 선언하는 변수에 의해 인수 개수 지정하는 줄임표 (…)로 지난해 (또는 전용)를 인수합니다. 문제는 함수 호출되고이없는 방법을 알고 그냥 통과 얼마나 많은 인수되고있다 인치의가 장 일반적인 일련의 기능을 수행할 변수 길이 인수는 printf가 족 : printf, sprintf, snprintf, fprintf, vprintf 등 일. 와이드 문자 기능과 동일한 기능을 수행하는이 같은 문제가있습니다. 합시다을 확인 한 일러스트 레이션 : # 포함 <stdio.h> int 주 (int argc, 문자 * argv []) 반환 0; 비교적 간단한 재료입니다. 지금 무엇을 할 수 서가 잘못 살펴 봅시다. 프로그래머는 기대에 사용자를 입력 무언 양성과 같은 여러분, 안녕하세요. 한 번 사용해 보시기 바랍니다 경우를 확인할 돌아 여러분, 안녕하세요. 이제 변화는 입력 조금 - 시도 % x % ⅹ xp에서가 시스템을 사용하여 기본 명령 라인 (cmd.exe), 이제 다음과 같은 얻기 : 이메일 : \ 사업 \ 19_sins \ format_bug> format_bug.exe "% x % x" 참고 사항이 서로 다른 운영 체제를 실행하고있는 경우, 또는 다른 명령을 사용하고있다 통역, 일부 변경 사항을 얻을 수 있도록해야 할 수있습니다이 정확한 문자열을 연방 준비 은행에 귀하의 프로그램, 그리고 그 결과가 능성이 다르다. 에 대한 편리한 사용을 할 수 넣습 인수로 쉘 스크립트 또는 배치 파일이있습니다. 어떻게 된 것입니까? 가 printf 함수를 차지했다는 입력 문자열을 일으킨 그것을 기대하기는 두 개의 인수를 추진해 방면 스택 이전에 호출하는 기능입니다. 이 % x 지정 활성화를 읽을 수있습니다 스택, 4 바이트를 한번에로까지하고자합니다. 하드를 상상하는 것은 아니다는 더 복잡한 기능을하는 경우 저장된은 비밀로 더미 변수를 공격자 다음의 비밀을 읽을 수있습니다. 출력은 여기에 주소의 스택 위치 (0x12ffc0), 다음에 코드가 위치에있는 주 () 함수는 돌아으로합니다. 상상할 수 있듯이,이 두가 매우 중요한 지 정보가 유출되는 공격자에게있습니다. 이제는 궁금해하실 수있습니다 단지 침입자가 어떻게 메모리를 사용하는 형식으로 문자열 버그를 작성합니다. 중 하나 이상을 사용 형식 지정은 % 해당하고있는 문자의 수를 쓰고있는 했어야 서면 그동안의 변수에 주소를 제공한으로 대응하는 인수입니다. 다음과 같은 방법을 사용해야합니다 : 서명되지 않은 int 바이트; 이 출력은 : 이메일 : \ 사업 \ 19_sins \ format_bug> format_bug2.exe "일부 임의의 입력을" 일부 무작위 입력 귀하의 입력을 이전 17 자 에있는 플랫폼을 사용하여 4 - 바이트 정수를 % 해당 지정자는 4 바이트를 한꺼번에 작성하고 % hn은 2 바이트를 작성합니다. 지금 공격자 번만를 파악하고자하는 방법을 얻을 주소가 그들의 적절한 위치에서 스택, 그리고 약간의 필드 너비를 지정 전까지는 수의 바이트로 작성이 무엇을하고자한다. 지금은 그냥 정해 봅시다을 허용하는 경우 공격자을 제어하는 형식을 문자열로 c / c + + 프로그램, 그것은 시간 문제 파악하기 전에 자신의 코드를 실행하는 방법을 만들 수있습니다. an 특히 싸 측면에서 이러한 유형의 공격은 실행하기 전에는 공격을 할 수 프로브의 스택과 올바른는 공격을 비행합니다. 실제로, 저자는 입증이 공격에서 처음으로 공개, 그는 패트보다 사용이 다른 명령행 인터프리터를 만드는 데 사용 시위, 그리고 그것이 작동하지 않았다. 고유의 유연성은이 공격으로 인해, 이는 문제를 해결하고 악용할 수있는 예제 응용 프로그램을 사용하여 고객을 지켜보고있습니다. 대부분의 다른 언어를 지원하지 않습니다 동급의 % 해당 형식 지정자, 그리고 그들이 직접하지 않습니다 취약하여 쉽게 실행은 공격자 - 제공된 코드를 실행할 수 있지만 여전히에 문제가있습니다. 지 다른, 더 복잡한 변종이 공격에 취약할 수있는 다른 언어가있습니다. 만약 공격자 지정할 수있는 형식으로 문자열에 대한 출력을 로그 파일이나 데이터베이스, 그들이 잘못되거나 오해를 불러일으킬 로그에 원인이있을 수있습니다. 또한,이 응용 프로그램을 읽는 이들이 로그를보십시오 신뢰할 입력, 한 번 본 성모 승천이 위반, 약점에있는 응용 프로그램의 파서는 임의의 코드 실행으로 이어질 수있습니다. 제어 문자를 포함하는 관련 문제는 로그 파일 - backspaces하는 데 사용할 수있습니다 지우 지; 줄 끝 수 없게되거나 심지어는 공격자의 흔적을 제거합니다. 이것은 이동하지 않고 있다며, 그러나 만약 공격자의 형식 문자열을 지정할 수있습니다 연방 준비 은행을 scanf 또는 유사한 기능, 재난은 방식입니다. 죄 c / c + +와는 달리 많은 다른 결점 드리겠습니다 살펴보고,이 중 하나를 현물로 코드 결함은 매우 간단합니다. 아주 간단합니다 : printf (user_input); printf ( "%의", user_input); 하나의 변종에 문제가 많은 프로그래머를 방치하는 것은 충분하지 않습니다 올바르게 번만 이렇게합니다. 이되는 여러가 지 일반적인 코드를 구성 어디를 사용할 수있습니다 sprintf를 삽입하는 형식의 문자열로 버퍼를 차례 쪽지를 설치하고이를 : fprintf (stdout, err_msg); 관련 죄하지만 대부분의 명백한 공격은 관계가 코드 결함, 이것은 일반적인 사례를 넣는 응용 프로그램이 문자열은 외부 파일에 대한 국제화를 목적으로합니다. 귀하의 응용 프로그램이 실패하는 경우가 죄를 지은하여 파일을 적절히 보호하기 위해 다음, 공격자는 공급 형식 문자열이 있기 때문에 적절한 파일 액세스 권한이 부족합니다. 또 다른 관련 죄가 실패를 제대로 유효성을 사용자 입력합니다. 일부 시스템에서는 환경 변수를 지정합니다 로케일 정보 및 해당 로케일,에서 차례를 결정합니다 언어 - 특정 파일이있는 디렉토리를 찾을 수있습니다. 일부 시스템에서는 공격자가 응용 프로그램을 찾을 수 있으니까 원인은 임의의 디렉토리입니다. spotting 죄를 패턴어떤 응용 프로그램이 걸린다 사용자가 입력 및 패스가하여 서식이 함수는 잠재적 위험에 노출됩니다. 하나의 매우 일반적인 인스턴스와 함께이 죄의 문제가 발생하는 응용 프로그램이 로그를 사용자 입력합니다. 또한, 일부 기능을 구현할 수있습니다 서식 내부입니다. spotting 죄를 코드를 검토하는 동안에서 c / c + +, 모양에 대한 함수의 printf 족입니다. 문제점을 찾는가 printf (user_input); 하는 함수가 나타나는 경우는 다음과 같습니다 : fprintf (stdout, msg_format, arg1, arg2); 그런 다음 위치를 확인하기 위해 필요합니다 문자열을 참조하는 msg_format가 저장하고 보호를 얼마나 잘이다. 거기에는 많은 다른 시스템 호출과 api는 또 취약 - 시스템 로그는 한 예입니다. 언제든지 볼 수있는 함수 정의가 포함되어…의 인수 목록, 귀하가보고있는가가 문제가 될가 능성이있습니다. 많은 소스 코드를 스캐너, 심지어 생쥐처럼 lexical 그들과 flawfinder를 검색할 수있습니다 해당합니다. 거기의조차 pscan (www.striker.ottawa.on.ca/ ~ 올란도 / pscan /)이던 위해 특별히 고안된이있습니다. 6 도구도있다 컴파일 처리할 수있는가 내장되어있습니다. 예를 들어, 거기의 크리스핀 코완의 formatguard : http://lists.nas.nasa.gov/archives/ext/linux-security-audit/2001/05/msg00030.html 테스트 기술을 찾으려면 죄를패스 서식 지정을 신청하고 16 진수 값가 반환되는지 확인합니다. 예를 들어, 응용 프로그램이있을 것으로 기대가있는 경우에 파일 이름을 입력하면 오류 메시지를 반환가 포함된 파일을 찾을 수없습니다, 다음을 시도해주는 것이 파일의 이름과 같은 notlikely % x % x.txt. 오류가 발생하는 경우 메시지를 함께 줄의 "notlikely12fd234104587.txt를 찾을 수없습니다"를 선택한 다음 바로 찾을 수있는 형식 문자열 취약점을해야합니다. 이것은 분명히 다소 언어 - 종속; 패스의 서식을 지정해야합니다에 의해 사용되는 언어를 사용하고 최소한의 구현합니다. 그러나, 이후 많은 언어를 실행 시간은 구현되어 c / c + +, 원하는 될 현명한를 보낼 수도에서 c / c + + 서식 문자열 명령을 감지할 경우가 귀하의 기본 라이브러리는 위험한 취약점을합니다. 이 경우에 응용 프로그램은 웹 기반과 에코의 사용자 입력을 위로하면, 또 다른 우려는 크로스 - 사이트 스크립팅 공격 들어 죄다음과 같은 항목이 일반적인 취약점과 취약성 (5467)에서 http:// cve.mitre.org의 예로는 sql 주입합니다. 이가 운데 188 5467 항목을 참조 형식 문자열, 이것은 단순한 샘플링합니다. 5467 - 2000에서 0573 사이부터 5467 설명 : "lreply 기능은 우 - 매뉴얼 번역 2.6.0 및 이전이 제대로되지 않는다 깨끗케 an 신뢰할 수없는 형식 문자열,이를 통해 원격의 공격자를 실행하기 위해이 사이트를 통해 임의의 명령을 실행 명령입니다." 이번이 첫 공개적으로 알려진 악용을 포맷 문자열 버그가있습니다. 게시물의 제목을 끄기 밑줄의 심각은이 문제를 : "제공 * 원격 * 루트 이후 적어도 1994입니다." 5467 - 2000에서 0844 사이부터 5467 설명 : "일부 기능을 구현하는 로케일 서브 시스템에 유닉스를 제대로 청소하지 않는 사용자 - 투여 형식 문자열, 로컬의 공격자를 실행하는 것을 허용하는 등의 기능을 통해 임의의 명령이 c와 catopen." 의 전체 텍스트를 원래의 자문에서 찾을 수있습니다 www.securityfocus.com/archive/1/80154, 그리고이 문제는 특히 흥미로운하기 때문에 영향을 미치는 핵심 시스템 api에 대한 대부분의 유닉스 변종 (비롯한 리눅스)를 제외하고는 bsd 변종으로 인해 는 사실을 nlspath 변수가 무시에 대한 권한이 suid 응용 프로그램에 bsd입니다. 이 자문과 같은 많은 핵심 sdi 자문은 특히 잘 쓰여진하고 유익한 정보를 제공 아주 철저한 해명의 전반적인 문제를 상환 단계의 첫 번째 단계는 절대 통과 사용자 입력을 직접적으로 서식 기능, 또한 반드시 이렇게 언제 매 수준의 처리를 포맷 출력합니다. 로 추가 참고 사항, 서식 기능이 상당한 오버헤드가있습니다. 보라의 소스에 대한 _output 경우를 작성하는 데 관심 - 것이 편리합니다 : fprintf (stdout, buf); 앞의 라인의 코드가 아니라 위험하다, 그러나 또한 여분의 cpu 사이클이 많이 소모됩니다. 두 번째 단계를 취할의 형식 문자열을 보장하는 방법은 귀하의 응용 프로그램이 사용됩니다에서만 읽을 신뢰할 수있는 환경을하고있는 경로가 문자열을 수 없다는 공격자에 의해 제어된다. 유닉스와 리눅스에 대한 코드를 작성하는 경우, 다음의 예제는 bsd 변종을 외면한 nlspath 변수를 지정하는 데 사용할 수있습니다 파일을 사용에 대한 현지화된 메시지, 국방의 깊이를 제공할 수있다는 일부입니다. c / c + + 상환그것이보다 훨씬 더 많은가 없다 : printf ( "%의", user_input);여분의 방어 대책 을 확인하고 한도의 로케일로 유효 값입니다. (더 자세한 정보를 볼 데이비드 짐수레꾼의 "쓰는 것이 안전 : 형식 문자열과 로케일 필터링"에 나와있는 "다른 리소스"섹션 아래). printf - 제품군의 기능을 사용하지 마십시오 피할 수있는 경우가있습니다. 예를 들어, c + +를 사용하는 경우, 사용 스트림 연산자를 대신 : # 포함)기타 리소스
이것은 문서들 의해 hendra 독아를
|
|||
|