SYSTEM] Race Condition Attack

woounnan·2020년 6월 2일
1

skills

목록 보기
37/39
post-thumbnail

Outline

레이스 컨디션 어택은 이미 알고 있는 취약점이지만, 이번에 팀 스터디를 하면서 관련된 내용을 접하게 되었고
복습 겸 그 때 몰랐던 내용을 추가적으로 찾아서 정리한다.


Race Condition Attack

경쟁 조건 공격둘 이상의 프로세스(리소스를 사용하는 주체)가 하나의 리소스에 사전 협의 없이 동시에 접근 가능할 때, 상호 간에 리소스의 현재 정보에 대해 동기화가 되지 않아 발생하는 취약점이다.

이 취약점에는 임시파일이라는 키워드가 부속으로 따라붙는데, 임시파일을 사용하는 환경에서 유용히 사용될 수 있기 때문이다.

다음과 같은 사정을 가정해본다.

실행 중에만 중요한 리소스를 임시로 생성한 후에 사용이 끝난 후 바로 삭제하는 프로그램이 있다.

실행 중에만 존재하는 리소스이므로 공격자는 이 프로그램에 접근할 방법이 없다고 생각할 수 있지만 앞서 말한 경쟁 조건을 이용해서 해당 리소스에 접근할 수 있다.

이 취약한 프로그램을 실행을 시킨 후에, 동시에 그 리소스를 읽는 공격자의 코드를 실행한다면?

타이밍이 일치하여 삭제 전에 리소스에 접근하는 코드가 실행됐다면, 리소스의 내용이 공격자에게 유출될 것이다.

🎃Examples

Basic - cpp

먼저 가장 흔하게 접하는 C언어의 기본 레이스 컨디션에 취약한 프로그램 코드이다.
당연히 관리자의 setuid가 적용되어 있다.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>

int main(int argc, char *argv[])
{
    struct stat st;
    FILE *fp;

    if (access("temp", F_OK | W_OK) == 0)
        remove("temp");

    if ((fp = fopen("temp", "a")) == NULL)
    {
        fprintf(stderr, "Can't open file.");
        exit(EXIT_FAILURE);
    }

    fprintf(fp, "%s\n", "race condition!!");
    fprintf(stderr, "Write Success!!!\n");
    fclose(fp);

    remove("temp");
    exit(EXIT_SUCCESS);
}

argv[1]로 전달된 문자열을 temp라는 파일에 write하는데, 그러기 전에 temp라는 파일이 존재한다면 삭제한다.

만약, temp를 삭제하고 fopen으로 temp에 접근하는 이전 시점에 공격자가 temp 파일을 생성할 수 있다면 다음과 같은 순서에 의해서
temp에 원하는 내용을 write 할 수 있다.

remove('temp')

/* Code executed by attacker's program
ln -s /etc/passwd temp
*/

if ((fp = fopen("temp", "a")) == NULL)
{
...
...

temp는 심볼릭 링크 파일이므로 그 대상인 /etc/passwd'race condition!!'이 추가되어 있을 것이다.

#/etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin

race condition!!

CTF - Nebula level 10

https://velog.io/@woounnan/PWNABLE-Nebula-Level-10

Real World

🌭 SunOS sendmail(/bin/mail)

과거 sendmail은 받은 전자우편을 수신자 파일(/var/spool/mail/[receiver])에 저장했었다.

만약 ftp 계정에 대해 메일을 보내는 동작과, /var/spool/mail/ftp 파일을 삭제한 후
ln -s /etc/passwd /var/spool/mail/ftp로 심볼릭 링크를 생성하는 동작을 동시에 실행한다면?

공격자가 전송한 메일 내용이 /etc/passwd에 저장될 것이다.

🍟Solaris 2.x ps(/usr/bin/ps)

Solaris 2.x에서 ps 명령어는 현재 프로세스 목록을 출력해주는데, 이 결과를 /tmp/ps_data로 생성하며 또한 관리자 소유의 setuid로 설정했다고 한다.

만약 setuid를 설정하기 전에 /tmp/ps_data를 삭제하고 ln -s /bin/sh /tmp/ps_data로 심볼릭 링크를 생성한다면?

실행시 관리자 권한의 쉘을 획득할 수 있는 백도어가 생기는 것이다.


References

file:///C:/Users/suij4/Downloads/ASEC2002[race_condition].pdf

https://www.lazenca.net/display/TEC/09.Race+condition

0개의 댓글