SYSTEM] Race Condition Attack

woounnan·2020년 6월 2일

skills

목록 보기
36/37
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

profile

0개의 댓글